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

Zur*_*iar 16 continuous-integration docker

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

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

was*_*ren 12

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

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

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