Appearance
GitLab Runner Docker 部署
以 Docker Compose 部署 GitLab Runner,並啟用 Docker-in-Docker(DinD)模式執行 CI/CD 建置任務。
概述
GitLab Runner 是執行 GitLab CI/CD Pipeline job 的代理程式。將 Runner 部署為 Docker 容器,可快速在任何有 Docker 的機器上建立 CI 執行環境,且設定檔(config.toml)可持久化到宿主機目錄,方便版本管理與備份。
Docker Executor 模式下,每個 Pipeline job 都在一個全新的容器中執行,確保環境一致性與隔離性。若 Pipeline 本身需要建置 Docker Image(即 Docker-in-Docker,DinD),則必須啟用 privileged 模式並掛載 Docker socket,否則建置指令無法連線至 Docker daemon。
核心內容
安裝方式:Docker Compose
以 Docker Compose 啟動 Runner 服務:
- Image:
gitlab/gitlab-runner(官方維護) - Docker socket 掛載:
/var/run/docker.sock讓 Runner 可存取宿主機的 Docker daemon - 設定目錄掛載:
./config:/etc/gitlab-runner讓config.toml持久化在宿主機
首次使用:註冊 Runner
Runner 容器啟動後需向 GitLab Server 完成一次性的互動式註冊。指令採問答流程,需依序輸入:
- GitLab Server URL(例如
http://your-gitlab.com/) - Registration Token(從 GitLab Admin → Runners 頁面取得)
- Runner 名稱(自訂)
- Executor 類型(填
docker) - 預設 Docker Image(填
docker:latest)
config.toml 關鍵設定
| 欄位 | 值 | 說明 |
|---|---|---|
concurrent | 10 | 允許同時執行的最大 job 數 |
privileged | true | 必須為 true,才能在 DinD 模式執行 Docker 建置 |
volumes | ["/cache", "/var/run/docker.sock:/var/run/docker.sock"] | 掛載 Docker socket 才能存取宿主 Docker daemon |
問題診斷: 若
privileged或volumes未正確設定,Pipeline 在建置 Docker Image 時會出現lookup docker on x.x.x.x:53: no such host錯誤。
DinD 安全考量
privileged: true 讓容器可存取宿主機的所有裝置,存在安全風險。建議:
- 僅在受信任的內部環境使用
- 定期輪替 Runner token
- 避免在多租戶環境中共用同一個
privilegedRunner
關鍵要點
- Docker Executor 提供乾淨的 per-job 執行環境,是最常見的 Runner 部署方式
privileged: true+ Docker socket 掛載是 DinD 的必要條件,缺一不可config.toml修改後 Runner 會自動偵測並重新載入,無需重啟容器- 官方文件:https://docs.gitlab.com/runner/install/docker.html
實際應用
主要用途:
- 建置 Docker Image 並推送至 Container Registry(ACR、DockerHub 等)
- 執行自動化測試
- 觸發 Kubernetes 部署(搭配
kubectl或 Helm)
若使用 Azure 環境,可搭配 Azure DevOps Pipeline 作為替代方案,或併行使用(GitLab 做程式碼管理,Azure DevOps 做部署)。
部署設定參考
以下為實際部署時使用的完整設定,供日後查詢與複製使用。
環境參數
| 項目 | 值 |
|---|---|
| Runner Image | gitlab/gitlab-runner |
| GitLab Server URL | http://rdgit.wiwynn.com/ |
| Runner ID | 73 |
| Executor | docker |
| 預設 Image | docker:latest |
| concurrent | 10 |
docker-compose.yml
yaml
services:
gitlab_runner:
image: gitlab/gitlab-runner
container_name: gitlab_runner
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./config:/etc/gitlab-runner
command: register完整 config.toml
toml
concurrent = 10
check_interval = 0
shutdown_timeout = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab runner"
url = "http://rdgit.wiwynn.com/"
id = 73
token = "SCnWPByo3QtH4exqsqD6"
token_obtained_at = 2023-01-04T10:12:11Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:latest"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
shm_size = 0操作指令
bash
# 首次:互動式註冊 Runner
docker run --rm -it \
-v "$(pwd)"/config:/etc/gitlab-runner \
gitlab/gitlab-runner register
# 正式啟動(設定完成後)
docker compose up -d
# 查看 Runner 執行狀態
docker logs -f gitlab_runner相關概念
- GitLab Omnibus (Docker) HTTPS 連線失敗排除 SOP — GitLab Server 端的部署與排錯
- Azure DevOps Pipeline CI/CD 設定指南 — Azure 平台的 CI/CD Pipeline 設定
- GitLab CI/CD 部署至 Azure App Service — 以 GitLab Runner 執行 Azure CLI 部署至 App Service 的完整 CI Job 設定