Docker和jenkins

时间:2016-03-27 17:07:06

标签: jenkins docker

我正在与docker和jenkins合作,我正在尝试做两个主要任务:

  1. 使用jenkins控制和管理泊坞窗图像和容器(运行/启动/停止)。
  2. 在docker镜像中设置开发环境,然后使用jenkins构建和测试容器中的应用程序。
  3. 当我在网上冲浪时,我找到了许多解决方案:

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

    所以我的问题是什么是最好的解决方案,或者你可以提出另一种方法。

    我听到另外一个关于在容器内运行容器的问题。这是一种好的做法还是更好地避免它?

1 个答案:

答案 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 ...