建立 Docker 私有 Registry:打造企業級影像管理基礎
在雲端運算與微服務架構普及的今天,Docker 容器技術已成為軟體開發與部署的標準。然而,當團隊規模擴大或涉及敏感業務邏輯時,將 Docker 映像檔(Image)推送到公開的 Docker Hub 往往存在資安風險或頻寬瓶頸。此時,建立自己的私有 Registry(私有倉庫)便成為必要之舉。本文將帶領中階 Linux 使用者,在 Ubuntu 22.04 或 Debian 12 環境中,快速搭建一套安全且高效的私有 Docker Registry。
環境準備與安裝
首先,我們需要確保系統已安裝 Docker Engine。對於 Ubuntu 22.04 或 Debian 12 使用者,官方提供的安裝腳本是最簡便的方式。請以 root 權限或具備 sudo 權限的使用者執行以下指令:
# 安裝 Docker 官方提供的安裝腳本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
安裝完成後,請確認 Docker 服務正在運行,並將其設定為開機啟動:
sudo systemctl enable --now docker
sudo systemctl status docker
接著,我們需要拉取 Docker 官方的 Registry 容器映像檔。這是最輕量級的私有倉庫實現方式,適合大多數中小型團隊使用:
docker pull registry:2
配置 HTTPS 與憑證
雖然在開發環境中使用 HTTP 即可運行,但在生產環境中,為了防止影像內容被竊聽或篡改,強烈建議啟用 HTTPS。我們可以使用 mkcert 工具來生成本地信任的憑證,這比購買商業憑證更適合內部測試或私有部署。
若系統尚未安裝 mkcert,可透過以下指令安裝:
# Ubuntu/Debian 安裝 mkcert
sudo apt update
sudo apt install -y mkcert
建立憑證目錄並生成憑證:
# 建立存放憑證的目錄
mkdir -p ~/certs
# 生成本地憑證,假設你的內部網域為 registry.local
mkcert -cert-file ~/certs/cert.pem -key-file ~/certs/key.pem registry.local 127.0.0.1 ::1
啟動私有 Registry 服務
現在,我們可以將生成的憑證掛載到容器中,並啟動 Registry 服務。請注意,我們需要將主機的憑證目錄映射到容器的 /certs 路徑,並設定環境變數以啟用 HTTPS 支援。
docker run -d \
--name private-registry \
--restart=always \
-p 5000:5000 \
-v ~/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/cert.pem \
-e REGISTRY_HTTP_TLS_KEY=/certs/key.pem \
registry:2
註:若僅用於測試且不想處理憑證問題,可移除 -p 5000:5000 後的 `-e REGISTRY_HTTPTLS` 相關參數,並改用 HTTP 協議,但請務必注意安全風險。*
由於我們使用了本地生成的憑證,Docker daemon 需要被配置為信任該憑證,否則在推送或拉取映像檔時會報錯。請將憑證複製到 Docker 的信任目錄:
sudo cp ~/certs/cert.pem /etc/docker/certs.d/registry.local:443/ca.crt
sudo systemctl restart docker
驗證與使用
配置完成後,讓我們測試私有 Registry 是否運作正常。首先,我們需要一個現有的映像檔作為測試對象。這裡以 hello-world 為例:
# 拉取一個測試映像檔
docker pull hello-world
# 重新標記映像檔,指向我們的私有 Registry
# 格式為:docker tag <來源映像檔> <私有倉庫地址>/<映像檔名稱>:<標籤>
docker tag hello-world registry.local:443/my-hello-world:v1
# 推送映像檔到私有倉庫
docker push registry.local:443/my-hello-world:v1
若推送成功,表示私有 Registry 已正確運作。接著,我們可以嘗試從私有倉庫拉取該映像檔:
# 先移除本地映像檔
docker rmi hello-world registry.local:443/my-hello-world:v1
# 從私有倉庫拉取
docker pull registry.local:443/my-hello-world:v1
常見問題與排除
1. 推送時出現 "http: server gave HTTP response to HTTPS client" 錯誤
這通常發生在 Docker 配置了 HTTPS,但 Registry 實際運行在 HTTP 上,或反之。請檢查 docker run 指令中的 -e REGISTRY_HTTP_TLS_* 參數是否與實際執行的協議一致。若使用 HTTP,請移除 TLS 相關參數,並在 Docker daemon 配置中允許非安全註冊中心:
# 編輯 /etc/docker/daemon.json
{
"insecure-registries": ["registry.local:5000"]
}
然後重啟 Docker 服務。
2. 權限問題導致無法寫入憑證目錄
在 Linux 系統中,Docker 容器內的使用者可能無法讀取宿主機的憑證檔案。請確保 ~/certs 目錄的權限正確,通常設置為 755 即可:
chmod 755 ~/certs
小結
建立 Docker 私有 Registry 不僅能提升團隊內部的開發效率,更能確保企業核心資產的資安合規。透過上述步驟,我們在 Ubuntu 22.04 或 Debian 12 上成功部署了一套具備 HTTPS 加密功能的私有倉庫。對於更大型的企業環境,建議進一步整合 LDAP/AD 認證、S3 儲存後端以及 Nginx 反向代理,以實現高可用與集中化管理。希望這篇文章能幫助您順利搭建起屬於自己的 Docker 影像管理基礎設施。