建立私有 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 憑證,以下安裝指令

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 名子

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 版本



留言

此網誌的熱門文章

Gitlab CI/CD 之 Group Runner

Docker 之如何安裝 Docker 容器

Docker 之初體驗