建立 Docker 私有 Registry 文章首圖

建立 Docker 私有 Registry

建立 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 影像管理基礎設施。