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 images
registry镜像下下来后。通过以下的命令启动,并将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 &