一.搭建私有库
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry -v /data/config.yml:/etc/docker/registry/config.yml --name myregistry registry
第一个-v 是挂载的私有镜像存放的目录,挂载到本机后即使容器被删除,私有库中的镜像不会丢失
第二个-v 是挂载 config.yml 配置文件,如果想要支持删除私有库中的镜像,需要修改该配置文件
执行这个命令会报错,如下:
有问题的是 -v /data/config.yml:/etc/docker/registry/config.yml 这段命令,
报错的意思是说:我们是否将文件挂载到目录上或者将目录挂载到文件上了
这时我进入我挂载该配置文件的路径看看,
发现挂载时自动创建的config.yml 是个目录而不是文件。
解决方法:
我们先删掉之前没跑成功的容器
docker rm myregistry
再运行一个registry 容器
docker run –d –name registryTemp registry
将容器内的config.yml 复制到 我们想挂载的目录下
docker cp registryTemp:/etc/docker/registry/config.yml /data/
然后停掉这个容器并删除
docker stop registryTemp
docker rm registryTemp
最后再重新运行registry 容器并挂载目录和文件
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry -v /data/config.yml:/etc/docker/registry/config.yml –name myregistry registry
小结:在使用docker 挂载单个文件时,需要我们的挂载目录下存在该同名文件,当然,在挂载目录下新建一个同名文件再挂载也可以避免报错,但是这样可能导致容器跑不起来。最好是将容器内的源文件拷贝到需要挂载的目录下,再运行容器并挂载文件。
容器跑起来后可以查看容器内的镜像
查看所有的镜像(localhost可换成ip)
curl localhost:5000/v2/_catalog
查看某个镜像的所有tags( <镜像repository> 为push前执行tag命令时自定义的repository)
curl localhost:5000/ v2/<镜像repository>/tags/list
二,推送镜像到私有库
如果推送已有的镜像必须先打tag ,
注意:自定义repository 不能有大写字母!!!
docker tag
例:docker tag registry:latest 192.168.120.107:5000/my-registry:1.0
如果是想将某个容器保存为镜像并推送的话,则需要在commit的时候将私有库的ip和端口放到repository中
docker commit <容器ID或者容器名> <新repository>:<新TAG>
例: docker commit myregistry 192.168.120.107:5000/my-registry:1.0
执行完tag 命令或者 commit 命令后,我们执行docker images 可以发现,多出了一条repository 为 192.168.120.107:5000/my-registry , TAG 为 1.0 的镜像
然后将这个镜像推送到私有库
docker push 192.168.120.107:5000/my-registry:1.0
执行命令报错:
这个问题可能是由于客户端采用https,docker registry未采用https服务所致。
第一种处理方式是把客户端对地址“192.168.120.107:5000”的请求改为http。
步骤如下:
在客户端服务器的”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入:
{ "insecure-registries":["192.168.120.107:5000"] }
保存退出后,重启docker,再push 就可以成功了。
改方法的缺陷是,如果有其他服务器也要对私有库进行pull或push操作的话,都需要添加该配配置。
第二种方法在私有库所在的服务器 安装 nginx 和ssl并进行配置,使私有库支持https的访问,详细步骤我记录在下面链接的这个博客中。
https://blog.csdn.net/Fickle_actor/article/details/88851744
三.从私有库拉取镜像
docker pull <私有库ip>:<端口>/ < 镜像repository> :<镜像tag>
例:docker pull 192.168.120.107:5000/my-registry:1.0
四.从私有库删除镜像
关于私有库镜像的删除,我单独写了篇博客,仅供参考
https://blog.csdn.net/Fickle_actor/article/details/88929637