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 運作正常但別忘了自己測試裡面的功能是否可以使用喔!







