如何利用容器构建持续交付/持续发布系统?

讲师介绍  
张春源

希云技术总监

 
 
概述

  
 

提到软件发布确实是很令人头疼的一个过程,且还是高风险动作。借用一句话:“99%的故障是由于变更引起的”。本次分享内容着重介绍使用容器技术实现自动化构建、部署和测试过程,并使得开发、测试、运维之间能更好的协作,最终可以在几个小时甚至几分钟的时间,实现可重复,且可靠的软件发布系统。

 

常见场景  
 

  • 在开发测试环境中测试均没有问题,但上生产环境的时候会有问题。即使我们在开发测试环境中部署上万遍没问题,但从来没有在生产环境中部署过一次,每到在新版本发布时,大家不仅要加班,而且都还很紧张。如果没有很好的回滚策略,即使发布成功了心还是悬着。
  • 移动互联网飞速发展,业务要求敏捷,要在很短的时间完成从开发到上线的任务。很多企业从开发到上生产的周期都要花好几个月的时间完成,现有IT架构跟不上业务发展。
  • 软件项目开发完成后,要将开发好的版本交付到客户的环境中。目前常见的做法是按照长长的安装文档,且是通过手动安装完成,此种模式不仅对安装实施人员的要求高,且出错几率很高。

 

构建持续交付/持续发布系统需要考虑  
 

1、环境管理

 

环境包括硬件和软件,对于软件环境一定要能对硬件解耦,这样即使在硬件坏的情况下可以在很短的时间内将软件环境部署到新的硬件上。除此之外,好的环境管理方式能有效降低在生产环境中部署的风险。
 

实践推荐:环境的管理在项目开始的时候,开发团队和运维团队就应该全面合作,后面的事情就会变的很容易。

 

 

2、组件和依赖管理

 

很多系统都是由多个组件组合起来对外提供服务。组件内部要依赖库文件,组件之间也有复杂的依赖关系。一套复杂的系统部署起来依赖的处理是非常重要的。组件以及依赖关系的更新,要能以增量的形式进行,并形成不同的版本。
 

3、配置管理

 

配置管理记录了项目演进的过程。好的配置管理系统在非常短的时间内能创建出任何的环境;批量更新线上系统的配置信息且能保证更新失败回退到能正常运行的版本;不仅能满足本部门的需求同样也能满足其他部门的需求,以及不同环境之间的需求。
 

4、版本管理

 

在持续交付和持续发布的过程中,任何一个细节都应被记录(操作系统,中间件,代码,配置文件,依赖信息等),并且形成版本。
 

小提示:程序中不要把在不同环境部署时变化的参数写死,推荐使用名称。如:连接外部数据库地址、用户、密码等信息。 
 

5、持续交付管理

 

在交付的过程中,任何原因都有可能导致部署失败。失败不可怕,可怕的是不知道怎么失败的。明枪易躲暗箭难防道理让我们明白,软件项目的交付要复杂的多,所以建设持续交付系统一定要建立可重复且可靠的部署流水线,较完善的配置管理系统,以及操作审计系统。问题越早发现修复起来的成本越低,且更好地保证成功的发布上线。
 

为何选择使用容器  
 

以Docker为代表的容器技术,在短短的时间内发展迅速。容器技术早在2008年已经出现,Docker公司厉害的是提供了将软件运行环境整体打包的技术-镜像。

 

现实中很多不标准化的交付,使用镜像都可以实现标准化。标准化以后可以更好的实现自动化,并且能更好的促进上游和下游的发展。如:开发、测试、运维之间能更好的协助,践行DevOps文化。

 

持续交付  
 

原则:可重复、可靠;自动化;版本控制;团队责任。

 

1、可重复、可靠

 

镜像将软件的运行环境以及软件代码打包起来,我们可以基于同一个镜像在不同的环境中生成一模一样的环境。因为容器就是进程,所以一个容器中推荐只运行一个服务。对于企业而言单容器是干不成事的,需要利用编排系统将多个镜像编排起来(镜像/版本、应用配置文件、启动优先级设置、日志处理、数据处理等)形成应用模板。通过应用模板可以重复,且可靠的将应用部署到不同的环境中,实现持续交付第一步。
 

 

2、自动化

 

容器技术在持续集成方面不仅仅解决了CI的问题,并且很好的解决了CD。利用容器实现持续交付区别于传统的做法是,原来开发交付出来的都是软件包和安装部署文档;利用容器技术开发人员交付的是应用模板+镜像,应用模板替代了安装部署文档,镜像技术更可靠的完成了软件包和软件运行环境的交付。并利用CI工具实现了,开发人员提交代码到代码库中,通过钩子可自动触发构建镜像。并可以对镜像以及应用做测试。

 

 

3、版本控制

 

容器要比虚拟机更接近应用层,从叫法上来说虚拟机一般都叫虚拟机,但容器大家都会说是MySQL容器,Tomcat容器。容器更加细化到了应用层。上面我们也都说到了,环境的变更,应用的版本或者是底层操作系统以及库的变更都能做到增量式的版本管理。镜像可以通过Tag来实现版本的管理,应用模板、配置文件、依赖关系等信息同样在企业实际应用中应严格要求通过版本来进行管理。
 

 

4、团队责任

 

DevOps不是一种工具,是一种文化。整个持续交付流程能顺利的建立起来,仅依靠一个人或一个部门基本上建立不起来。在我们给中英人寿保险有限公司利用容器建立持续交付系统的过程深刻的感受到,需要让实际业务团队共同的参与,才真正能最大化容器的优势。容器技术是比较先进,但业务不关心先进性,重点看实际效果。所以DevOps不是个人运维或者开发人员的责任,必须是团队的责任。
 

利用容器实现的交付流水线:

 

持续发布  
 

一切皆模板,服务于应用!

 

 

基于容器实现持续发布系统如下:

 

 

注解:

  1. 开发人员将代码提交至代码仓库
  2. 通过钩子自动触发构建镜像流程
  3. 镜像构建完成后,push到镜像仓库Registry
  4. 有新版本进行生成,自动触发部署流程,部署至测试环境
  5. 测试工作完成后,标记镜像状态为成功,自动触发部署至准生产环境
  6. 准生产环境测试完成后,可自动或半自动部署业务

 

Q&A  
 

Q1:国内代码提交,担心代码泄露,这个问题有考虑怎么解决吗?

A1:代码存放到企业私有代码库中。

 

Q2:张老师好,镜像比较大时,部署怎么解决速度问题?

A2:镜像大有几种原因:1.base镜像大;2.安装的软件没清除;3.构建镜像时下载软件用wget,不用add,这几步做好镜像大小能控制住。另外镜像要规划好,利用好镜像的分层技术。

 

Q3:构建镜像时,wget和add的区别?为什么用wget?

A3: 每条Dockerfile会生成一层,镜像是只读的。如使用add来下载软件包,然后在安装,软件包删除不了,处于不同层!使用RUN可以用wget下载后,安装,再删除,是同一层执行的操作!

原文发布时间为:2016-11-30

时间: 2024-10-28 15:12:46

如何利用容器构建持续交付/持续发布系统?的相关文章

构建网站新闻自动发布系统之一

更新每天新闻内容,对webmaster们来说是一件很头痛的事,首先,收集了大量的新闻资料后,还必须制作大量的网页,每天大大小小的国际新闻,国内新闻,IT新闻,可真够你累的.最致命的一点,这些松散的新闻是管理不了的,不能查询,不能在线动态删改,新闻讲求时效性,当你作好网页然后上传到服务器上的时侯,恐怕别人已早你一步,把新闻报导出来了.当真吃力不讨好,针对现在我们的上网环境,在线发布新闻,动态生成新闻网页,为新闻添加搜索,查找功能是必不可少的. 那么,使用ASP技术如何来实现动态的新闻发布系统呢?而

构建网站新闻自动发布系统之三

(三)把新闻代码插入你的页面 最好的新闻发布,当然是为网站本身定做的,那样才能与主页风格一致,但如此一来,新闻发布系统有缺乏了通用性了,不能移值到别的网站上使用,有得必有失,在这个基础上关键是找一个平行点.综合来考滤,最好的做法是与页面分离,那样就可以不影响网页的外观,而也能达到很好的效果,在使用新闻的网页上我们可以通过放置一条这样的script语句来调用新闻代码 <script language="JavaScript" src="http//xxx.com.cn/s

构建网站新闻自动发布系统之二

(二)添加和管理每天的新闻内容 当进行了新闻提交后,则交由一个名为addnew.asp的asp程序来对新闻内容进行处理,以便分类和保存,为了显示清析,我们每提交一条新闻,下面的那个新闻内容库就重新读入,以便可以查看新闻是否能成功加入都数据库中,也可以放便地删除新闻内容. 现在看看addnew.asp是如何完成程序处理的. <% @language="vbscript" %> <% response.buffer=true Response.Expires=0 '保存数

基于Docker的Jenkins持续交付实践

讲师介绍  叶峰 有容云资深前端开发工程师   现负责有容云容器云平台Web架构设计和CI(持续集成)产品的研发 拥有丰富的Web前端开发经验.   主题简介: Jenkins pipeline基础概念 Jenkins pipeline如何带来工作便利 基于容器的Jenkins CI流程 Jenkins.Docker.Kubernetes整合的集成部署   传统交付方案   传统我们的项目开发模式是产品调研提出需求,开发团队研究决定开发方案选型.然后开始一个周期的开发,模块开发完成之后开始模块间

从代码到上线, 云端Docker化持续交付实践

关于分享者: 罗晶,花名瑶靖.在加入阿里云之前,先后在支付宝平台数据技术事业群.百度基础架构部任职.现主要负责阿里云容器服务产品的集群管理系统的研发,从事容器的持续交付.持续集成的方案设计与实现. 演讲内容架构 大话持续交付 持续交付的前世 容器化DevOps 持续交付的今生 演讲主要内容 持续集成指的是,频繁地(一天多次)将代码集成到主干.持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量.它的核心措施是,代码集成到主干之前,必须通过自动化测试.只要有一个测试用例失败,就不能集成. 持

谈谈持续集成,持续交付,持续部署之间的区别

经常会听到持续集成,持续交付,持续部署,三者究竟是什么,有何联系和区别呢? 假如把开发工作流程分为以下几个阶段: 编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署 正如你在上图中看到,「持续集成(Continuous Integration)」.「持续交付(Continuous Delivery)」和「持续部署(Continuous Deployment)」有着不同的软件自动化交付周期. 持续集成 持续集成是指软件个人研发的部分向软件整体部分交付,频繁进行集成

什么是持续集成?持续交付?持续部署?

作者: 阮一峰 互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI). 本文简要介绍持续集成的概念和做法. 一.概念 持续集成指的是,频繁地(一天多次)将代码集成到主干. 它的好处主要有两个. (1)快速发现错误.每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易. (2)防止分支大幅偏离主干.如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成. 持续集成的目的,就是让产品可

微服务、容器与持续交付

本文件的是微服务.容器与持续交付[编者的话]就像木炭.火硝和硫磺遇到了一起.当微服务.容器和持续交付遇到了一起,这注定会掀起一场变革. 微服务 如果非要给微服务找一个理由,单一职责就足够了.我们把因相同原因而变化的东西聚合到一起,而把因不同原因而变化的东西分离开.我们称之为单一职责原则SRP. 尤其是大型和长期运营的项目群,随着时间的推移,需求一定是不断增加和变更的.但我们不希望掉进"焦油坑".我们希望我们的项目群是符合"开闭原则"的.在某个时期我们寄希望于一个统一

针对持续交付管理构建作业

对于不断演进中的产品,持续交付(CD)使其开发到产品交付的过程更加简单.持续集成(CI)位 于持续交付过程的开始阶段,它扮演了这个过程中的重要角色,由它定义软件开发过程. 在书 上和网上可以查到很多持续集成工具的资料,但处于持续集成过程中核心的构建作业却没有太多资料. 典型的持续集成过程如下:开发人员在他们自己的机器上手工构建和测试源代码.然后他们会 把修改提交到一个源码控制管理系统.随后构建工具将运行作业编译和测试这些代码.然后把构建的工 件上传到一个中心资源库,用于接下来的开发和测试. 因此