將 Docker Image 推送到 Private Docker Registry

Posted on Tue, Mar 8, 2022 Docker

Why?

筆者認為自己的 Docker Image 雖然在本地 build image 以及 run 的時候都沒問題,但包裹後 Image 上到公開的 Docker Hub 難免都有可能出錯。 所以就找到了 Private Registry Server 架設自己的 Docker 私有雲,這樣就可以私下進行 pushpull,測試 OK 之後就可以推送 Docker Hub 啦。

學習內容

在這邊文章中,您將學到以下內容:

Part 1:架設 Docker Registry

筆者這裡選擇使用 docker-compose 架設 registry ,方便管理自己的 Docker 服務。

新增帳號密碼

為了完美實現私人registry ,所以必須建立帳號密碼,保障自架的 registry 服務。

docker run \
  --entrypoint htpasswd \
  httpd:2 -Bbn testuser testpassword > registry-config/htpasswd
🔔

testuser 為帳號名稱 testpassword 為密碼

請記得自行修改帳號密碼

設定 Docker Registry (config.yml)

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
  delete: # 加入刪除功能
    enabled: true
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
auth: # 加入驗證功能
  htpasswd:
    realm: basic-realm
    path: /etc/docker/registry/htpasswd

Docker Registry UI

筆者另外推薦 docker-registry-ui 作為使用者介面,方便查看自己推送到私有 Docker Registry 的 Images。

docker-compose.yaml

version: '3'
services:
  registry:
    restart: always
    image: registry:2
    container_name: registry
    ports:
    - 5000:5000
    volumes:
    - ./docker-registry:/var/lib/registry
    - ./registry-config/config.yml:/etc/docker/registry/config.yml
    - ./registry-config/htpasswd:/etc/docker/registry/htpasswd
    networks:
      extnetwork:
        ipv4_address: 172.28.0.20

  registry-ui:
    restart: always
    image: joxit/docker-registry-ui:latest
    container_name: registry-ui
    ports:
    - 5001:80
    environment:
    - REGISTRY_TITLE=Chinlin's Private Docker Registry
    - NGINX_PROXY_PASS_URL=http://registry:5000
    - SGINLE_REGISTRY=true
    depends_on:
    - registry
    networks:
      extnetwork:
        ipv4_address: 172.28.0.21

networks:
  extnetwork:
    ipam:
      config:
        - subnet: 172.28.0.0/16

部屬

docker-compose up

結果

如果有架成功,進到 http://localhost:5001 就可以看到 Docker Registry UI 了唷!

圖 1 Docker Registry UI

Part 2:推送 Image 到私有的 Docker registry

ℹ️

如果您已經有要推送的 Image, 您可以跳到 推送 的部分。

這裡使用筆者用 C# 實作的 FHIR-Validator-API 作為範例。

複製專案

git clone https://github.com/Chinlinlee/FHIR-Validator-API.git

直接部屬

ℹ️

決定直接部屬而不使用 build 是因為想順便測試專案可以正常運作。

cd FHIR-Validator-API && docker-compose up
⚠️

注意! 此專案內的 docker-compose.yaml 與上面設定的 network 衝突,請記得修改或合併。

部屬結果

Container

如果看到圖2就代表有 container 啟動成功囉!

圖 2 FHIR-Validator-API 順利啟動

Image

圖3是要推送的 Image

圖3 FHIR-Validator-API 的 Image

推送

幫 Image 標記 Tag

首先要幫 Image 作上到 Docker Registry 所需的 Tag

docker tag fhir-validator-api_burni-firely-validator localhost:5000/fhir-validator-api

Push Image

⚠️

注意!進行 Push 前請記得登入 docker

Login

docker login localhost:5000

Push

docker push localhost:5000/fhir-validator-api

推送結果

圖4 Push 的 command line 結果

Docker Registry UI 也可以看到 Image 出現囉!

圖5 Docker Registry UI 主頁面 Push 結果
圖6 Docker Registry UI Image 點進去的內容

Part 3:使用另一台電腦把 Image Pull 下來測試

筆者有用VM架另一台電腦, IP 為 192.168.147.131, 上面架 Docker Registry 的 IP 為 192.168.147.132

您也可以在本地把 Image 刪除在 pull 下來測試。

修改 Docker 設定

vi /etc/docker/daemon.json

內容如下:

{
  "insecure-registries": ["192.168.147.132:5000"]
}

重新啟動 Docker

service docker restart

登入 Docker

docker login 192.168.147.132:5000

Pull Image

docker pull 192.168.147.132:5000/fhir-validator-api

Pull 結果, 可以看到 Downloaded newer image 以及使用 docker images 看到私有的 Image 囉!

圖7 Pull private registry image 結果

測試

docker run 192.168.147.132:5000/fhir-validator-api

執行結果

可以看到 Image 運作正常囉!讚讚

圖8 private registry image run 結果
👀

雖然 Image 運作正常但別忘了自己測試裡面的功能是否可以使用喔!

參考資料