Docker: 上傳映象至私有倉庫
映象可以很方便直接 push 到 docker 的公共倉庫,就好像 github 一樣,但是我們在開發中很多時候都不想公開映象檔案,這時就需要搭建 docker 的私有倉庫,就好像 gitlab 一樣。
在上一篇 構建出映象後,我們可以部署一個私有映象倉庫用來存放我們的映象。
啟動私有 Registry
啟動一個私有倉庫也非常簡單,在伺服器上執行命令
docker run -d -p 5000:5000 --name="docker-registry" --restart=always -v /root/docker/registry/:/var/lib/registry/ registry
即後臺啟動 registry 映象構建出來的容器,並命名為 docker-registry
,埠號對映為 5000
到 5000
。
--restart=always
代表當容器因為某些原因停止時,不管退出碼是什麼都自動重啟。除了 always
還有 on-failure
代表只有退出碼不為 0 時才重啟,並且接受重啟次數引數: --restart=on-failture:5
-v
指定將宿主機的 /root/docker/registry/
目錄掛載到容器的 /var/lib/registry/
目錄。這樣我們不用進入容器,在宿主機上就能訪問到容器內我們感興趣的目錄了。
為什麼是 /var/lib/registry/
目錄?
倉庫預設存放映象等資訊在容器的 /var/lib/registry/docker
目錄下,可以進入該目錄檢視已上傳映象資訊。
執行 run
命令成功後使用 docker ps
能看到 registry 服務已經啟動:
上傳映象
要上傳映象到私有倉庫,需要在映象的 tag 上加入倉庫地址:
docker tag express-app 111.111.111.111:5000/sunhengzhe/express-app:v1
為了不與其他映象衝突,可以加入名稱空間如 sunhengzhe
,另外最好給映象打上 tag 如 v1
。
注意倉庫地址沒有加協議部分,docker 預設的安全策略需要倉庫是支援 https
的,如果伺服器只能使用 http 傳輸,那麼直接上傳會失敗,需要在 docker 客戶端的配置檔案中進行宣告。
mac 配置
更改完需要 Apply & Restart
centos 系統
在 /etc/docker/daemon.json
檔案中寫入:
{ "registry-mirror": [ "https://registry.docker-cn.com" ], "insecure-registries": [ "[私有倉庫 ip:port]" ] }
然後重啟 docker
systemctl restart docker
推送映象
打完 tag
後使用 push
命令推送即可:
docker push 111.111.111.111:5000/sunhengzhe/express-app
推送失敗
如果出現 Retrying in 5 seconds
然後上傳失敗的問題。可以首先在伺服器上使用 logs
命令檢視日誌:
docker logs -f docker-registry
-f
代表持續輸出檔案內容。
如果出現 filesystem: mkdir /var/lib/registry/docker: permission denied
,可能是 一個 selinux 問題 ,需要在伺服器上對掛載目錄進行處理:
chcon -Rt svirt_sandbox_file_t /root/docker/registry/
此示例中即 /root/docker/registry/
。
拉取映象
使用 pull
命令即可
docker pull 111.111.111.111:5000/sunhengzhe/express-app