Why?
筆者認為自己的 Docker Image 雖然在本地 build image 以及 run 的時候都沒問題,但包裹後 Image 上到公開的 Docker Hub 難免都有可能出錯。 所以就找到了 Private Registry Server 架設自己的 Docker 私有雲,這樣就可以私下進行 push、pull,測試 OK 之後就可以推送 Docker Hub 啦。
學習內容
在這邊文章中,您將學到以下內容:
- 架設私有的 Docker Registry
 - 推送 Image 到私有的 Docker registry
 - 使用另一台電腦把 Image 拉下來測試
 
Part 1:架設 Docker Registry
筆者這裡選擇使用 docker-compose 架設 registry ,方便管理自己的 Docker 服務。
新增帳號密碼
為了完美實現私人的 registry  ,所以必須建立帳號密碼,保障自架的 registry 服務。
docker run \
  --entrypoint htpasswd \
  httpd:2 -Bbn testuser testpassword > registry-config/htpasswdtestuser 為帳號名稱
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/htpasswdDocker 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 了唷!
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 啟動成功囉!
Image
圖3是要推送的 Image
推送
幫 Image 標記 Tag
首先要幫 Image 作上到 Docker Registry 所需的 Tag
docker tag fhir-validator-api_burni-firely-validator localhost:5000/fhir-validator-apiPush Image
注意!進行 Push 前請記得登入 docker
Login
docker login localhost:5000Push
docker push localhost:5000/fhir-validator-api推送結果
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:5000Pull Image
docker pull 192.168.147.132:5000/fhir-validator-apiPull 結果, 可以看到 Downloaded newer image 以及使用 docker images 看到私有的 Image 囉!
測試
docker run 192.168.147.132:5000/fhir-validator-api執行結果
可以看到 Image 運作正常囉!讚讚
雖然 Image 運作正常但別忘了自己測試裡面的功能是否可以使用喔!







