如何在连续交付中使用Docker?

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

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

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

  • 将可部署的代码(jar子/战争等)从Docker容器中分离出来,放在单独的VCS-repos中(我们在最新的项目中使用了两个不同的Git-Repos)。 这意味着您用来部署代码的docker镜像是在一个单独的步骤中构build的。 docker工人 – build立这么说。 在这里,您可以为您的数据库,应用程序服务器,Rediscaching等构buildDocker镜像。 当你的VCS中有一个Dockerfile或者类似的东西改变了,Jenkins或者你使用的任何东西都会触发Docker镜像的构build。 这些图像应该被标记并推送到某个registry(可能是Docker Hub或某个本地registry)。
  • 应该像往常一样使用Jenkins和commit-hook来构build可部署的代码(jar / wars等)。 在我的一个项目中,我们实际上在这里描述的Docker容器中运行Jenkins。
  • 所有使用dynamic数据(如数据库存储,Tomcat / Jetty的war文件或作为代码库一部分的configuration文件)的docker 容器都应该将这些文件作为数据卷或数据卷容器挂载。
  • testing服务器或任何步骤是你的pipe道的一部分,应根据您的生成服务器已知的规范进行设置。 我们使用了一个描述符,将代码库中新build的标签连接到docker容器上的标签。 然后Jenkinspipe道插件可以运行一个脚本,首先将构build工件移动到主机服务器,从本地registry中提取正确的Docker镜像,然后使用数据卷容器启动所有进程(我们使用Fig来pipe理Docker生命周期。

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

是的,你应该从jar / war文件转换为图像作为你的构build文物。 stream程@wassgren描述应该工作得很好,但是我发现以下更适合我们的用例,特别是对于开发:

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

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

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

简单的步骤遵循。

1)将jenkins安装在容器中

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

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

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

5)现在我们创build一个基本的环境图像(在我们的情况下,MySQL安装)。

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

7)现在我们的build.tgz和环境都满意了。这个图像应该被注册到registry中。这是我们的最终形象。它是可移植的,可以在任何地方部署。

8)这个最后的图像可以保存在一个容器上,并有必要的装载来获得输出,并且可以通过在dockerfile中提到入口点命令来触发脚本(script.sh)。

9)这个script.sh将在图像(基本图像)内,并将被configuration为根据我们的目的来做事情。

10)在制作这个容器之前,你需要停止之前运行的容器。

重要笔记:

每次构build时都会创build一个图像并存储在registry中。 这样可以重复使用。这个图像可以被推送到主生产服务器并且可以被触发。 这有助于每次维护一个干净的环境,因为我们正在使用基本的形象。

您还可以使用Bamboo和Docker创build一个稳定的CDpipe道。 Bamboo Docker集成既包含构build代理表单,也包含在应用程序中的捆绑任务中。 您可能会发现这篇文章很有用: http : //blogs.atlassian.com/2015/06/docker-containers-bamboo-winning-continuous-delivery/

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

祝你好运!