建立私有 Docker Registry
前言
該如何自架 docker registry 呢? docker registry 可以幫助我們做什麼事情呢? docker registry 是可以將我們打包好的 docker image,放置到 docker registry 上面,在我們開始要佈署服務時,從 docker registry 拉取我們打包好的 image 進行佈署,也就是說 docker registry 是我們存放 images 的倉庫,今天我們將教大家如何自架 docker registry,建造我們的私有倉庫。
準備主機
準備一台主機,先在本機安裝 docker engine 和 docker compose,接著安裝 apache2-utils 和 mkcert,我們要使用 apache2-utils 來控管伺服器內部存取身分,Docker Registry 支援帳密登入,前提要啟用 TLS HTTPS 連線,並使用 htpasswd 工具設定雜湊密碼檔,且安裝 mkcert 建立 TLS 憑證,以下安裝指令
準備主機
準備一台主機,先在本機安裝 docker engine 和 docker compose,接著安裝 apache2-utils 和 mkcert,我們要使用 apache2-utils 來控管伺服器內部存取身分,Docker Registry 支援帳密登入,前提要啟用 TLS HTTPS 連線,並使用 htpasswd 工具設定雜湊密碼檔,且安裝 mkcert 建立 TLS 憑證,以下安裝指令
sudo apt-get install apache2-utils mkcert
建立 /var/registry/certs 路徑,並切換到此路徑
sudo mkdir -p /var/registry/certs
cd /var/registry/certs
接著在/var/registry/certs 路徑,建立 TSL 憑證
sudo mkcert -install
|_ The local CA is already installed in the system trust store! 👍
sudo mkcert localhost
|_ Created a new certificate valid for the following names 📜
|_ - "localhost"
|_
|_ The certificate is at "./localhost.pem" and the key at "./localhost-key.pem" ✅
|_
|_ It will expire on 5 January 2026 🗓
ls *.pem
|_ localhost-key.pem localhost.pem
建立 /var/registry/auth 路徑,並切換此路徑
sudo mkdir -p /var/registry/auth
cd /var/registry/auth
接著在 /var/registry/auth 路徑,建立帳號密碼
sudo htpasswd -Bbn user 123456 | sudo tee ./htpasswd > /dev/null
ls -l htpasswd
|_ -rw-r--r-- 1 root root 67 Oct 5 02:47 htpasswd
cat htpasswd
|_ user:$2y$05$g/sNIT/FM4rWtEIDvjTLEuuj3wGWAwxzgQgcVRK0vC/6KVr6uRNtu
準備 Docker Compose 安裝 registry 以及 docker registry browser 這兩個鏡像
version: "3"
services:
registry:
container_name: registry
restart: always
image: registry:2
ports:
- 5000:5000
environment:
REGISTRY_HTTP_TLS_CERTIFICATE: /certs/localhost.pem
REGISTRY_HTTP_TLS_KEY: /certs/localhost-key.pem
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
REGISTRY_STORAGE_DELETE_ENABLED: true
volumes:
- /var/registry/data:/var/lib/registry
- /var/registry/certs:/certs
- /var/registry/auth:/auth
docker_registry_browser:
container_name: docker_registry_browser
restart: always
image: klausmeyer/docker-registry-browser
ports:
- 8080:8080
environment:
DOCKER_REGISTRY_URL: https://192.168.18.35:5000
NO_SSL_VERIFICATION: true
TOKEN_AUTH_USER: user
TOKEN_AUTH_PASSWORD: 123456
ENABLE_DELETE_IMAGES: true
volumes:
- /var/registry/certs:/certs
registry 鏡像
registry 是 docker 推出的鏡像,可以來建造我們的私有倉庫,快速提升開發效率,減少伺服器資源負擔
registry 的 environment 設定
REGISTRY_HTTP_TLS_CERTIFICATE: 取得剛才使用 mkcert 的 localhost.pem 檔案路徑
REGISTRY_HTTP_TLS_KEY: 取得剛才使用 mkcert 的 localhost-key.pem 檔案路徑
REGISTRY_AUTH: 設定驗證 http 環境變數
REGISTRY_AUTH_HTPASSWD_PATH: 設定驗證 http 檔案路徑
REGISTRY_AUTH_HTPASSWD_REALM: 設定驗證網域名稱
REGISTRY_STORAGE_DELETE_ENABLED: 啟用 registry 倉庫可被刪除
docker registry browser 鏡像
docker registry browser 是我個人推薦的一個鏡像,可以用來查看 docker registry 裡面有那些鏡像,並且提供刪除鏡像功能
docker registry browser 的 environment 設定
DOCKER_REGISTRY_URL: 設定 docker registry 位置
NO_SSL_VERIFICATION: 設定是否啟用 SSL 驗證
TOKEN_AUTH_USER: 設定 docker registry 登入使用者名稱
TOKEN_AUTH_PASSWORD: 設定 docker registry 登入密碼
ENABLE_DELETE_IMAGES: 設定是否啟用鏡像刪除按鈕
檢查 docker registry 是否運作正常
當安裝完 docker registry 後,在瀏覽器輸入我們鏡像倉庫網址: https://{自己的 ip}:{自己設定的 port}/v2,然後會要求輸入帳號密碼,輸入剛才我們設定的帳號密碼
登入完成後會進入一個空物件話面代表成功
再來輸入 https://{自己的 ip}:{自己設定的 port}/v2/_catalog,這可以看自己有上傳那些鏡像,目前當然是沒有
檢查 docker registry browser 是否運作正常
安裝完 docker registry browser 輸入 http://{自己 ip}:{自己設定的 port},來檢查 docker registry browser 是否正常,然後會要求輸入帳號密碼,輸入剛才我們設定的帳號密碼
登入完成後會進入一個 docker registry browser 畫面,會更清楚裡面有哪些 image,現在是還沒有任何 image 的狀態
實際操作上傳 docker registry 倉庫
在所有服務建置完成後,我們來實際上傳 image 套我們的倉庫,首先先抓取 nginx 的 alpine 版本
docker pull nginx:alpine
接著我們對這個 image 給一個新的 tag image
docker tag 192.168.18.35:5000/nginx:alpine
接著先登入我們的 docker registry,輸入以下指令後,會要求我們輸入帳號密碼,也就是先前我們設定的帳號密碼
docker login 192.168.18.35:5000
登入成功後,再來上傳我們的 image
docker push 192.168.18.35:5000/nginx:alpine
如果上傳出現以下訊息
The push refers to repository [192.168.18.35:5000/nginx]
Get "https://192.168.18.35:5000/v2/": tls: failed to verify certificate: x509: cannot validate certificate for 192.168.44.136 because it doesn't contain any IP SANs
如果是 linux 在本機 /etc/docker/ 底下建立 daemon.json 檔案,建立以下內容
{
"group": "dockerroot",
"insecure-registries": [
"192.168.44.136:5000"
],
"live-restore": true
}
如果是 windows 直接在 docker desktop 新增相同內容
最後再輸入一次剛才的 docker push 即可上傳成功,然後在瀏覽器打開 docker registry browser 即可看到 nginx alpine 版本