在Jenkins官方文档中发现的"彩蛋"(Docker篇)

167 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

如果你通过"jenkins"关键字搜索进入Jenkins官方首页,可能会自动跳转进入www.jenkins.io/zh/,当你点击【文档】后就会看到中文版官方文档,该文档是由jenkins中文社区提供的。当你切换语言为【English】时,才会看到官方提供的英文版官方文档。

本章主要是关于文档中采用Dokcer安装Jenkins部分的说明:中文文档英文文档

中文文档

下面是中文文档中给出的如何在Docker中安装Jenkins的步骤。

image-20210527115127411

jenkinsci/blueocean

中文文档中推荐安装的镜像是【jenkinsci/blueocean】,通过在Docker Hub中搜索到,大家有没有疑惑,这个官方镜像为什么没有打【OFFICIAL IMAGE】标签,然后在Docker Hub上通过关键字"jenkins"搜索,可以看到带【OFFICIAL IMAGE】标签的【jenkins/jenkins】镜像。

image-20210527115628489

image-20210527115835450

根据文档的介绍,【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容器,在介绍了英文文档后,对其作用进行统一的解释。

  • /var/run/docker.sock表示Docker守护程序通过其监听的基于Unix的套接字。 该映射允许 jenkinsci/blueocean 容器与Docker守护进程通信, 如果 jenkinsci/blueocean 容器需要实例化其他Docker容器,则该守护进程是必需的。

英文文档

下面是英文文档中给出的如何在Docker中安装Jenkins的步骤,步骤比较长,截取了部分进行说明,相关docker命令参数作用可参考访问文档。下面对其步骤进行一一解释。

image-20210527121128367

jenkins/jenkins

英文文档中推荐安装的镜像是【jenkins/jenkins】,即上面提到的在Docker Hub上搜索的带【OFFICIAL IMAGE】标签的官方镜像。然后文档给出了如下说明:

image-20210527122727215

大致意思就是:官方提供的jenkins/jenkins镜像没有包含docker CLI和Blue Ocean插件。如果想要使用Jenkins和Docker的全部的功能的话,需要按照文档下面给出的安装步骤来安装。

先跳过前面的步骤,直接来看第4步。

image-20210527122528622

这里给出了如何对官方给出的【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。(Docker网络相关内容可以查看博客【Docker 网络基础】

  • 第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守护进行去执行的。

  • 第4步,制作自己的【myjenkins-blueocean】镜像,这里我推荐直接使用中文文档中推荐的【jenkinsci/blueocean】镜像。

  • 第5步,启动镜像

总结

建议大家还是多阅读英文文档,毕竟"翻译"还是比较滞后的,英文文档才是第一手资源。但是非常感谢Jenkins官方提供的中文文档,就像在看大佬写的文章一样,拓宽了眼界,了解了到技术上更多的可能性。

这次中英文文档的对比,真的让我觉得收获颇多,当我看到【myjenkins-blueocean】和docker:dind的时候,真的有种看到了彩蛋的感觉,很多以前看中文文档时的疑惑就自然而然的解开了。