目录
问题现象:
问题分析:
注意:docker中直接下载后的镜像是存放在本地docker库中,而不是本机私有镜像仓库的!
区别:
配置:
window,docker/docker desktop(window环境建议使用docker desktop)
步骤:
1.启动docker desktop,打开cmd命令窗口,输入:
2.看到registry镜像,输入:
3.查看镜像,看到已经下载到本地的registry镜像
4.查看镜像,看到已经下载到本地的registry镜像,下一步就是部署registry服务容器,
5.查看容器,看到已经部署好的registry容器,输入:
6.容器部署好之后,本机的镜像仓库就建好了,接下来就是要添加仓库地址,才能实现连接。
7.重启docker desktop,通过重命名(docker tag 镜像id 镜像新标签名)创建一个新镜像,注意格式,必须是(本机ip:5000/)开头
8.上传镜像到本地镜像仓库,输入:
9.查看本机镜像仓库地址中的镜像,验证镜像是否成功上传:
注意:这里建议新手不要用registry镜像来测试,因为这个镜像的名字容易和路径中的registry混淆,概念不同,需区别开来。
10.删除本机镜像仓库中的镜像,一开始我想到在本机文件夹中直接删除的方法,但是有弊端:
registry容器的delete功能默认是不启动的,
1.直接在cmd执行以下命令:
2.然后还需要执行垃圾回收操作:
然后我再push,发现还是存在,然而在多次实践后,却发现偶尔有一次是成功的:
总结:
1.没事就还是不要删镜像吧,太折腾了。
2.删除步骤为:
10.2.1:打开本机 E:\registry\docker\registry\v2\repositories 文件路径,删除你想要删除的镜像文件。
10.2.2:cmd中,执行垃圾回收操作命令:
10.2.3:重启 registry容器
10.2.4:再次push上传本地docker库镜像
11.服务器间的镜像仓库地址访问:
11.1 首先要在本机(A)的docker配置中,添加(B)镜像仓库地址:
11.2 然后 启动/重启 本机(A)的docker desktop。
11.3 事先在B服务器上创建好B的镜像仓库,并创建以 B的ip:5000/ 开头的镜像,并push到b的镜像仓库地址中:
11.4 在本机(A)中打开浏览器查看 B 的镜像库中的信息,可以看到B库中只有一个刚刚push的minio镜像,同时说明访问成功:
11.5 在本机(A)中拉取 B库镜像,输入:
注意:这里是下载到本机(A)的docker仓库,如果需要存放在本机私有镜像仓库,就需要和上面相同的方法,创建新的镜像并push即可,如下:
最近在研究如何在window服务器环境中创建docker本地镜像仓库,由于网上几乎都是基于Linux服务器环境的,所以就能通过参考学习和实践,来完成这个目标。
通过自学,发现了创建docker镜像仓库的一些基本的逻辑原理,这是无论在window还是linux环境下,都肯定是一样的。
本地docker库:是安装docker后,docker服务中自带的库。
本机私有镜像仓库:是在docker服务中,启动 registry 容器,从而创建的一个用于存放镜像的库,由于容器可以和本机端口绑定,所以也被称为本机私有镜像仓库。
docker search registry
docker pull registry
docker images #查看本地镜像,可以看到registry镜像
先在本机创建一个文件夹(如:E盘 下创建一个 registry 文件夹,并设置为共享)
输入:
docker run -d -p 5000:5000 --restart=always -v E:/registry:/var/lib/registry registry:latest
设置自重启,绑定本机5000端口,同时映射容器中镜像存放位置的路径到本机路径中。
docker ps #查看运行中的容器
在docker desktop中可以直接实现可视化配置,简单方便:把镜像仓库地址(本机ip:5000)添加到 insecure-registries 中:
docker push
由于我事先上传过一次,所以显示 Layer already exists(数据已存在)
能看到 latest:digest:sha256:、、、 size:。。。(即为push成功)
下面演示一个首先上传镜像的结果图例子:
方法1:打开浏览器,输入 本机ip:5000/v2/_catalog 可以访问docker接口,查看镜像信息,(该方法是最准确的):
方法2:直接打开 本机的 E:\registry\docker\registry\v2\repositories 文件路径,因为所有镜像都会存放在这个目录下,可以看见里面有个registry文件夹,这个文件夹就是刚才push的镜像数据文件:
进入该文件可以看到以下信息,则表示push成功:
打开本机的 E:\registry\docker\registry\v2\repositories 文件路径,删除这个 registry文件夹;
同理再打开 E:\registry\docker\registry\v2\blobs 文件路径,删除 sha256文件夹:
再用方法1验证:
看上去似乎删除成功,但是事实并不是,因为当我们再push一次的时候会发现本机私有镜像库中已经存在了,由此可知删除并没有成功:
于是我想到最直接的方法就是去到容器中,查看具体的镜像库存放位置中,到底还存在镜像不,结果发现了神奇的事情:
当我通过 ls 命令 和 cd 命令 一步步探索到 registry容器中的 /var/lib/registry/docker/registry/v2/repositories 路径时,发现了利用上面方法删除的镜像,依旧完好无损的存在于此处;也就是说删除无效;
于是我又去看了 registry容器的配置文件:
看不出所以然,通过上网查阅资料得知:这是因为
我觉得禁止删除功能,应该是为了安全因素的考虑吧。
但在好奇心的驱使下,我又去查阅资料,发现网上提供了一种修改配置文件的方法,可以启动删除功能,如下:
这里我就不实践了,网上还提供了另一种更安全的方法:
就是来到registry容器中的 /var/lib/registry/docker/registry/v2/repositories 路径,直接删除掉你想要删除的镜像即可:
或者更简单的是
docker exec <容器名> rm -rf /var/lib/registry/docker/registry/v2/repositories/<镜像名>
通过 ls命令 查看,发现文件夹下已经空,即删除成功,可执行 exit命令 退出容器:(疑问:不需要删除blobs下的文件吗?猜测这个blobs也许是临时数据)
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
结果反馈:
看到这个反馈中的3个0,总感觉这次可能没有删除成功。
所以我推测,是因为这个垃圾回收操作一般是不会立刻执行的,可能是需要一段时间后才能保证真正清除掉缓存数据,这个垃圾回收机制可能和blobs这个文件夹有关系。
验证:
于是我再删除镜像文件之后,等了10几分钟后,再去执行这个垃圾回收操作,发现有了新的反馈:
感觉有希望了,然而当我再次去push的时候,依旧是说已存在:
百般尝试之后,我突然想到了传说中那个能解决99%问题的方法:重启。
于是我在执行垃圾回收操作命令之后,执行了 restart命令,重启后再push,发现可以了,多次尝试都可以成功删除,至此终于解决了这个删除镜像的问题:
docker exec b0533d3f7f8e bin/registry garbage-collect /etc/docker/registry/config.yml
docker restart registry容器的id
docker push 192.168.2.120:5000/minio
如:A服务器(本机)地址:192.168.2.120:5000
B服务器地址:192.168.2.220:5000
要在 A 中访问 B 镜像仓库地址,实现从B的仓库中拉取镜像:
docker pull
下载中:
下载完成: