第10章 Docker 中 Jenkins 的安裝與配置

語言: CN / TW / HK

第10章 Docker 中 Jenkins 的安裝與配置

前言

  • 為什麼要使用 Jenkins ?

具體請參考我的第05章內容。

  • 什麼是 Jenkins?

具體請參考我的第05章內容。

  • 什麼是 Docker?

具體請參考我的第08章內容。

  • 為什麼要在 Docker 中安裝 Jenkins?

為了開發環境一致性、可移植性、易於管理和維護性。

目標

  • 完成 Jenkins 在 Docker 中的安裝與配置。
  • 安裝在 Docker 中的 Jenkins 能正常對外提供服務。
  • 在外部開發環境中能正常訪問和使用 Jenkins 持續整合服務。

環境

  • **VMware:**VMware Workstation 14 Pro
  • **Linux:**CentOS7.4
  • **Docker:**18.06.0-ce, build 0ffa825
  • **Jenkins:**Jenkins2.121.1
  • **JDK:**jdk1.8.0_172

安裝

Docker

Docker是一個在稱為“容器”(或Docker容器)的隔離環境中執行應用程式的平臺。像Jenkins這樣的應用程式可以作為只讀“映象”(或Docker映象)下載,每個應用程式都作為容器在Docker中執行。 Docker容器實際上是Docker映象的“執行例項”。從這個角度來看,影象被或多或少地永久儲存(即,只要釋出映象更新),而容器被臨時儲存。在Docker文件的入門指南,第1部分:方向和設定頁面中閱讀有關這些概念的更多資訊 Getting Started, Part 1: Orientation and setup

Docker的基礎平臺和容器設計意味著可以在任何支援的作業系統(macOS,Linux和Windows)或執行Docker的雲服務(AWS和Azure)上執行單個Docker映像(對於任何給定的應用程式,如Jenkins) 。

關於 Docker的安裝與配置,具體請參考我的第08章內容。

在Docker中下載並執行Jenkins

Jenkins有幾個Docker映象可用。

建議使用的Docker映象是 jenkinsci/blueocean image (來自 Docker Hub repository )。此r映象包含與所有Blue Ocean外掛和功能捆綁在一起的Jenkins(可隨時投入生產)的當前長期支援(LTS) Long-Term Support (LTS) release of Jenkins 版本。這意味著您無需單獨安裝Blue Ocean外掛。

每次釋出新版Blue Ocean時都會發佈一個新的jenkinsci/blueocean映象。您可以在標籤頁面上看到以前釋出的jenkinsci /blueocean映象版本列表。

您還可以使用其他Jenkins Docker映象(可通過Docker Hub上的jenkins/jenkins訪問)。但是,這些不適用於Blue Ocean,需要通過Jenkins中的Manage Jenkins > Manage Plugins 頁面進行安裝。在Blue Ocean入門( Getting started with Blue Ocean )中瞭解更多相關資訊。

下載映象並執行容器

下載jenkinsci/blueocean映象並使用以下docker run命令在Docker中將其作為容器執行:

sudo 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 

引數說明

1、–rm

(可選)在關閉時自動刪除Docker容器(下面是jenkinsci/blueocean映像的例項化)。如果您需要退出Jenkins,這可以保持整潔。

2、-d

(可選)在後臺執行jenkinsci/blueocean容器(即“分離”模式)並輸出。

容器ID。如果未指定此選項,則會在終端視窗中輸出正在執行的此容器的Docker日誌。

3、-p

對映(即“釋出”)jenkinsci/blueocean容器的埠8080到主機上的埠8080。第一個數字表示主機上的埠,而最後一個表示容器的埠。因此,如果為此選項指定了-p 49000:8080,則將通過埠49000訪問主機上的Jenkins。

4、-p

(可選)將jenkinsci/blueocean容器的埠50000對映到主機上的埠50000。只有在其他計算機上設定了一個或多個基於JNLP的Jenkins代理時,才需要這樣做, 它反過來與jenkinsci/blueocean容器互動(充當“主”Jenkins伺服器,或簡稱為“Jenkins master”)。基於JNLP的Jenkins代理預設通過TCP埠50000與Jenkins主機通訊。

您可以通過“配置全域性安全性”頁面更改Jenkins主伺服器上的此埠號。如果你要將JNSLP代理的Jenkins master的TCP埠值更改為51000(例如),那麼你需要重新執行Jenkins(通過這個docker run …命令)並指定這個“釋出”選項,例如 - p 52000:51000,其中最後一個值與Jenkins主伺服器上的此更改值匹配,第一個值是Jenkins主伺服器主機上的埠號,基於JNLP的Jenkins代理通過該埠號與Jenkins主伺服器進行通訊 - 即52000。

5、-v

(可選但強烈建議)將容器中的/var/jenkins_home目錄對映到名為jenkins-data的Docker卷。如果此卷不存在,則此docker run命令將自動為您建立卷。 如果您希望每次重新啟動Jenkins時都希望Jenkins狀態保持不變(通過此docker run …命令),則需要此選項。如果未指定此選項,則Jenkins將在每次重新啟動後有效地重置為新例項。

注意:jenkins資料卷也可以使用docker volume create命令獨立建立:

docker volume create jenkins-data

您可以將此目錄對映到計算機本地檔案系統上的目錄,而不是將/var/jenkins_home目錄對映到Docker卷。例如,指定選項-v $ HOME/jenkins:/var/jenkins_home會將容器的/var/jenkins_home目錄對映到本地計算機上$ HOME目錄中的jenkins子目錄,該子目錄通常是/Users/<your-username>/jenkins/home/<your-username>/jenkins

6、-v

(可選)/var/run/docker.sock表示Docker守護程式通過其偵聽的基於Unix的 Socket。此對映允許jenkinsci/blueocean容器與Docker守護程式通訊,如果jenkinsci/blueocean容器需要例項化其他Docker容器,則需要該守護程式。如果執行語法包含具有docker引數的代理程式部分的宣告性管道,則此選項是必需的 - 即

agent {docker {...}}。在 Pipeline Syntax 頁面上閱讀更多相關資訊。

7、jenkinsci/blueocean

jenkinsci/blueocean Docker映象本身。如果尚未下載此映像,則此docker run命令將自動為您下載映像。此外,如果自上次執行此命令後釋出了對此映像的任何更新,則再次執行此命令將自動為您下載這些已釋出的映像更新。

注意:也可以使用 docker pull 命令獨立下載(或更新)此Docker映象:

docker pull jenkinsci/blueocean

注意:以下是我的安裝執行命令,請嘗試複製並貼上此無註釋版本:

sudo docker run \
  -u root \
  --name jenkins \
  --rm \
  -d \
  -p 8082:8082 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

安裝過程與結果如下:

$ sudo docker run \
>   -u root \
>   --rm \
>   -d \
>   -p 8082:8082 \
>   -v jenkins-data:/var/jenkins_home \
>   -v /var/run/docker.sock:/var/run/docker.sock \
>   jenkinsci/blueocean
Unable to find image 'jenkinsci/blueocean:latest' locally
latest: Pulling from jenkinsci/blueocean
8e3ba11ec2a2: Pull complete 
311ad0da4533: Pull complete 
df312c74ce16: Pull complete 
fa12f39dbf9b: Pull complete 
5e2bfe6e0b85: Pull complete 
dcc378c45959: Pull complete 
6168b5a9b059: Pull complete 
b565cf385df2: Pull complete 
2d2686a6be13: Pull complete 
3d837057ffd5: Pull complete 
a9c46c3a3555: Pull complete 
a989f45875e3: Pull complete 
40460b4b9619: Pull complete 
20a73c4ba560: Pull complete 
fec014e5ba66: Pull complete 
7a82cb3e4138: Pull complete 
Digest: sha256:102b2cc94569d7f1f38f5473462ea3748edf0d8e9d70288616bbd1e5e6c68be3
Status: Downloaded newer image for jenkinsci/blueocean:latest
7a46a653df27097c7daf4a3ba60ee51a19923c5232efafb81019ae196dcada37

開放埠

## 開啟 8082 埠
[ringyin@node1 ~]$ sudo firewall-cmd --zone=public --add-port=8082/tcp --permanent 
[ringyin@node1 ~]$ sudo firewall-cmd --reload ## 重啟防火牆

繼續安裝後設置嚮導

相關的設定嚮導與在虛擬機器安裝配置一樣,具體參考我的第05章內容,也可參考官方文件,連結地址: Post-installation setup wizard

訪問Jenkins/Blue Ocean Docker容器

如果您對Docker有一些經驗,並且希望或需要使用docker exec命令通過終端/命令提示符訪問jenkinsci/blueocean容器,則可以新增一個選項,如--name jenkins-blueocean(上面執行的docker) ,這將給jenkinsci/blueocean容器命名為“jenkins-blueocean”。

這意味著您可以使用docker exec命令訪問容器(通過單獨的終端/命令提示符視窗),如:

sudo docker exec -it jenkins-blueocean bash

可以修改我們想要的容器名稱。

列出所有容器

$ sudo docker ps
CONTAINER ID  IMAGE             ...    PORTS                                        NAMES
7a46a653df27 jenkinsci/blueocea ... 8080/tcp, 50000/tcp, 0.0.0.0:8082->8082/tcp   modest_raman

重新命名容器稱

$ sudo docker rename modest_raman jenkins

退出容器

如果要正常退出不關閉容器並保持容器執行狀態,請按Ctrl+P+Q進行退出容器。

$ Ctrl+P+Q

如果使用exit退出,那麼在退出之後會關閉容器,可以使用下面的流程進行恢復

  • 使用docker restart命令重啟容器

    $ sudo docker restart jenkins
    
  • 使用docker attach命令進入容器

    $ sudo docker attach jenkins
    

通過Docker日誌訪問Jenkins控制檯日誌

您可能需要訪問Jenkins控制檯日誌,例如,在安裝後設置嚮導(Post-installation setup wizard. )中 Unlocking Jenkins  時。

如果您沒有使用上面的docker run ...命令指定分離模式選項-d,則可以通過執行此Docker命令的終端/命令提示符視窗輕鬆訪問Jenkins控制檯日誌。

否則,您可以使用以下命令通過jenkinsci/blueocean容器的Docker日誌訪問Jenkins控制檯日誌:

$ sudo docker logs jenkins

您可以使用docker ps命令獲取<docker-container-name>。如果你指定了 - 上面的docker run ...命令中的--name jenkins-blueocean選項(另請參閱 Accessing the Jenkins/Blue Ocean Docker container 容器),您只需使用docker logs命令:

$ sudo docker logs jenkins

訪問Jenkins主目錄

例如,您可能需要訪問Jenkins主目錄,以檢查workspace子目錄中Jenkins構建的詳細資訊。

如果您將Jenkins主目錄(/var/jenkins_home)對映到計算機本地檔案系統上的目錄(即上面的docker run ...命令),那麼您可以通過計算機的常用終端/命令提示符訪問該目錄的內容。

否則,如果在docker run …命令中指定了-v jenkins-data:/var/jenkins_home選項,則可以使用docker exec命令通過jenkinsci/blueocean容器的終端/命令提示符訪問Jenkins主目錄的內容:

$ sudo docker exec -it <docker-container-name> bash

如上所述,可以使用docker ps命令獲取<docker-container-name>。如果你指定了 - 上面的docker run ...命令中的--name jenkins-blueocean選項(另請參閱訪問Jenkins / Blue Ocean Docker容器),您只需使用docker exec命令:

$ sudo docker exec -it jenkins-blueocean bash

WAR檔案

Jenkins的Web應用程式ARchive(WAR)檔案版本可以安裝在支援Java的任何作業系統或平臺上。

要下載並執行Jenkins的WAR檔案版本:

  1. 將最新的穩定Jenkins WAR檔案(latest stable Jenkins WAR file)下載到計算機上的相應目錄中。
  2. 開啟下載目錄的終端/命令提示符視窗。
  3. 執行命令java -jar jenkins.war
  4. 瀏覽到http://localhost:8080並等待Unlock Jenkins頁面出現。
  5. 繼續下面的安裝後設置嚮導(Post-installation setup wizard )。

筆記:

  • 與在Docker中使用Blue Ocean下載和執行Jenkins(上圖)不同,此過程不會自動安裝Blue Ocean功能,需要通過Jenkins中的 Manage Jenkins > Manage Plugins 頁面單獨安裝。在Blue Ocean入門頁面上閱讀有關安裝Blue Ocean( Getting started with Blue Ocean)的詳細資訊。
    e Ocean功能,需要通過Jenkins中的 Manage Jenkins > Manage Plugins 頁面單獨安裝。在Blue Ocean入門頁面上閱讀有關安裝Blue Ocean( Getting started with Blue Ocean)的詳細資訊。
  • 您可以在執行java -jar jenkins.war命令時通過指定--httpPort選項來更改埠。例如,要通過埠9090訪問Jenkins,請使用以下命令執行:java -jar jenkins.war --httpPort=9090