Docker 和詹金斯

Jac*_*k E 1 jenkins docker

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

  1. 使用 jenkins 控制和管理 docker 镜像和容器(运行/启动/停止)。
  2. 在 docker 镜像中设置开发环境,然后使用 jenkins 构建和测试我在容器中的应用程序。

当我在网上冲浪时,我发现了许多解决方案:

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

所以我的问题是最好的解决方案是什么,或者您可以建议其他方法。

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

Vic*_*der 5

将 Jenkins 作为容器化服务运行并不是一项艰巨的任务。有很多图像可以让您做到这一点。我只花了几分钟就让 Jenkins 2.0-beta-1 在容器中运行,从源代码编译(图像可以在这里找到)。特殊性我喜欢这种方法,你只需要确保使用数据卷或数据容器jenkins_home来让你的数据持久化。

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

有一个很好的教程解释了如何做到这一点:Docker in Docker with Jenkins and Supervisord

基本上,您需要使用诸如 supervisord 之类的东西使两个进程(Jenkins 和 Docker)在容器中运行。它是可行的,并宣称具有良好的隔离性等......但可能非常棘手,因为 docker 守护进程本身有一些依赖项,这些依赖项也需要存在于容器内。因此,仅使用 supervisord 并运行两个进程是不够的,您需要利用DIND项目本身来使其工作……并且您需要在特权模式下运行容器……并且您”需要处理一些奇怪的 DNS 问题...

就我个人的喜好而言,让一些简单的工作听起来有太多的解决方法,并且在一个容器中运行两个服务似乎打破了 docker 的良好实践和关注点分离的原则,这是我想避免的。

当我读到这篇文章时,我的观点变得更加强烈:在您的 CI 或测试环境中使用 Docker-in-Docker?三思而后行。值得一提的是,最后一篇文章来自 DIND 作者本人,因此值得关注。

我的最终解决方案是:将 Jenkins 作为容器化服务运行,是的,但考虑将 docker 守护程序作为底层服务器配置的一部分,即使因为您的 docker 缓存和图像是您可能想要持久化的数据,并且它们是完全的由守护进程拥有和控制。

有了这个设置,你需要做的就是在你的 Jenkins 镜像中挂载 docker daemon 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
Run Code Online (Sandbox Code Playgroud)

或者使用 docker-composevolumes指令:

---
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 ...
Run Code Online (Sandbox Code Playgroud)