LOADING

Follow me

【自信发布Docker镜像】Docker生命周期管理【zoues.com】
三月 21, 2017|DockerPaaS

【自信发布Docker镜像】Docker生命周期管理【zoues.com】

【自信发布Docker镜像】Docker生命周期管理【zoues.com】

关注世界领先 DevOps 平台 JFrog


【自信发布Docker镜像】Docker生命周期管理

许多软件开发组织都在以各自的方式使用Docker。如果你去参加软件开发大会或DevOps大会问都有谁在使用Docker,很多人都会举手,但如果你问谁在生产环境使用Docker,只有很少一部分人!为什么发展迅猛的Docker技术很少用在生产环境?

【自信发布Docker镜像】Docker生命周期管理


1

Docker Production问题分析


Docker 镜像构建【 $docker build】

构建一个Docker镜像非常简单,通常我们是在每个阶段重新构建($docker build),而不是在每个阶段传递该镜像文件验证质量,相当于每次从源码(DockerFile)重新构建。让我们来看这样有什么问题:


【自信发布Docker镜像】Docker生命周期管理


1. DockerFile多次构建,性能低

【自信发布Docker镜像】Docker生命周期管理


每次重新构建,重新下载各个依赖,造成不必要的资源浪费。


2. 依赖文件版本不可控

【自信发布Docker镜像】Docker生命周期管理


【自信发布Docker镜像】Docker生命周期管理


构建一个产品,我们需要很多依赖,而且构建一般都会依赖最新版本(Latest version),但实际情况每个依赖的构建并不在同一时间,而且你也不能确保多次构建其依赖使用的版本相同。你可能会说:‘每个依赖加上版本号’,但真的没问题吗? 


大家使用的ubuntu版本大部分是1404 LTS版,你可能会想这个版本是不是一直不变没有更新?其实不是,ubuntu会定期将patch打入这个版本,而使用者无需更新版本,也就是说,pull ubuntu:14.04 结果是会变化的!!!也就是说你的‘Immutable Infrastruacture’ 其实是在变化的。


【自信发布Docker镜像】Docker生命周期管理


另外还有其他依赖,大部分都是一连串隐含或明确的依赖解析,像apt-get和wget。对于一些命令你可以缩小版本依赖范围,也有一些你甚至不能确定他们做了依赖解析,还有传递性依赖!

所以你最终每次构建镜像都可能产生一个完全不一样的镜像,如下图:


3. 版本号可读性、可维护性差

【自信发布Docker镜像】Docker生命周期管理


【自信发布Docker镜像】Docker生命周期管理


可能你会说使用fingerprint可以确定一个版本不会变化,但这样可读性和维护性将变的很差。


4. 新版本迭代复杂度高 

【自信发布Docker镜像】Docker生命周期管理


在产品不断迭代过程中,需要不断修改DockerFile版本号,甚至是各个传递依赖的版本号,提高了复杂度。


2

解决方案


禁止重新构建,使用升级(promotion)的方式

我们应该在流水线每个阶段中升级传递镜像,而不是重新构建,传递一个不可变并且稳定的包通过所有质量关卡直到生产环境,如下:

 

【自信发布Docker镜像】Docker生命周期管理


这样我们获得了一个不可变的基础镜像,我们可以将基础镜像以及产品镜像分成两条流水线,降低了上层产品迭代的复杂度,只需做上层产品的变化,这样也控制了依赖版本等环境的变化,同时这样也符合immutable infrastructure的理念。


3

那么如何进行升级(Promotion)?


我们知道Docker tag 限制我们每个host只能有一个注册中心,如下图: 


【自信发布Docker镜像】Docker生命周期管理


你可能会说,1.6版本之后支持label(key:value),可以自定义属性到镜像。没错你可以这样做,但是试想一下,你可能无法控制权限到label,如何定义label规则,如何维护更新这些label,如何限制开发人员不能在修改预发布版本等等问题。


4

多仓库管理


我们需要开发仓库以及发布仓库,并且对外访问通过虚拟仓库来统一接口访问,如下图:


【自信发布Docker镜像】Docker生命周期管理


  1. 开发人员发布镜像到虚拟仓库,默认传递请求到开发仓库docker-dev-local

  2. 经过jenkins pipeline流水线测试升级镜像到发布仓库docker-prod-local

  3. 开发人员解析从虚拟仓库解析基础镜像,从一个仓库获得开发镜像,发布镜像以及第三方源镜像

  4. 另外权限控制在仓库级别,如上图中docker-dev-local,docker-prod-local

 

如果只希望某些终端用户只能访问发布库中的镜像,可以再增加一个发布的虚拟仓库,最终我们得到:


【自信发布Docker镜像】Docker生命周期管理



5

软件质量保证:开发测试,运维批准



附一个经典的集成发布(CI/CD)流程,如图:


【自信发布Docker镜像】Docker生命周期管理


如上图,在这个流水线中的每个阶段,构建经过一些列标准测试后,构建产出物才可以进入下一阶段,值得一提的是,在这个过程中,我们升级传递的是二进制包(在第一个阶段构建产生),这样可以保证我们测试的有效性,而不是每次测试进行重新构建,提高效率,避免依赖版本的不稳定性。


6

总结


我们通过多仓库,开发构建镜像到dev仓库,通过各个阶段的测试,升级到prod仓库,终端用户看到的永远是生产可用的包。


最后附上一个Docker Promotion 实例代码,有兴趣的同学可以实践一下,Jenkins Pipeline:

https://github.com/jfrogtraining/docker-lifecycle-scripts


我们陆续会介绍硅谷的最佳实践,敬请关注!


【自信发布Docker镜像】Docker生命周期管理

关于JFrog

世界领先DevOps平台

公司成立于2008年,在美国、以色列、法国、西班牙,以及中国北京市拥有超过200名员工。JFrog 拥有3000多个付费客户,其中知名公司包括如腾讯、谷歌、思科、Netflix、亚马逊、苹果等。连续两年,JFrog 被德勤评选为50家发展最快的技术公司之一,并被评为硅谷增长最快的私营企业之一。


【自信发布Docker镜像】Docker生命周期管理

点击“阅读原文”,进入Docker Promotion 实例代码

no comments
Share

发表评论