自信地将Docker投入生产
如今,许多开发软件的组织都以这样或那样的方式使用Docker。如果你去参加任何软件开发或DevOps会议,问一大群人“谁使用Docker?”,房间里的大多数人都会举手。但如果你现在问大家,“谁在用Docker在生产吗?,大多数人的手会立刻掉下来。为什么如此流行的技术,享受了飞速发展,在开发的早期阶段被广泛使用,但很少在生产中使用?
软件质量:经过开发人员测试,运营人员批准
一个典型的软件交付管道看起来就像这样(已经有十多年了!)
来源:Huttermann,迈克尔。敏捷ALM.纽约庇护所岛:曼宁,2012。打印。
在管道中的每个阶段,都要测试具有代表性的构建,并且该构建的二进制结果只能通过下一个阶段,前提是它通过了相关质量检验关的所有标准。通过提升原始二进制文件,我们可以保证在CI服务器中构建的相同二进制文件是部署或分发的。通过实施严格的质量检验关,我们保证了对未测试、测试和生产准备工件的访问控制。
的难以忍受的轻
码头工人建立美元
由于运行Docker构建是如此简单,而不是构建通过质量闸门进入下一个阶段……
每一阶段都要重建。
“那又怎样,”你说?所以很多。让我们看一个典型的构建脚本。
要构建您的产品,您需要一组依赖项,构建通常会下载您需要的每个依赖项的最新版本。但由于开发管道的每个阶段都是在不同的时间构建的,……
您不能确保开发版本中每个依赖项的相同版本也进入了您的生产版本。
但我们可以解决这个问题。让我们使用:
从ubuntu: 14.04.
完成了。
还是我们?
我们能确定在开发阶段下载的Ubuntu 14.04版本和生产版本完全一样吗?不,我们不能。安全补丁或其他不影响版本号的更改呢?但等;有一个办法。让我们使用图像的指纹。那是坚如磐石!我们将把基本图像指定为:
从ubuntu: 0 bf3461984f2fb18d237995e81faa657aff260a52a795367e6725f0617f7a56c
但是,那个版本是什么来着?它比我上周用的那个旧还是新?
你懂的。使用指纹既不可读也不可维护,最后,没有人真正知道Docker映像中包含了什么。
dockerfile的其余部分呢?其中大部分只是一堆隐式或显式的依赖关系解析,或者以apt-get,或wget从任意位置下载文件的命令。对于某些命令,您可以确定版本,但对于其他命令,您甚至不确定它们是否进行依赖性解析!那么传递依赖性呢?
所以结果是这样的:

基本上,通过在管道中的每个阶段重新构建Docker映像,您实际上是在更改它,因此您不能确定通过所有质量检验关的映像就是进入生产的映像.
停止重建,开始推广
我们应该做的是进行开发构建,而不是在每个阶段重建形象,我们应该促进它,将其作为通过质量闸门进入生产的不可改变和稳定的二进制。

听起来不错。让我们用Docker来做。
等等,别这么快。
Docker标签是一个累赘
Docker标签是这样的:
Docker标记将每个主机限制为一个注册表。
如果只能使用一个注册表,如何建立推广渠道?
“我会提倡使用标签,”你说。“那样我只需要一个码头工人注册中心每个主机。”当然,在某种程度上,这是可行的。Docker标签(普通键:值属性)可能是通过小质量门来提升图像的一种公平的解决方案,但它们是否足够强大,能够保护您的生产部署?考虑到你不能管理标签上的权限,可能不会。这房子叫什么名字?QA更新了吗?开发人员仍然可以访问(并更改)发布候选版本吗?问题还没完没了。相反,让我们看看一个更健壮的解决方案的推广。毕竟,我们已经与Artifactory合作多年了。
虚拟存储库的试验是正确的
从1.0版本开始,Artifactory中就有了虚拟存储库。最近,我们还添加了to的功能将工件部署到虚拟存储库.这意味着虚拟存储库可以作为Docker映像的上传和下载的单一入口点。是这样的:
下面是我们要做的:
- 将我们的构建部署到一个虚拟存储库中,作为我们的开发Docker注册表
- 通过管道促进Artifactory内部的构建
- 从相同的(甚至不同的)虚拟存储库中解析生产准备映像,现在充当我们的生产Docker注册表
它是这样运作的:
我们的开发人员(或Jenkins)使用封装了本地开发存储库、本地生产存储库和代理的远程存储库的虚拟存储库码头工人中心(作为管道中的第一步,我们的开发人员可能需要访问码头工人中心为了创造我们的形象)。一旦我们的映像构建好了,它就会通过docker-virtual库docker-dev-local.

现在,詹金斯再次介入,通过生产线提升我们的形象。

在过程中的任何一步,您都可以将Docker客户机指向任何中间存储库,并在推广到生产之前提取映像进行测试或登台。
一旦Docker映像投入生产,就可以通过充当生产Docker注册中心的另一个虚拟存储库向客户公开它。您不希望客户访问您的开发注册中心或管道中的任何其他注册中心。只有生产Docker注册表。不需要任何其他存储库,因为与其他包格式不同,docker映像的要点在于它拥有所需的一切。

我们已经做到了。我们构建了一个Docker映像,通过所有测试和分期阶段对它进行了推广,一旦它通过了所有的质量门槛,就完全相同的图片我们在开发中创建的图像现在可由最终用户下载或部署到生产服务器,没有接收非策划图像的风险。
设置呢?
您可能会问,让Docker与Artifactory中的所有这些存储库一起工作是否容易设置?现在有了我们的新反向代理配置生成器.坚持使用Artifactory和NGINX或Apache,您可以轻松访问所有的Docker注册表,开始将Docker映像推广到生产环境。
