容器化技術 在軟體開發技術領域已取得長足進步,成為雲端環境中打包和部署應用程式最受認可的方法。這是由於對持續整合 (CI) 和持續部署 (CD) 的需求所推動的,而這兩者正是 DevOps. 軟體開發人員和工程師利用容器來實現軟體架構的 CI/CD。容器本質上是一個完整封裝、可攜式且獨立的運算平台。雖然網路上有許多容器平台,但 Docker 恰好是最常見的。
Docker 是一個開放原始碼的容器平台 ,使開發更高效且可預測。Docker 提供了一個公開的 Docker 映像檔存放庫,位於 Docker Hub. 它包含許多最常見實作的開源 Docker 映像檔,供您拉取和使用。由於它是一個公開儲存庫,您也可以自由新增自己的 Docker 映像檔與大眾分享。然而,如果您有私有/專有程式碼,您可能必須付費使用私有映像檔儲存庫,或建立自己的映像檔儲存庫服務。這就是 GitLab 發揮作用的地方。
GitLab 是一個網頁版的 Git 存放庫,它不僅僅是一個版本控制工具。它提供了用於持續整合和部署的 DevOps 工具、問題追蹤、Docker 映像檔登錄表等。它提供三種選擇:GitLab Community Edition (CE)、GitLab Enterprise Edition (EE) 和 Gitlab SaaS。 GitLab CE 和 GitLab EE 是自我管理的解決方案,允許您自行下載、安裝和管理 GitLab 執行個體。 GitLab SaaS 是由 GitLab inc 託管的,您無需擔心安裝任何東西即可使用它。
在之前的教學中,我們向您展示了 如何在 CloudSigma 伺服器上架設 GitLab 實例並託管您自己的 Git Repository。我們還向您展示了如何實作 使用 GitLab runner 的持續整合管線,以便在每次有新 commit 時自動建置並執行您的測試。如果您還沒有閱讀過上述教學,請先閱讀,因為它們是本教學的基石。
在本教學中,我們將示範如何建置一個簡單的 Docker 映像檔,並使用 GitLab 自代管實例進行託管(無論您使用的是 Community Edition 還是 Enterprise Edition – 步驟流程都是相同的)。
先決條件
若要跟著本教學的每個步驟進行,請確保您擁有一個 GitLab CI runner 以及一個自建的 GitLab 伺服器,如下文所述。
1. 安全的 GitLab 伺服器
我們將使用它來儲存原始碼、執行 CI/CD 任務並託管 Docker 映像檔登錄。您應該擁有一台至少配備 2 CPU 核心與 4GB 的 RAM,這是 GitLab 建議安裝自我管理 GitLab 執行個體所需的配置。您還需要一個指向該伺服器的已註冊網域名稱,因為我們將使用它來獲取 來自 Let’s Encrypt 的 SSL 憑證 以保護伺服器的安全。以下是一些您可以參考來設定 GitLab 自託管實例的連結。
- 在您選擇的任何網域名稱註冊商註冊一個網域名稱,並 將其指向 CloudSigma.
- 參考此教學以進行 初始 Ubuntu 伺服器設定, 新增非 root 使用者,以及 啟用 Ubuntu 的 UFW 防火牆.
- 最後,按照此 教學來安裝和設定自託管的 GitLab 實例.
2. GitLab CI runner
需要 GitLab CI runner 才能針對您的測試案例執行自動化工作。關於 如何在 Ubuntu 20.04 上設定 GitLab 持續整合管線 為您提供 GitLab CI 伺服器的概述,並向您展示如何觸發工作。如果您還沒有設定 GitLab CI runner 服務,請按照教學中的步驟進行設定。該教學有一個 Node.js 範例應用程式 附帶測試案例 – 我們將在本教學中使用它。
現在,讓我們開始吧!
步驟 1:設定特權 GitLab CI Runner
在關於如何設定 GitLab CI Runner 的教學中,我們使用 sudo gitlab-runner register 指令,這使我們能夠以互動方式新增所需的參數。雖然這適用於我們之前的應用場景(在隔離的 Docker 容器中執行建置和測試),但它可能無法處理建置 Docker 映像檔。建置 Docker 映像檔需要執行器擁有對 Docker 服務的完整存取權限。您可以透過使用官方的 docker-in-docker 映像檔來執行工作。這樣的設定需要授予執行器 特權 執行模式。
雖然授予 特權 執行模式對於建置 Docker 映像檔是必要的,但它會帶來安全性問題。這是因為它涉及放棄容器的安全優勢。您可能認為其他 Docker runner 是安全的,但它們恰好也有相同的問題,正如 官方 Docker 文件中所說明的.
我們將建立另一個具有特權執行模式的 runner。由於上述的安全影響,這將是一個專案專用的 runner。它將接受來自 Node Pipeline 專案,該專案是我們在關於 如何使用 GitLab 設定持續 CI 管線的教學中建立的.
您應該做的第一件事是檢查 共享 Runner 在此專案中已被停用。在 Node Pipeline 專案頁面中,點擊左下角選單的 設定,並在子選單中選擇 CI/CD:
找到 展開 按鈕,位於 Runner 區段,並點擊它以顯示可用 Runner 的詳細資訊:
點擊開關以 停用共享 Runner 此專案。如果您在上一節中新增了專案專用的 Runner,也請將其停用。我們將會新增一個 特權 專案專用 Runner 來執行此專案的工作。這能確保我們不會因為 GitLab 隨機將工作分配給未以特權執行模式註冊的 Runner,而導致建置錯誤。在上方螢幕截圖中,在 特定 Runner 頁籤中,您應該會看到您專案的 註冊 權杖。請記下它,因為您稍後會用到。
| 注意:專案專用 Runner 也可以從 管理面板 > Runners 區段。當您從 runner 清單中選取 runner 時,會進入 runner 設定頁面。向下捲動以檢視區段 限制此 runner 的專案: |
是時候開啟您的終端機了。如果您還沒有完成關於 如何在 Ubuntu 20.04 上設定 GitLab Continuous Integration Pipelines 的教學步驟,請先暫停此教學,並按照這些步驟操作,以便您擁有一台配有 GitLab CI runner 服務的伺服器。否則,請透過 SSH 進入 GitLab CI runner 伺服器 ,並使用您的 sudo 使用者 進行接下來的步驟。
要設定特權專案專用 runner,請在您的終端機輸入以下指令,並替換上方複製的網域名稱和註冊權杖:
|
1 2 3 4 5 6 7 |
sudo gitlab-runner 註冊 -n \ --url https://your-gitlab-instance-domain.com/ \ --註冊-權杖 您的-專案-特定-註冊-權杖 \ --執行器 docker \ --描述 "docker-privileged-builder" \ --docker-映像檔 "docker:latest" \ --docker-privilegedh |
此輸出顯示註冊成功:
若要驗證您的 GitLab 執行個體是否已偵測到該 runner,請返回瀏覽器並重新整理 設定 > CI/CD 頁面。展開 Runner 區段,您應該會在 特定 Runner:
(選填)如果您前往 管理員面板 (透過點擊上方列中的 選單 按鈕並選擇 管理員), 然後選擇 Runner 選單選項:
您應該會進入此頁面,其中顯示連接到您的 GitLab 執行個體, 共享與專案專用的 runner:
至此,您已成功設定了一個可以建置 Docker 映像檔的 runner。
步驟 2:設定 GitLab 的 Docker Registry
某些關鍵的工作流程需要獨立於外部服務。這就是 GitLab 自代管的 Docker Registry 派上用場的地方。它不僅安全,還能確保您可以根據需求靈活地調整工作與管線。要設定 Docker Registry,您將需要修改 GitLab 的設定檔。首先,透過 SSH 進入 GitLab 執行個體,然後使用以下指令開啟檔案:
|
1 |
sudo nano /etc/gitlab/gitlab.rb |
向下捲動,直到您看到 容器登錄設定:
取消註解含有 registry_external_url ,並將其設定為您的 GitLab 實例網域名稱,並指定連接埠 8888 在結尾:
|
1 |
registry_external_url 'https://your-gitlab-domain.com:8888' |
接下來,我們需要透過新增以下行來指定登錄將在何處找到 Let’s Encrypt 憑證。請記得修改為您實際的 GitLab 實例網域名稱:
|
1 2 |
registry_nginx['ssl_certificate'] = "/etc/letsencrypt/live/your-gitlab-domain.com/fullchain.pem" registry_nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/your-gitlab-domain.com/privkey.pem" |
完成後,儲存並關閉檔案。在終端機中輸入以下命令以重新設定 GitLab:
|
1 |
sudo gitlab-ctl reconfigure |
接下來,請等待幾秒鐘讓指令執行完畢。如果成功,您應該會看到以下輸出:
接下來,我們需要確保防火牆 (ufw) 允許流量通過我們使用以下指令分配的 Registry 連接埠:
|
1 |
sudo ufw allow 8888 |
然後,您需要測試 Docker Registry 是否正在執行,方法是從另一台已安裝 Docker 的機器上使用 docker login 指令。如果您尚未在本地環境中設定 Docker,您可以透過 SSH 連線到已安裝 Docker 的 GitLab CI runner 伺服器。接下來,執行以下指令,當然,請指定您的 GitLab 實例網域名稱:
|
1 |
docker login 您的-gitlab-網域.com:8888 |
您的輸出將顯示 Login Succeeded 訊息,如下所示:
這代表 Registry 已成功設定且運作正常。當您建立映像檔時,它們會儲存在 GitLab 伺服器的本機檔案系統中。這對於私有公司的 Registry 來說是沒問題的。然而,如果您計劃將 Registry 開放給大眾使用,您可能需要更大的儲存空間。幸運的是,GitLab 提供了連接到儲存桶的選項。您可以從官方的 GitLab container registry 說明文件 來了解如何為您的 GitLab 實例設定儲存桶。
步驟 3:修改 gitlab-ci.yml 檔案並建置 Docker 映像檔
若要繼續此步驟,您應該擁有 Node Pipeline 專案在您的 GitLab 執行個體上。以下是該專案在 GitLab 上的檢視畫面:
我們討論過 gitlab-ci.yml 作為 GitLab CI runner 在被觸發時讀取的檔案,以了解如何建置您的應用程式並執行自動化測試。我們需要修改此檔案,以加入建置 Docker 映像檔的指令。您可以選擇直接在 GitLab 介面中編輯此檔案。您也可以將其複製(clone)到您的本機電腦,並使用您喜愛的編輯器進行編輯,然後進行 commit 並 git push 回 GitLab。為求簡潔,我們將使用 GitLab 執行個體。
按一下該檔案以將其開啟,然後按一下 編輯 按鈕:
這會開啟檔案以進行編輯。請刪除檔案中的所有內容,並新增以下程式碼:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
映像檔: docker:20-dind 服務: - 名稱: docker:20-dind 別名: docker 指令: ["--tls=false"] 階段: - 建置 - 測試 - 發佈 變數: TEST_IMAGE: gitlab-網域.com:8888/hackins/node_pipeline:$CI_COMMIT_REF_NAME RELEASE_IMAGE: gitlab-網域.com:8888/hackins/node_pipeline:latest DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" before_script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN gitlab-網域.com:8888 建置: 階段: 建置 腳本: - docker 建置 --拉取 -t $TEST_IMAGE . - docker 推送 $TEST_IMAGE 測試: 階段: 測試 腳本: - docker 拉取 $TEST_IMAGE - docker 執行 $TEST_IMAGE npm 測試 發佈: 階段: 發佈 腳本: - docker 拉取 $TEST_IMAGE - docker tag $TEST_IMAGE $RELEASE_IMAGE - docker push $RELEASE_IMAGE only: - master |
在新增上述程式碼片段時,請記得將高亮顯示的部分更新為您的實際詳細資訊。完成後,請按下 提交變更 按鈕。如果您一直在 GitLab 之外進行工作,請提交並推送您的變更。
讓我們來了解我們新增到 .gitlab-ci.yml 檔案中的程式碼在做什麼。第一行告訴 GitLab 使用官方的 Docker-in-Docker 映像檔 並將其附加到 docker-in-docker 服務 (docker:dind)。接著我們定義了用於 build, test、以及 release. build 階段會使用 Dockerfile 中的指令建置映像檔,然後將其上傳到 Docker Registry,這是我們在先前步驟中設定的。
當 build 階段成功時,test 階段會下載該映像檔,將其作為容器執行,並執行 npm test 指令以在其中進行自動化測試。如果 test 階段成功,release 階段就會接管。在 release 階段中,映像檔會被下載並標記為 node_pipeline:latest。接著它會被推回登錄庫。
這只是示範專案的基本設定。對於您的實際專案,您可能會有其他階段,例如 預備環境, 正式環境 等。當您在編輯後儲存檔案時,會觸發流水線。接著它會開始執行工作。返回 Node 流水線 頁面。您應該會看到該工作目前正在執行:
按一下 CI 指示器圖示以檢視該工作的各個階段:
如上方的螢幕截圖所示,根據綠色勾選標記圖示,所有階段皆已成功。您可以按一下每個階段以檢視工作輸出:
在左側選單中,按一下 套件 & 登錄庫 並選擇 容器登錄庫:
這會顯示一個頁面,列出所選專案中可用的 Docker 映像檔。我們建置並發布的映像檔應該會出現在清單中,並帶有標籤 已指派:
如果您的本機環境中已安裝 Docker,您可以提取該映像檔並測試其是否如預期運作。按一下 複製 圖示(位於映像檔標籤名稱旁)。這會將完整的映像檔名稱複製到您的剪貼簿,以便您搭配 docker pull 指令:
|
1 2 |
docker pull feetspark.com:8888/hackins/node_pipeline:latest docker run -it --rm -p 8090:8090 feetspark.com:8888/hackins/node_pipeline:latest |
上述指令將拉取映像檔並在容器中執行:
該應用程式目前在連接埠 8090。如果您開啟瀏覽器並導覽至 your-IP-address:8090,您應該會看到顯示的頁面:
如果您能在瀏覽器中看到這樣的頁面,那麼您已成功建置了 Docker 映像檔並將其分享在私有的 Docker Registry. 未來,如果您對 master 分支進行任何變更,.gitlab-ci.yml 檔案中定義的階段將會執行,如果成功,一個帶有 latest 標籤的新 Docker 映像檔將會被重新建置並推送到 Registry。
結論
在此專案中,您學習了如何將 特權 GitLab runner 新增至您的 GitLab 自管執行個體,以便建置 Docker 映像檔。您也設定了私有 Docker 映像檔 Registry 來託管您的映像檔。使用 Node pipeline 專案,您能夠測試此設定的每個組件,並確保它們如預期般連接與通訊。一旦您的映像檔在登錄檔中可用,您就能夠拉取它並確認它在容器內運行。
這是一篇入門教學,為您提供奠定基礎的基本知識。請遵循官方的 GitLab 文件以深入了解 GitLab。此連結可以提供關於 GitLab Container Registry.
若要獲取更多關於使用 Docker 的資源,您可能想查看更多在 我們的部落格:
- 在 Docker 容器之間共享資料
- 在 Ubuntu 18.04 上建立私有 Docker Registry
- 如何在 Docker 容器與主機之間共用資料
- 清理 Docker 資源 – 映像檔、容器和資料卷
祝您運算愉快!


















留言
目前尚無留言。成為第一個留言的人吧。