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/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 了唷!
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-api
Push Image
注意!進行 Push 前請記得登入 docker
Login
docker login localhost:5000
Push
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:5000
Pull Image
docker pull 192.168.147.132:5000/fhir-validator-api
Pull 結果, 可以看到 Downloaded newer image 以及使用 docker images
看到私有的 Image 囉!
測試
docker run 192.168.147.132:5000/fhir-validator-api
執行結果
可以看到 Image 運作正常囉!讚讚
雖然 Image 運作正常但別忘了自己測試裡面的功能是否可以使用喔!