iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
DevOps

從0開始學習DevOps,並部署CICD至Java專案中系列 第 24

關於Jenkins使用Docker Dood與Dind、與官方推薦的jenkinsci/bueocean image

  • 分享至 

  • xImage
  •  

為什麼要寫這篇?

環境依據如下:Docker Desktop for Mac / M2

在我們開始Jenkins pipeline流水線之前,如果你需要在Jenkins中使用到Docker可以瀏覽這篇文章,通常在完整的pipeline CICD流程,會需要借助docker的協助來達成很多事,而我在環境上卡了非常多天,如果直接掛載docker.sock使用image jenkins/jenkins,我的環境是無法正常運行docker的。

希望給其他在環境跟我遇到類似狀況的,有一個參考方向。

使用image jenkinsci/bueocean 與 jenkins/jenkins的差異

因為在前例使用的image jenkins/jenkins,並非在官方推薦使用的image中,以及在pipeline中無法正常使用docker,起先無法辨別docker指令,所以我下載了docker.io文件,但還是沒辦法通過docker daemon的阻擋,研究了幾天,決定改另外創建一個container並使用官方推薦的image(mac 使用docker下載jenkins),就能直接正常辨識docker指令,並且不需要做太多的預設配置。

Dood:使用宿主機的Docker

常常看到的Jenkins配置方式如下,且 image為jenkins/jenkins ,使用在docker desktop + mac環境無效。(只單純做以下方式,仍無法使用docker,還要下載docker.io)

docker run \
  -u root \
  -p 8080:8080 \
	-p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/local/build/jdk/jdk-17.0.8:/var/jenkins_home/jdk \
  -v /usr/local/build/maven/apache-maven-3.9.4:/var/jenkins_home/maven \
	--name jenkins3 \
	jenkins/jenkins

啟動環境後,需要再做以下配置就能於jenkins執行Docker!

docker exec -it jenkins_container_name bash # 進到容器內部
apt-get update && apt-get install -y docker.io # 下載docker文件,才可辨識docker指令

使用 image jenkinsci/blueocean 可以使用Docker,但建議需要更新版本

這邊我把端口號映射為8086,以及掛載docker.sock才有權限使用docker,並且一併把本機的JDK、Maven、以及要新版本的Jenkins.war檔一併掛載進去容器內,啟動後會直接是我掛載進去的版本。

因為 jenkinsci/blueocean 的Jenkins版本目前比較低。Jenkins官方下載新版本

使用者設為root,不然在mac環境是會報錯,會顯示有些文件無法讀寫,導致無法正常啟動成功。
下則文章也會分步驟講解,如果你已經是現有容器了,事後掛載也可以。

docker run \
  -u root \
  -p 8086:8080 \
	-p 50006:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/local/build/jdk/jdk-17.0.8:/var/jenkins_home/jdk \
  -v /usr/local/build/maven/apache-maven-3.9.4:/var/jenkins_home/maven \
  -v /Users/lulu/Desktop/jenkins.war:/usr/share/jenkins/jenkins.war \
  --name jenkins3 \
  jenkinsci/blueocean

Dind:Docker In Docker

簡單來說,就是在Docker容器中又再創建了一個Docker,因為要配置的東西更多,所以使用docker-compose.yml。使用這個非常耗費效能!通常複雜情況才會使用。

創建一個docker-compose.yml檔案,配置Jenkins容器以及docker bind
這是我找了很久,終於找到有人找到解決方式 → 引用來源
user 指定root是因為沒有指定會導致有些文件無法有權限取得,會無法正常啟動,所以配置root。
不建議加上 - $HOME:/home 這行,這是把本地的Home掛載上去,有可能會同步影響本地的檔案。

version: '3.1'

networks:
  docker:

volumes:
  jenkins-data:
  jenkins-docker-certs:

services:

  jenkins:
    image: jenkinsci/blueocean
    restart: always
    networks:
      - docker
    ports:
      - 8085:8080
      - 50005:50000
    tty: true
    user: root
    volumes:
      - jenkins-data:/var/jenkins_home
      - jenkins-docker-certs:/certs/client:ro
    environment:
      - DOCKER_HOST=tcp://docker:2376
      - DOCKER_CERT_PATH=/certs/client
      - DOCKER_TLS_VERIFY=1

  dind:
    image: docker:dind
    privileged: true
    restart: always
    networks:
      docker:
        aliases:
          - docker
    ports:
      - 2376:2376
    tty: true
    volumes:
      - jenkins-data:/var/jenkins_home
      - jenkins-docker-certs:/certs/client
      - $HOME:/home
    environment:
      - DOCKER_TLS_CERTDIR=/certs

如果有加上加上 - $HOME:/home 這行,啟動時,Docker desktop 會跳出視窗提醒,是不是要開放本機資源供docker使用

https://ithelp.ithome.com.tw/upload/images/20231009/20162058Cm1uxUZttz.png

關於Dood 與 Dind 兩者的效能差異

jenkins2 是使用Dood以及 image jenkinsci/blueocean 構建
api項下的jenkins-1 是使用 Dind 以及 image jenkinsci/blueocean 構建

兩者同時啟動與運行,就能很清楚的看見實際CPU佔比的差異,目前還沒想到什麼情況下一定要使用Docker In Docker,以這兩種實際測試,都可以正常跑pipeline以及使用Docker指令的。

https://ithelp.ithome.com.tw/upload/images/20231009/20162058VXDmQzssb9.png

下一篇再說明如何在現有的容器中更新Jenkins版本,以及轉換為jenkinsci/bueocean image啟動Jenkins可能會遇到的問題,以及如何排解。


上一篇
配置docker能推送image到私有的Harbor上、以及pull到docker
下一篇
轉換容器,使用jenkinsci/bueocean image啟動Jenkins版本不相符問題(現有容器升級版本)
系列文
從0開始學習DevOps,並部署CICD至Java專案中30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言