开拓同学通过git push上传代码,经Git和Jenkins合营,自动完成程序支配、发布,全程无需运维职员参与。

这是一种真正的容器级的实现,这个带来的好处,不仅仅是效率的提升,更是一种变革:

开拓职员第一次真正为自己的代码卖力——终于可以跳过运维和测试部门,自主掩护运行环境(首先是测试/开拓环境)

dockerphp持续集成最佳实战Docker连续集成图文详解 CSS

持续支配的技能思路效果展示配置Git和Jenkins联动配置Jenkins自动更新代码效果图文详解FAQ

1. 持续支配的技能思路

在本例中,假设我们JAVA项目的名称为hello。
简要的技能思路如下

本案例中假设代码托管在git.oschina.com上,Jenkins和Docker Registry(类似于yum源)各运行在一个Docker容器中。
JAVA项目自己也单独运行在一个叫hello的容器中。

本文采纳的持续支配方案,是从私有的Docker Reistry拉取代码。
有些变通的方案,把代码放在宿主机上,让容器通过卷组映射来读取。
这种方法不建议的缘故原由是,将代码拆分出容器,这违背了Docker的集装箱原则:

这也导致装卸繁芜度增加。
从货运工人角度考虑,整体才是最经济的。
这样,也才能实现真正意义的容器级迁移。

或者说,容器时期,抛弃过去文件分发的思想,才是正途。
本文末了的问答环节对此有更多阐述。

容器即进程。
我们采取上述方案做Docker持续支配的缘故原由和意义,也在于此。
容器的生命周期,该当远远短于虚拟机,容器涌现问题,该当是立即杀掉,而不是试图规复

2. 效果展示

本文末了实现的效果,究竟有多惊艳呢?且看如下的演示。

2.1 程序代码更新前的效果

我们以韶光戳来简洁、显式的表述程序更新情形。

2.2 提交程序代码更新

本例中,我们把首页的韶光戳从201506181750,修正为201506191410(见如下)

2.3 上传新代码到Git

顺序实行如下操作,输入精确的git账号密码

然后呢?

然后什么都不用做了。
端杯茶(如果不喜好咖啡的话),悄悄地等待自动支配的发生, 察看犹豫一系列被自动触发的过程,机器人似的运转起来(请容稍候再加以描述)。

为什么须要3~5分钟?只是由于本案例中的JAVA项目,须要从国外download Maven程序包,以供Jenkins调用和编译JAVA。
正式运用环境中,可以把Maven源放在海内或机房。
如果仅仅须要对PHP项目做持续支配,那就更快捷了

2.4 查看代码更新后的效果

在悄悄地等待几分钟后,新的代码确实已经自动支配完毕

3. 配置Git和Jenkins联动

3.1 Jenkins配置Git源

Jenkins中新建项目java-app,并配置从Git拉取程序代码。
详细如下:

3.2 Jenkins配置远程构建

Jenkins中配置token,以供git远程调用时利用

3.3 Git开启钩子

怎么让Git在吸收到用户更新的代码后,把和任务通报给Jenkins呢?这借助于Git的hook功能,配置起来也非常大略,如下

4. 配置Jenkins自动更新代码

Jekins在吸收到Git通报过来的后,再触发一个远程构建(到目标做事器),按照预定义的任务列表,实行一系列的事情,重修容器等。
详见如下:

我们把个中最关键的Shell脚本内容摘抄出来

1)Jenkins会自动冒出来一个构建任务

2)利用maven BUILD 新的hello项目包

3)然后重修Maven容器,构建新的Image并Push到Docker私有库中

4)重新把Docker容器拉起来

6. FAQ

问题1:采取这么相对繁芜的办法(而不是把更新代码放在宿主机然后卷组映射),是由于项目基于JAVA么;是否PHP项目就可以采取更新代码放在宿主机然后卷组映射这种办法?

回答1:将代码拆分出容器,违背了集装箱原则。
导致装卸繁芜度增加。
从货运工人角度考虑,整体才是最经济的。
统统版本化。
抛弃过去的文件分发。
这是正途。
至于文件大小,大的war包也就50M或100M,在现有网络下不成问题,性能问题最好优化。
其余建议关注docker 2 docker,p2p传输

问题2:如果整体代码超过500m或者1g以上,整体集装箱是否就不太好了?如果容器与代码分离,镜像就100m旁边(2层,base+做事),然后代码的话,是放到共享存储里,每个代码有更新,比如svn的代码,可以直接在共享存储里进行svn update就可以掌握版本

问题3:如果测试环境利用您供应的完全集装箱做事还行,但在生产环境,集群里运行docker做运用,如果每个容器都是有完全的代码,是否有点臃肿,不如每个集群节点里就运行根本做事镜像,通过卷组功能绑定共享存储里的代码,加上Crontab、Python和Shell脚本,这样每次代码更新就1次就行了

回答3:环境同等性,在过去从来没有办理好。
10年前我们做paas时,和这个做法类似。
不是说不好,时期变了,用脚本东拼西凑,究竟难有好的系统。
不能只考虑现在的方便,容器技能和vm如果类比,我以为会让自己下决定时很纠结

补充3:脚本一样平常是范例的运维工程师思维,quick & dirty。
一样平常很难做成一个产品或者系统。
整体考虑和扩展性考虑都比较少。
现在做docker的难点在于到底怎么看待它。
到底是拿它做调度的基本单位,还是支配的基本单位考虑清楚,再聊方案