如何在持续交付中最好地使用Docker?

时间:2015-01-12 20:29:18

标签: continuous-integration docker

在Continuous Delivery管道中使用Docker的最佳方法是什么?

构建人工制品应该是Docker Image而不是Jar / War吗?如果是这样,那将是如何工作的 - 我正在努力研究如何在开发中(在笔记本电脑上)无缝地使用Docker,然后让CI服务器使用相同的基本映像来构建工件。

4 个答案:

答案 0 :(得分:12)

当然,有多种最佳实践和许多方法可以解决这个问题。我发现成功的一种方法如下:

  • 将可部署代码(jar / wars等)与独立的VCS-repos中的docker容器分开(我们在最近的项目中使用了两个不同的Git-repos)。这意味着用于部署代码的docker镜像是在单独的步骤中构建的。一个 docker-build 这么说。你可以在这里为您的数据库,应用程序服务器,redis缓存或类似程序构建docker镜像。当您的VCS中的“Dockerfile”或类似内容发生变化时,Jenkins或您使用的任何内容都可以触发docker镜像的构建。应该标记这些图像并将其推送到某个注册表(可能是Docker Hub或某些本地注册表)。
  • 可部署的代码(jar / wars等)应该像往常一样使用Jenkins和commit-hooks构建。在我的一个项目中,我们实际上将Jenkins作为described here在Docker容器中运行。
  • 所有使用动态数据的docker容器(例如数据库的存储,Tomcat / Jetty的war文件或代码库的配置文件)都应将这些文件装载为data volumes or as data volume containers
  • 应根据构建服务器已知的规范设置测试服务器或管道中的任何步骤。我们使用了一个描述符,它将您新建的标记从代码库连接到docker容器上的标记。然后,Jenkins管道插件可以运行一个脚本,该脚本首先将构建工件移动到主机服务器,从本地注册表中提取正确的docker镜像,然后使用数据卷容器启动所有进程(我们使用Fig来管理docker生命周期

通过这种方法,我们还能够将本地进程(数据库等)作为Docker容器运行。这些容器当然基于与生产中相同的图像,也可以在开发机器上开发。本地开发环境和生产环境之间唯一真正的区别是操作系统。开发机器通常运行Mac OS X / Boot2Docker,并在Linux上运行。

答案 1 :(得分:2)

是的,您应该从jar / war文件转换为图像作为构建工件。 @wassgren描述的过程应该运行良好,但我发现以下内容更适合我们的用例,特别是对于开发:

1-制作基本图像。看起来你是一个java商店,举个例子,假装你的基本图像是FROM ubuntu:14.04并安装jdk和一些更常见的库。我们称之为myjava

2-在开发过程中,使用fig在本地调出容器并将您的开发代码安装到正确的位置。 Fig使用myjava基本图像,并不关心Dockerfile。

3-构建项目以进行部署时,它使用Dockerfile,并在某处将COPY代码/构建工件放到正确的位置。然后,该图像被适当标记并部署。

答案 2 :(得分:2)

要遵循的简单步骤。

1)将jenkins安装在容器中

2)在同一容器中安装框架工具。(我使用SBT)。

3)在jenkins中创建一个带有必要插件的项目,以集成来自gitlab的数据,并将所有jar文件构建为压缩格式(例如 build.tgz )。

4)这个build.tgz可以移动到任何地方并被触发,但它应该满足所有的环境依赖性(例如说它需要mysql)。

5)现在我们创建一个基本环境映像(在我们的例子中安装了mysql)。

6)触发每个构建后,我们应该在服务器上触发一个dockerfile,它将build.tgz和环境图像结合起来。

7)现在我们有了build.tgz以及它的环境。这张图片应该被推入注册表。这是我们的最终图片。它是便携式的,可以部署在任何地方。

8)最终图像可以保存在具有必要mountppoints的容器上以获取输出,并且可以通过在dockerfile中提及 entrypoint 命令来触发脚本(script.sh)。

9)此script.sh将位于图像(基本图像)内部,并将根据我们的目的进行配置。

10)在装入此容器之前,您需要停止以前运行的容器。

重要说明:

每次构建时都会创建一个映像,并将其存储在注册表中。 因此可以重复使用。此图像可以推送到主生产服务器并可以触发。 这有助于每次都保持一个干净的环境,因为我们正在使用基本图像。

答案 3 :(得分:1)

您还可以使用Bamboo和Docker创建稳定的CD管道。 Bamboo Docker集成既有构建代理形式,也有应用程序中的捆绑任务。您可能会发现此文章有用:http://blogs.atlassian.com/2015/06/docker-containers-bamboo-winning-continuous-delivery/

您可以使用该任务构建可在其他环境中使用的Docker镜像,也可以将应用程序部署到容器中。

祝你好运!