鏡像能夠很方便直接 push 到 docker 的公共倉庫,就好像 github 同樣,可是咱們在開發中不少時候都不想公開鏡像文件,這時就須要搭建 docker 的私有倉庫,就好像 gitlab 同樣。linux
在 上一篇 構建出鏡像後,咱們能夠部署一個私有鏡像倉庫用來存放咱們的鏡像。git
啓動一個私有倉庫也很是簡單,在服務器上執行命令github
docker run -d -p 5000:5000 --name="docker-registry" --restart=always -v /root/docker/registry/:/var/lib/registry/ registry
即後臺啓動 registry 鏡像構建出來的容器,並命名爲 docker-registry
,端口號映射爲 5000
到 5000
。docker
--restart=always
表明當容器由於某些緣由中止時,無論退出碼是什麼都自動重啓。除了 always
還有 on-failure
表明只有退出碼不爲 0 時才重啓,而且接受重啓次數參數:--restart=on-failture:5
express
-v
指定將宿主機的 /root/docker/registry/
目錄掛載到容器的 /var/lib/registry/
目錄。這樣咱們不用進入容器,在宿主機上就能訪問到容器內咱們感興趣的目錄了。json
爲何是/var/lib/registry/
目錄?
倉庫默認存放鏡像等信息在容器的/var/lib/registry/docker
目錄下,能夠進入該目錄查看已上傳鏡像信息。
執行 run
命令成功後使用 docker ps
能看到 registry 服務已經啓動:segmentfault
要上傳鏡像到私有倉庫,須要在鏡像的 tag 上加入倉庫地址:centos
docker tag express-app 111.111.111.111:5000/sunhengzhe/express-app:v1
爲了避免與其餘鏡像衝突,能夠加入命名空間如 sunhengzhe
,另外最好給鏡像打上 tag 如 v1
。安全
注意倉庫地址沒有加協議部分,docker 默認的安全策略須要倉庫是支持 https
的,若是服務器只能使用 http 傳輸,那麼直接上傳會失敗,須要在 docker 客戶端的配置文件中進行聲明。bash
更改完須要 Apply & Restart
在 /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:v1
若是出現 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:v1