使用 Docker 的 Jenkins CI 容器

本章介绍如何使用 Jenkins 设置 Docker 容器,该容器能够将 Docker 命令发送到 Host 的 Docker 安装(Docker 守护程序)。在 Docker 中有效地使用 Docker。为实现这一目标,我们必须构建一个基于官方 Jenkins Docker Image 的任意版本的自定义 Docker 镜像。Dockerfile(如何构建映像的指令)如下所示:

FROM jenkins

USER root

RUN cd /usr/local/bin && \
curl https://master.dockerproject.org/linux/amd64/docker > docker  && \
chmod +x docker  && \
groupadd -g 999 docker && \
usermod -a -G docker jenkins
    
USER Jenkins

此 Dockerfile 构建一个 Image,其中包含此客户端用于与 Docker 守护程序通信的 Docker 客户端二进制文件。在这种情况下,主机的 Docker 守护进程。此文件中的 RUN 语句还会创建一个带有 UID 999 的 UNIX 用户组,并将用户 Jenkins 添加到该用户组。为什么这是必要的将在后面的章节中描述。使用此 Image,我们可以运行可以使用 Docker 命令的 Jenkins 服务器,但是如果我们只运行此 Image,则我们在映像中安装的 Docker 客户端无法与 Host 的 Docker 守护进程通信。这两个组件通过 UNIX Socket /var/run/docker.sock 进行通信。在 Unix 上,这是一个像其他所有文件一样的文件,因此我们可以轻松地将它安装在 Jenkins 容器中。这是通过命令 docker run -v /var/run/docker.sock:/var/run/docker.sock --name jenkins MY_CUSTOM_IMAGE_NAME 完成的。但是这个挂载文件由 docker:root 拥有,因此 Dockerfile 使用熟知的 UID 创建该组,并将 Jenkins 用户添加到其中。现在,Jenkins Container 真的能够运行和使用 Docker。在生产中,run 命令还应包含 -v jenkins_home:/var/jenkins_home 来备份 Jenkins_home 目录,当然还有端口映射以通过网络访问服务器。