有时候使用 Docker Hub 这样的公共仓库可能不方便,并且公司的私有镜像为了业务安全,也不会push到docker hub上,用户可以创建一个本地仓库供私人使用。类似于git 和maven一样,同时节省服务器下载和上传镜像带宽。
那什么是docker registry呢
Docker Registry由三个部分组成:index,registry,registry client。
可以把Index认为是负责登录、负责认证、负责存储镜像信息和负责对外显示的外部实现,而registry则是负责存储镜像的内部实现,而Registry Client则是docker客户端。
我这台服务器已经安装docker1.6版本,至于怎么安装我就不多说了,可以参考这里,centos上部署docker
[root@docker data]# docker -v
Docker version 1.6.2, build ba1f6c3/1.6.2
[root@docker data]# uname -r
4.1.2-1.el7.elrepo.x86_64
安装docker-registry
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
如果本地没有下载过docker-registry,则首次会pull registry 运行时会映射路径和端口,以后就可以从/data/registry下找到私有仓库,这里查看下我本机的镜像
[root@docker data]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/registry latest ddfbba49d0b6 21 hours ago 423.6 MB
docker.io/centos latest 7322fbe74aa5 3 weeks ago 172.2 MB
从上面信息可以分别看出
来自于哪个仓库,比如 centos
镜像的标记,比如 latest 最后一个版本
它的 ID 号(唯一)
创建时间
镜像大小
可以看到registry容器已经启动
[root@docker data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad3469d9302b registry:latest "docker-registry" 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp compassionate_newton
4c86d4e541e3 centos:latest "/bin/bash" 23 hours ago Exited (0) 23 hours ago high_galileo
e79a883fdc8b centos:latest "/bin/echo 'Hello Wo 23 hours ago Exited (0) 23 hours ago stoic_lalande
访问私有仓库
[root@docker data]# curl 127.0.0.1:5000/v1/search
{"num_results": 0, "query": "", "results": []}
因为我们还没有像私有容器提交镜像,所以这里返回空,下面我们提交一个镜像试试,上面可以看到我本地有一个registry的镜像
使用docker tag 将我本地的id为7322fb474aa5的这个镜像标记为 127.0.0.1:5000/centos
命令格式为 docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
[root@docker data]# docker tag 7322fbe74aa5 127.0.0.1:5000/centos
[root@docker data]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/registry latest ddfbba49d0b6 21 hours ago 423.6 MB
docker.io/centos latest 7322fbe74aa5 3 weeks ago 172.2 MB
127.0.0.1:5000/centos latest 7322fbe74aa5 3 weeks ago 172.2 MB
[root@docker data]#
镜像的 ID 唯一标识了镜像,注意到 docker.io/centos和 127.0.0.1:5000/centos具有相同的镜像 ID,说明它们实际上是同一镜像。
PUSH 镜像
然后我们将这个镜像push到私有镜像库
[root@docker data]# docker push 127.0.0.1:5000/centos
The push refers to a repository [127.0.0.1:5000/centos] (len: 1)
Sending image list
Pushing repository 127.0.0.1:5000/centos (1 tags)
f1b10cd84249: Image successfully pushed
c852f6d61e65: Image successfully pushed
7322fbe74aa5: Image successfully pushed
Pushing tag for rev [7322fbe74aa5] on {http://127.0.0.1:5000/v1/repositories/centos/tags/latest}
然后我么拿在看下私有仓库中有没有镜像
[root@docker data]# curl 127.0.0.1:5000/v1/search
{"num_results": 1, "query": "", "results": [{"description": "", "name": "library/centos"}]}
可以看到一家有个叫centos的镜像存在了,就是我刚刚上传的镜像。然后你的其他服务器就可以来下载这个镜像使用了
docker pull 192.168.1.222:5000/centos
如果本地有很多镜像想批量上传怎么办,可以用这个脚本
$ wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh; sudo chmod a+x push_images.sh
$ ./push_images.sh ubuntu:latest centos:centos7
这里大家可以看到,访问我们私有库的时候,没有任何权限控制,也就是说别人知道这个仓库地址也可以push 和pull镜像,这样很不安全,大家可以在网络层面,也可以前面加层nginx,然后nginx反向代理本地的5000端口