該如何自架 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 憑證,以下安裝指令
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 是 docker 推出的鏡像,可以來建造我們的私有倉庫,快速提升開發效率,減少伺服器資源負擔
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 裡面有那些鏡像,並且提供刪除鏡像功能
DOCKER_REGISTRY_URL: 設定 docker registry 位置
NO_SSL_VERIFICATION: 設定是否啟用 SSL 驗證
TOKEN_AUTH_USER: 設定 docker registry 登入使用者名稱
TOKEN_AUTH_PASSWORD: 設定 docker registry 登入密碼
ENABLE_DELETE_IMAGES: 設定是否啟用鏡像刪除按鈕
當安裝完 docker registry 後,在瀏覽器輸入我們鏡像倉庫網址: https://{自己的 ip}:{自己設定的 port}/v2,然後會要求輸入帳號密碼,輸入剛才我們設定的帳號密碼
登入完成後會進入一個空物件話面代表成功
再來輸入 https://{自己的 ip}:{自己設定的 port}/v2/_catalog,這可以看自己有上傳那些鏡像,目前當然是沒有
安裝完 docker registry browser 輸入 http://{自己 ip}:{自己設定的 port},來檢查 docker registry browser 是否正常,然後會要求輸入帳號密碼,輸入剛才我們設定的帳號密碼
登入完成後會進入一個 docker registry browser 畫面,會更清楚裡面有哪些 image,現在是還沒有任何 image 的狀態
在所有服務建置完成後,我們來實際上傳 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 版本