Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。Docker官方提供了Docker Registry用于构建私有镜像仓库。
sudo docker pull registry # 拉取registry镜像
docker run -d -p 5000:5000 -v /home/myregistry/:/tmp/registry --privileged=true registry # 运行registry,使用容器数据卷映射
稍微解释一下参数的含义-p host_port:container_port
,-p 5000:5000是宿主机的5000端口映射到容器的5000端口。
-v 宿主机目录:容器目录
是指定容器数据卷映射。这里是将宿主机的/home/myregistry/映射到容器的/tmp/registry目录。
--privileged=true
开启后,Docker容器被允许可以访问主机上的所有设备、可以获取大量设备文件的访问权限、并可以执行mount命令进行挂载。
例如,我们可以在ubuntu系统中安装tree命令,然后docker commit成为一个新的镜像。
sudo docker commit -m "add tree cmd" -a="zy010101" f8348ef59d20 ubuntu_with_tree:1.0
curl -XGET http://10.0.16.5:5000/v2/_catalog
由于当前没有push镜像到私有仓库,因此输出结果如下:
{"repositories":[]}
sudo docker tag ubuntu_with_tree:1.0 10.0.16.5:5000/myubuntu:1.0.0
如果你没有/etc/docker/daemon.json,那么就创建这个文件,然后加入下面的内容。
{
"insecure-registries": ["10.0.16.5:5000"]
}
修改这个是为了让docker允许http方式推送镜像。因为默认docker是不允许HTTP推送的。(如果修改配置之后,无法立即生效,可以重启docker以及registry容器)
将我们刚才修改TAG之后的镜像进行推送。
sudo docker push 10.0.16.5:5000/myubuntu:1.0.0
然后查看私有仓库中的镜像是否推送成功。
curl -XGET http://10.0.16.5:5000/v2/_catalog
结果显示,我们刚才的镜像已经被推送成功了。
{"repositories":["myubuntu"]}
sudo docker pull 10.0.16.5:5000/myubuntu:1.0.0
curl -XGET http://10.0.16.5:5000/v2/_catalog # 先查询仓库里的镜像
结果如下:
{"repositories":["myubuntu"]}
然后根据查询出来的镜像,进行标签的查询。
curl -XGET http://10.0.16.5:5000/v2/myubuntu/tags/list