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

How best to use Docker in continuous delivery?

在持续交付管道中使用 Docker 的最佳方法是什么?

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

嗯,当然有多种最佳实践和许多方法可以做到这一点。我发现成功的一种方法如下:

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

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

上生产 运行

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

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

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

3- 当您构建用于部署的项目时,它会使用 Dockerfile,并在某个地方对 code/build 工件执行 COPY 到正确的位置。然后该图像被适当标记并部署。

遵循简单的步骤。

1)在容器中安装jenkins

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

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

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

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

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

7) 现在我们有了 build.tgz 及其环境 satisfied.This 图像应该被推入 registry.This 是我们的最终 image.It 是可移植的,可以部署在任何地方.

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

9)这个 script.sh 将在图像(基本图像)内,并根据我们的目的进行配置。

10)在构建此容器之前,您需要停止之前的 运行 容器。

重要提示:

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

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

您可以使用该任务构建一个 Docker 映像,您可以在另一个环境中使用该映像或将您的应用程序部署到容器中。

祝你好运!