使用 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 目錄,當然還有埠對映以通過網路訪問伺服器。