docker四步搭建本地私有镜像仓库
介绍
众所周知,docker hub就是完全公开的仓库,在不做登陆的情况下就可以随意pull拉取仓库中的镜像,在注册账号并登陆后也可push镜像到仓库中。但做开发的时候多少会有需要私有仓库的情况,比如在制作镜像的时候可能仅仅是为了满足企业开发,而特地去制作一些能满足需求的镜像,而这些镜像对外是需要保密的,这时候可以考虑在本地搭建一个私有的镜像仓库。
流程
一、拉取registry镜像
命令:docker pull registry
说明:没有指定tag默认拉取registry:latest镜像
tip:由于环境没网,我从别的机子上拉取镜像,然后使用docker save registry:latest>registry.tar 将镜像打成压缩包然后拷贝过来,再使用docker load<registry.tar 将压缩包作为镜像导入到docker环境中。
二、运行registry镜像启动一个容器(作为仓库服务)
命令:docker run -d -p 5000:5000 -v /work/abc:/var/lib/registry --restart always --name registry registry:latest
说明:
-d:让容器运行在后台
-p:指定端口映射,格式:宿主机端口:容器端口
-v:指定挂载目录,格式:宿主机上的挂载目录:容器上的挂载点
- -restart:设置重启策略,always表示会让容器一直运行着,即使容器挂了也会自动重启
- -name:设置容器名
tip:实际上到这里本地的私有仓库已经搭建完毕运行在后台了,但此时的仓库却没办法接收到任何的请求。对该本地仓库的访问我们必须通过http来发请求,但docker client默认是以https来发请求的,所以请求根本发不出去。所以下一步我们应该做一些配置让docker client可以发http请求。
三、给需要上传镜像到本地仓库的docker环境配置信任站点(以Ubuntu为例)
修改docker.service的配置文件/etc/docker/daemon.json,在里面加上insecure-registries:[“ip:port”],并保存
tip:ip换成仓库所在主机的ip,端口就是上面docker run时容器映射到宿主机的端口。这么配的理由是docker run时指定将registry容器挂在容器内部的5000端口并映射到宿主机的5000端口,这时通过宿主机ip:5000就可以访问到容器了(这里的容器就是仓库本身),之后做了添加信任站点配置的主机就可以访问仓库了(前提是该主机可以访问到仓库所在的主机上)。
四、加载并重启docker服务
命令:
systemctl reload docker.service
systemctl restart docker.service
说明:加载配置并重启服务
到此就已经完全地将本地私有仓库搭建完毕并随时可以访问了(如:pull/push等),可以通过curl http://ip:port/v2/_catalog查看该本地仓库中的镜像,也可以在浏览器中输入该url地址查看到一样的结果。端口port一定要加上,因为ip:port才是仓库容器运行的位置,如果不指定port则会默认用80端口,这个位置是找不到容器仓库的。
五、push镜像
上传到本地私有仓库的镜像是有要求的,镜像的tag都必须指定为ip:port/xxx:yyy的形式,因为docker daemon在接收到docker push命令之后会拿ip:port去和daemon.json配置文件中配的信任站点匹配,如果匹配上,则会对该站点发起http请求,然后将镜像上传至仓库。
命令:docker push 192.168.0.100:5000/ubuntu:15.10
tip:镜像tag的ip和port这两个是必须和配置文件的信任站点完全匹配上的,如果ip或port有一个没匹配上,则会以https的方式发起请求,这时候请求肯定到不了私有仓库。如果ip匹配上,但是端口没有指定则会使用默认的443端口,这时候如果和信任站点匹配不上也是不行的,这里强烈要求明确指明镜像tag的ip和port。
六、pull镜像
拉取镜像的话就需要明确指定是哪个私有仓库的镜像了,不过由于push要求镜像tag必须包含仓库所在的ip:port,这被当做了镜像名字的一部分,所以拉取镜像的时候直接将其当做镜像名字即可。
命令:docker pull 192.168.0.100:5000/ubuntu:15.10
结语
上面这个过程全部在一台主机上操作肯定是没问题的,首先把仓库容器挂在某个端口上运行,然后给docker daemon的配置文件中配置信任站点。因为客户端发请求都是默认https发的,如果配了信任站点就可以用http来发。这其中的过程是客户端输入命令发送给docker daemon,docker daemon再将请求转发到仓库容器,至于转发时用https还是http就看你信任站点能不能匹配上了。
如果你有其他机器与当前这台主机处于一个局域网,那么就可以实现不同主机访问这个私有仓库。比如:局域网中有主机A、主机B、主机C,主机A部署了容器仓库,这时候给主机B和主机C的daemon.json分别添加信任站点(就是容器仓库的ip和其运行的端口),然后主机B或主机C就可以正常使用pull或push操作了。过程可参考下图: