在持续交付管道中使用Docker的最佳方式是什么?如何在连续交付中最好地使用Docker?
应该构建人工制品是一个码头工人形象,而不是一个JAR /战争?如果是这样,那将如何工作 - 我正在努力研究如何在开发中(在笔记本电脑上)无缝使用Docker,然后让CI服务器使用相同的基本映像来构建artefact。
在持续交付管道中使用Docker的最佳方式是什么?如何在连续交付中最好地使用Docker?
应该构建人工制品是一个码头工人形象,而不是一个JAR /战争?如果是这样,那将如何工作 - 我正在努力研究如何在开发中(在笔记本电脑上)无缝使用Docker,然后让CI服务器使用相同的基本映像来构建artefact。
那么,当然有多种最佳实践和许多方法来解决这个问题。我发现成功的一种方法如下:
通过这种方法,我们还能够为Docker容器运行我们的本地进程(数据库等)。这些容器基于相同的图片,在生产的那些人,当然还有也可以在开发机开发的,本地开发环境和生产环境之间唯一的区别就是操作系统。dev的机器通常运行的Mac OS X/Boot2Docker和生产线运行在Linux上。
[Fig](http://www.fig.sh)已弃用,不应再使用。它被替换为[docker-compose](https://www.docker.com/docker-compose)。 – h3nrik
是的,你应该从jar/war文件转移到图像作为你的构建文物。 @wassgren描述应该很好地工作的方法,但是我发现下面以更好地满足我们的使用情况,特别是对发展:
1 - 做一个基本映像。它看起来像你是一个Java商店,作为一个例子,假设你的基本映像是FROM ubuntu:14.04
,并安装jdk和一些更常见的库。我们称之为myjava
。
2 - 在开发过程中,用无花果在本地打开您的容器(S)和安装你的开发代码,以正确的位置。 Fig使用myjava
基础镜像,并不关心Dockerfile。
3-当您构建用于部署的项目时,它使用Dockerfile,并在某处将代码/构建工件的COPY
放在正确的位置。然后该图像得到适当标记并进行部署。
简单的步骤。
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)在制作此容器之前,您需要停止以前运行的容器。
重要提示:
的图像创建每次您构建并存储在注册表中。 因此这可以被重用。这个图像可以被推送到主生产服务器并且可以被触发。 这有助于每次维护一个干净的环境,因为我们正在使用基础图像。
您还可以使用Bamboo和Docker创建稳定的CD管道。 Bamboo Docker集成既包含构建代理表单,也包含在应用程序中的捆绑任务中。您可能会发现这篇文章有用:http://blogs.atlassian.com/2015/06/docker-containers-bamboo-winning-continuous-delivery/
您可以使用该任务来构建Docker镜像,您可以在其他环境中使用该镜像或将应用程序部署到容器。
祝你好运!
Codeship写了一篇关于这个问题的好文章:https://blog.codeship.com/continuous-integration-and-delivery-with-docker/ –