2015-01-12 46 views
13

在持续交付管道中使用Docker的最佳方式是什么?如何在连续交付中最好地使用Docker?

应该构建人工制品是一个码头工人形象,而不是一个JAR /战争?如果是这样,那将如何工作 - 我正在努力研究如何在开发中(在笔记本电脑上)无缝使用Docker,然后让CI服务器使用相同的基本映像来构建artefact。

+2

Codeship写了一篇关于这个问题的好文章:https://blog.codeship.com/continuous-integration-and-delivery-with-docker/ –

回答

11

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

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

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

+1

[Fig](http://www.fig.sh)已弃用,不应再使用。它被替换为[docker-compose](https://www.docker.com/docker-compose)。 – h3nrik

2

是的,你应该从jar/war文件转移到图像作为你的构建文物。 @wassgren描述应该很好地工作的方法,但是我发现下面以更好地满足我们的使用情况,特别是对发展:

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

2 - 在开发过程中,用无花果在本地打开您的容器(S)和安装你的开发代码,以正确的位置。 Fig使用myjava基础镜像,并不关心Dockerfile。

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

2

简单的步骤。

1)在一个容器中

2)安装在同一个容器框架工具安装詹金斯。(我使用SBT)。

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

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

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

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

7)现在我们有我们的build.tgz及其环境满意。这个图像应该被推入注册表。这是我们的最终形象。它是可移植的,可以在任何地方部署。

8)该最终图像可以保持必要mountppoints在容器上获得输出和一个脚本(script.sh)可以通过在dockerfile提入口点命令来触发。 9)这个script.sh将在图像中(基本图像),并将被配置为根据我们的目的做事。

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

重要提示:

的图像创建每次您构建并存储在注册表中。 因此这可以被重用。这个图像可以被推送到主生产服务器并且可以被触发。 这有助于每次维护一个干净的环境,因为我们正在使用基础图像。