有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似。
使用私有仓库有许多优点:
1 2 |
|
目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如果需要安装registry v2,只需下载registry:2.2即可。Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。废话不多说了,下面记录下Docker私有仓库构建的过程:
选择一台服务器(内外网地址:47.107.154.32)作为注册服务器,用于搭建私有仓库。(该机器要安装了Docker环境)
1)从Docker官方仓库里下载registry镜像
这里直接下载latest,下载完成后通过 docker images 命令查看本地镜像
2)在容器中启动私有镜像仓库并将私有仓库的存储目录挂载到宿主机指定目录中,这样做的目的是,如果容器被删除了,存储在容器中的镜像就不会被删掉(默认情况下如果容器被删除,则存放于容器中的镜像也会丢失
),registry默认的存储路径为容器的/tmp/registry路径下,这里我们将/usr/local/registry挂载到容器的/tmp/registry
docker run -d --name=my_registry -p 5000:5000 -v /usr/local/registry:/tmp/registry docker.io/registry
到此我们已经启动了一个私有镜像仓库的容器,地址为:47.107.154.32:5000
3) 测试
接下来可以把一个本地镜像push(如下面的mysql镜像)到私有仓库中。由于上传到私有仓库需要打标签,
[root@izwz9ad1jbc6fvd5qlmo2lz local]# docker tag docker.io/mysql:5.7 47.107.154.32:5000/mysql
[root@izwz9ad1jbc6fvd5qlmo2lz local]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
47.107.154.32:5000/mysql latest 702fb0b7837f 2 weeks ago 372 MB
docker.io/mysql 5.7 702fb0b7837f 2 weeks ago 372 MB
docker.io/cancerhw/nginx latest dbfc48660aeb 3 weeks ago 109 MB
docker.io/registry latest 2e2f252f3c88 8 weeks ago 33.3 MB
把上面修改tag后的镜像上传到私有仓库
[root@izwz9ad1jbc6fvd5qlmo2lz local]# docker push 47.107.154.32:5000/mysql
The push refers to a repository [47.107.154.32:5000/mysql]
Get https://47.107.154.32:5000/v1/_ping: http: server gave HTTP response to HTTPS client
问题原因:因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。
为了解决这个问题需要在启动docker server时增加启动参数为默认使用http访问。
这里的解决办法是在docker client 端中的/etc/docker/daemon.json 文件中添加
"insecure-registries":["47.107.154.32:5000"].当前环境CentOS7
修改配置后需要重启docker服务:service docker restart
由于docker服务重启后,所有容器都会被关闭。所以需要在docker重启后再次启动容器
[root@izwz9ad1jbc6fvd5qlmo2lz]# docker start my_registry
再次提交到私有仓库
[root@izwz9ad1jbc6fvd5qlmo2lz docker]# docker push 47.107.154.32:5000/mysql
查看私有仓库里的镜像(一定要保证下面能查看到仓库里有镜像!如果仓库里没有镜像,那么客户端机器就无法从该私有仓库下载镜像了)
[root@izwz9ad1jbc6fvd5qlmo2lz]# curl -XGET http://47.107.154.32:5000/v2/_catalog //即该私有仓库里有mysql镜像
{"repositories":["mysql"]}
[root@izwz9ad1jbc6fvd5qlmo2lz]# curl -XGET http://47.107.154.32:5000/v2/mysql/tags/list
{"name":"mysql","tags":["latest"]}
或者浏览器里访问(103.110.186.23是注册机的外网ip,iptables防火墙内开放5000端口访问):
http://47.107.154.32:5000/v2/_catalog
http://47.107.154.32:5000/v2/mysql/tags/list
现在可以将本地的mysql和47.107.154.32:5000/mysql镜像都删除,然后从私有仓库中下载
[root@izwz9ad1jbc6fvd5qlmo2lz]# docker rmi mysql
[root@izwz9ad1jbc6fvd5qlmo2lz]# docker rmi 47.107.154.32:5000/mysql
[root@izwz9ad1jbc6fvd5qlmo2lz]# docker pull 47.107.154.32:5000/mysql
[root@izwz9ad1jbc6fvd5qlmo2lz]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
47.107.154.32:5000/mysql latest 5hc8a2ip413w 3 days ago 372 MB
-----------------------------------------------------------------------------
这样,也就可以在同一局域网内的其他机器上,从该私有仓库中pull下来该镜像。
比如在192.168.1.17服务器上拉取该私有仓库的mysql镜像进行容器创建
(注意,要在该机器的/etc/docker/daemon.json配置文件里添加--insecure-registry=47.107.154.32:5000参数)
[root@linux-node2 ~]# docker pull 47.107.154.32:5000/mysql
[root@linux-node2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
47.107.154.32:5000/mysql latest 2ec9e2eb978a 3 days ago 372 MB