如果通过"jenkins"关键字搜索进入 Jenkins 官方首页,可能会自动跳转进入https://www.jenkins.io/zh/,当你点击【文档】后就会看到中文版官方文档,该文档是由 jenkins 中文社区提供的。当你切换语言为【English】时,才会看到官方提供的英文版官方文档。
本博客主要是关于文档中采用 Dokcer 安装 Jenkins 部分的说明:中文文档、英文文档
下面是中文文档中给出的如何在 Docker 中安装 Jenkins 的步骤。
中文文档中推荐安装的镜像是【jenkinsci/blueocean】,通过在 Docker Hub 中搜索到,大家有没有疑惑,这个官方镜像为什么没有打【OFFICIAL IMAGE】标签,然后在 Docker Hub 上通过关键字"jenkins"搜索,可以看到带【OFFICIAL IMAGE】标签的【jenkins/jenkins】镜像。
根据文档的介绍,【jenkinsci/blueocean】镜像中是包含了 jenkins 和 blueocean 插件。
中文文档中给出的 docker 版本的 jenkins 的启动命令如下:
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
具体的参数解释可参考文档,这里主要要注意的是-v /var/run/docker.sock:/var/run/docker.sock
这行命令的用途,官方解释如下,主要就是用来在 docker 安装的 jenkins 中操作 docker 容器,在介绍了英文文档后,对其作用进行统一的解释。
jenkinsci/blueocean
容器与 Docker 守护进程通信, 如果 jenkinsci/blueocean
容器需要实例化其他 Docker 容器,则该守护进程是必需的。 下面是英文文档中给出的如何在 Docker 中安装 Jenkins 的步骤,步骤比较长,截取了部分进行说明,相关 docker 命令参数作用可参考访问文档。下面对其步骤进行一一解释。
英文文档中推荐安装的镜像是【jenkins/jenkins】,即上面提到的在 Docker Hub 上搜索的带【OFFICIAL IMAGE】标签的官方镜像。然后文档给出了如下说明:
大致意思就是:官方提供的 jenkins/jenkins 镜像没有包含 docker CLI 和 Blue Ocean 插件。如果想要使用 Jenkins 和 Docker 的全部的功能的话,需要按照文档下面给出的安装步骤来安装。
先跳过前面的步骤,直接来看第 4 步。
这里给出了如何对官方给出的【jenkins/jenkins】镜像进行定制化,即制作自己的 docker 镜像。
先看步骤 a 中的 Dockerfile,主要是基于 jenkins/jenkins 镜像,安装了 docker-ce-cli,然后给 jenkins 装上了 blueocean 和 docker-workflow 插件。
然后步骤 b,通过docker build
命令制作名为【myjenkins-blueocean】的镜像。
看到这个镜像名,是不是有一种 “恍然大悟” 的感觉,在 Docker Hub 上可以查看【jenkinsci/blueocean】镜像的制作指令,感兴趣的可以去看下,其实【myjenkins-blueocean】就是官方提供的一种制作自己的【jenkinsci/blueocean】镜像的方式。
上面介绍了文档中镜像不同的部分,接下来就是安装步骤。可以看到,中文文档中一步搞定的事情,在英文文档中分为了多个步骤。
第 2 步中,使用docker create network
的方式,创建了一个网络,命名为 jenkins。
第 3 步,为了在 docker 安装的 Jenkins 中执行 docker 命令,需要安装 docker:dind 容器,到这里会发现与之前中文文档中的-v /var/run/docker.sock:/var/run/docker.sock
这个命令行的用途类似。
是的,其实这两个的作用是一致的,都是为了在 docker 安装的 Jenkins 中执行 docker 命令,只是两份文档提供了两种方案:
/var/run/docker.sock
前面说过,这个是 Docker 守护程序用来监听的 docker 命令的程序,然后在启动时,被挂载到了 Jenkins 容器中,即 jenkins 容器中执行的 docker 命令实际上是发送给了宿主机的 docker 守护进程来执行的。
docker:dind
"dind"是"Docker in Docker"的简写,即允许在 Dokcer 之上的 Docker 容器,他跟 Jenkins 容器时通过第 2 步中创建的jenkins
网络来通讯的,即 jenkins 容器中执行的 docker 命令实际上是发送给了 docker:dind 容器内的 docker 守护进行去执行的。
建议大家还是多阅读英文文档,毕竟"翻译"还是比较滞后的,英文文档才是第一手资源。但是非常感谢 Jenkins 官方提供的中文文档,就像在看大佬写的文章一样,拓宽了眼界,了解了到技术上更多的可能性。
这次中英文文档的对比,真的让我觉得收获颇多,当我看到【myjenkins-blueocean】和 docker:dind 的时候,真的有种看到了彩蛋的感觉,很多以前看中文文档时的疑惑就自然而然的解开了。