Docker官方的Docker hub盡管提供了有非常多image,也基本上包括了我們須要使用的,可是其訪問起來比較慢。假設自己要定制image。多台server之間的共享使用此image非常不方便。這個時候我們就迫切須要一個本地的私有倉庫了。
以下的圖說明了Docker私有倉庫的作用。
Docker私有倉庫能夠通過docker-registry項目來實現,通過http服務來上傳下載。docker-registry在Docker hub上已有現成的image。
$ docker search registry
選擇第1個。將其從Docker hub上down下來(最好帶tag,不然會將全部的tag都down下來)。
$ docker pull registry這個下載的過程有點長,耐心等待一下。O(∩_∩)O哈哈~。
$ docker imagesregistry鏡像下下來后。通過以下的命令啟動,並將registry的容器存儲images的文件夾映射到宿主server的/opt/docker/registry文件夾。
$ docker run -d -p 5000:5000 -v /opt/docker/registry:/tmp/registry registry
啟動以后在瀏覽器中輸入http://主機IP:5000或者http://主機IP:5000/v1/search。假設有顯示就說明Docker私有倉庫已經建好了。下一步將本地的images push到Docker私有倉庫。
現將本地的image打一個tag,新image名稱必須帶有"主機IP:5000"。例如以下(我這里用127.0.0.1僅僅是舉例)。
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry latest 5562556b14f9 8 days ago 422.9 MB 127.0.0.1:5000/registry latest 5562556b14f9 8 days ago 422.9 MB假設缺少上面這一步。直接push image,會出現例如以下錯誤。
[docker@docker1 ~]$ docker push registry The push refers to a repository [registry] (len: 1) Sending image list 2014/10/27 15:48:25 Error: Status 403 trying to push repository registry: Account is not Active
運行例如以下push命令后。能夠在http://主機IP:5000/v1/search看到存儲到Docker私有倉庫的信息。
$ docker push 127.0.0.1:5000/registry下次能夠通過pull命令下載到其它server上,那可就快多了。
pull的時候記得帶"主機IP:5000",不然還是去Docker hub上下載而不是私有倉庫下載,例如以下命令。
$ docker pull 127.0.0.1:5000/registry
到此。私有倉庫存取image就能夠了。
假設是save/load的image。會出現以下的錯誤。對於這種image。最好又一次build對應的Dockerfile。
[docker@docker1 ~] $docker push 127.0.0.1:5000/nexus The push refers to a repository [127.0.0.1:5000/nexus] (len: 1) Sending image list Pushing repository 127.0.0.1:5000/nexus (1 tags) 2014/10/27 14:50:37 HTTP code 400 while uploading metadata: {"error": "Missing key `id' in JSON"}
docker1.3.0以后的版本號。增加了認證機制,docker pull & push會報例如以下錯誤:
[docker@docker1 ~]$ docker push 127.0.0.1:5000/registry 2014/12/02 11:33:04 Error: Invalid registry endpoint https://127.0.0.1:5000/v1/: Get https://127.0.0.1:5000/v1/_ping: EOF. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 127.0.0.1:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/127.0.0.1:5000/ca.crt使用registry的server和client啟動docker時都須要加上"--insecure-registry"參數,pull和push才可正常操作。例如以下命令(ip都是registry所在server的ip地址)。
[docker@docker1 ~]$ service docker stop [docker@docker1 ~]$ nohup docker -H unix:///var/run/docker.sock --insecure-registry 127.0.0.1:5000 -d &