docker工人和jenkins

我正在与docker工人和jenkins合作,我正在努力完成两项主要任务:

  1. 使用jenkins控制和pipe理Docker镜像和容器(运行/启动/停止)。
  2. 在Docker镜像中设置开发环境,然后使用jenkins构build并testing容器中的应用程序。

当我在网上冲浪时,我发现了很多解决scheme:

  • 将jenkins作为容器运行,并将其与其他容器连接起来。
  • 将jenkins作为服务运行,并使用提供的jenkins插件来支持docker。
  • 在包含开发环境的容器内运行jenkins。

所以我的问题是什么是最好的解决scheme,或者你可以build议一个其他的方法。

我还听到有关在容器中运行容器的问题。 这是一个好的做法还是更好地避免它?

把Jenkins作为一个集装箱化的服务来运行并不是一件困难的事情。 有许多图像可以让你做到这一点。 我花了几分钟的时间让Jenkins 2.0-beta-1运行在一个容器中,从源代码编译(图像可以在这里find)。 特殊性我喜欢这种方法,你只需要确保使用数据卷或数据容器作为jenkins_home使您的数据保持。

当你想使用这个Jenkins(在一个容器中)来构build和pipe理容器本身时,事情会变得有点棘手。 为了达到这个目的,你需要实现一个叫docker-in-docker的东西,因为你需要一个docker守护进程和客户端在Jenkins容器中。

有一个非常好的教程解释如何做到这一点: 与Jenkins和Supervisord的Docker中的Docker 。

基本上,你将需要使两个进程(jenkins和docker)在容器中运行,使用像supervisord。 这是可行的,并宣称具有良好的隔离等等。但是可以非常棘手,因为docker守护进程本身也有一些依赖关系,也需要在容器中存在。 所以,只有使用supervisord并运行这两个进程是不够的,你需要使用DIND项目本身来使它工作…而且你将需要以特权模式运行容器。需要处理一些奇怪的DNS问题

对于我个人的品味来说,听起来太多的解决方法,使一些简单的工作,并在一个容器内运行两个服务似乎打破docker的良好做法和关注分离的原则,我想避免的事情。

当我读到这个时,我的意见变得更强了: 在您的CI或testing环境中使用Docker-in-Docker? 仔细想想 。 值得一提的是,这最后一篇文章是来自DIND作者自己的,所以值得关注。

我的最终解决scheme是:运行Jenkins作为一个容器化的服务,是的,但考虑到docker守护进程作为底层服务器供应的一部分,即使因为你的dockercaching和图像是你可能想要坚持的数据,由守护进程拥有和控制。

使用这个设置,你需要做的就是在你的Jenkins镜像中装载docker守护进程socket(这也需要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 ...