Artifactory CI管道中的Docker注册表和容器生命周期

以前的博客文章我们讨论了持续集成(CI)过程对docker映像的重要性以及如何设置私有Docker注册表在Artifactory支持一个推广渠道。构型看起来有点像这样:

artifactorydockerpipeline

这张照片里有一个詹金斯CI管家。我们常说,你应该建立和提升你的通过自动化的Docker容器但这到底是什么样子的呢?在这篇文章中,我将概述建立一个健壮的Docker管道来开发的核心原则确保docker映像的自动释放一个安全的生产Docker注册表.在以后的文章中,我将讨论Jenkins pipeline中使用Jenkins Artifactory Plugin的实现。当然,詹金斯并不是你唯一可以宣传的对象。任何可以调用REST API的工具,无论是像Jenkins、Bamboo、Travis这样的CI工具,还是像Ansible、Chef或Puppet这样的编排工具,都可以从一个Docker注册表升级到另一个。

层的分离

以下是你在设置管道时应该遵循的一些原则:

  1. 任何Docker映像/标记都不能在未经过构建时测试的情况下到达生产Docker注册中心。
  2. 部署的应用程序应该使用Docker运行。
  3. 尽管如此,我们仍然想要一个生命周期,它允许我们轻松地更新Docker映像的基本层以接收安全更新。

要做到这一点,我们应该把Docker映像看作包含两组层,每一组都可能有多个层。第一组层是框架层,我的应用程序安装在该层之上,第二组层是安装和配置应用程序的层。

ourlayers736

例如,我可能正在运行一个应用程序,它是tomcat上的.war文件。框架映像将是一个基本操作系统映像(例如ubuntu:trusty),然后在此基础上安装JDK和Tomcat。这将被称为“框架映像”(当然,在本例中,我可以只使用基本的Tomcat Docker容器,但重点是展示如何根据您的需要构建框架层)。

在此之上,我们添加了“应用层”。在本例中,我们只需添加WAR文件和创建“应用程序映像”所需的任何配置文件。

框架层

框架映像是找到大多数安全更新的地方。您希望定期更新,但也希望确保安全更新不会破坏构建。因为在将此映像注入应用程序开发管道之前必须对其进行测试,因此关键的方面是您拥有它。根据我们的经验,在用于应用程序安装之前,通常至少要对映像进行一些小的修改,但即使您除了测试它的工作之外没有做任何更改,也要拥有它!这将为框架映像创建最小的dockerfile:

yourorg-docker-dev.jfrog.io /ubuntu:值得信赖的维护人员@yourorgcom

在这种情况下,我们所做的就是把它从docker-dev虚拟Docker注册表,它将反过来检索官方Ubuntu映像的最新标记来自Docker Hub,然后我们可以添加一个所有权标签(所以有人知道打电话询问测试过程),并将它推送到本地Docker注册表,作为属于你的,然后测试它并将它提升到Docker -prod注册表。

应用层

应用程序的映像如下所示:

从yourorg-docker -刺激.jfrog.io /项目/框架:最新维护人员you@yourorg.com添加https://yourorg.jfrog.io/yourorg/java-暂存——/…/ app - [释放]。战争/var/lib/tomcat7/webapps/app.war

因此,在这种情况下,我从生产Docker注册表中获得了“prod批准的”框架Docker容器,并使用Artifactory的RELEASE关键字将我最新的“可发布”WAR文件添加到staging目录中。这是最新的已知的好因为我不知道它是否是好的,直到它已经在其生产环境中测试(在这种情况下,我的Docker容器在一个“已知的好”框架中)。

在测试框架时,我可能会使用类似这样的dockerfile:

从yourorg-docker -dev.jfrog.io /项目/框架:最新维护者you@yourorg.com添加https://yourorg.jfrog.io/yourorg/java-释放——/…/ app - [释放]。战争/var/lib/tomcat7/webapps/app.war

这是完全相同的,除了我们使用的是开发版本的框架,在它被批准(因为这是验收测试)之前从开发Docker注册表中提取出来的,以及WAR的最后一个已知的良好发布版本。所以我们的推广渠道是这样的:

管道

三明治吗?

这个升级管道实现了一种三明治测试方法,同时结合了应用程序的自顶向下测试和框架的自底向上测试。通过拥有独立的框架与应用程序的测试和生产管道,您不仅有机会重用框架,而且还将安全更新问题与应用程序开发分离开来。

当我们想要更新框架时,我们就会触发框架管道,也就是说,只要有一个安全补丁;或者b.)需要更改框架的基础架构组件或它们的配置。在这种情况下,这意味着每当ubuntu:trusty更新时,或者每当我们想要使用新的JDK或Tomcat版本时,或者当我们出于某种原因需要更改dockerfile时。当有更新的框架映像发布到生产Docker注册表时,或者当应用程序中有代码更改时,我们会触发应用程序管道。

有了这些触发器,唯一可以“冻结”CI/CD过程的事情——也就是说,中断开发,因为它们是相互依赖的,所以需要手动干预,而不是修复一个管道中的代码——是如果基础设施发生更改,需要更改不向后兼容的代码。也就是说,在应用程序级别上为适应基础设施更改而进行的代码更改不会在旧的基础设施上运行,而旧的代码也不会在新的基础设施上运行。我不会说这种情况从未发生过,但对于支持良好的框架来说,这是现代世界中相当罕见的边缘情况。当它确实发生时,您将需要手动将WAR文件或框架构建提升到发布状态,以“启动这个CI/CD过程的泵”(当然是在您第一次运行时)。

这就是模式。在以后的文章中,我们将讨论更详细的实现使用Jenkins pipeline来管理Docker注册表之间的镜像流。

你准备好了吗开始使用Artifactory管理容器的生命周期?