我正在与docker和jenkins合作,我正在尝试做两个主要任务:
当我在网上冲浪时,我找到了许多解决方案:
所以我的问题是什么是最好的解决方案,或者你可以提出另一种方法。
我听到另外一个关于在容器内运行容器的问题。这是一种好的做法还是更好地避免它?
答案 0 :(得分:4)
将Jenkins作为容器化服务运行并不困难。有很多图像可以让你做到这一点。我花了几分钟让Jenkins 2.0-beta-1在容器中运行,从源代码编译(图像可以找到here)。特殊性我喜欢这种方法,您只需确保使用数据卷或数据容器jenkins_home
来保持数据的持久性。
当你想在容器中使用这个Jenkins来构建和管理容器时,事情会变得有点棘手。要实现这一点,你需要实现一个名为docker-in-docker的东西,因为你需要一个在Jenkins容器中可用的docker守护进程和客户端。
有一个非常好的教程解释如何执行:Docker in Docker with Jenkins and Supervisord。
基本上,您需要使用supervisord之类的东西在容器中运行两个进程(Jenkins和Docker)。它是可行的并宣称具有良好的隔离等等......但是可能非常棘手,因为docker守护程序本身具有一些依赖性,它们也需要存在于容器内。因此,仅使用supervisord并运行这两个进程是不够的,您需要使用DIND项目本身才能使其工作......并且您需要以特权模式运行容器。你需要处理一些奇怪的DNS问题......
根据我个人的喜好,制作一些简单的工作并且在一个容器内运行两个服务似乎破坏了docker良好实践和关注点分离的原则,这是我想要避免的事情。
当我读到这个时,我的意见变得更加强烈:Using Docker-in-Docker for your CI or testing environment? Think twice。值得一提的是,这最后一篇文章来自DIND作者本人,所以他值得一些关注。
我的最终解决方案是:运行Jenkins作为容器化服务,是的,但是考虑将docker守护程序作为底层服务器供应的一部分,即使你的docker缓存和图像是你可能想要持久化的数据,它们完全由守护进程拥有和控制。
使用此设置,您需要做的就是在您的Jenkins映像中安装docker守护程序套接字(它还需要docker客户端,但不需要服务):
$ docker run -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v local/folder/with/jenkins_home:/var/jenkins_home namespace/my-jenkins-image
或使用docker-compose volumes
指令:
---
version: '2'
services:
jenkins:
image: namespace/my-jenkins-image
ports:
- '8080:8080'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- local/folder/with/jenkins_home:/var/jenkins_home
# other services ...