目录

问题现象:

问题分析:

注意: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后,docker服务中自带的库

本机私有镜像仓库:是在docker服务,启动 registry 容器,从而创建的一个用于存放镜像的库,由于容器可以和本机端口绑定,所以也被称为本机私有镜像仓库

配置

window,docker/docker desktop(window环境建议使用docker desktop

步骤

1.启动docker desktop,打开cmd命令窗口,输入:

docker search registry

2.看到registry镜像,输入:

docker pull registry

3.查看镜像,看到已经下载到本地的registry镜像

docker images    #查看本地镜像,可以看到registry镜像

4.查看镜像,看到已经下载到本地的registry镜像,下一步就是部署registry服务容器,

先在本机创建一个文件夹(如:E盘 下创建一个 registry 文件夹,并设置为共享

输入:

docker run -d -p 5000:5000 --restart=always -v E:/registry:/var/lib/registry registry:latest

设置自重启,绑定本机5000端口,同时映射容器中镜像存放位置的路径到本机路径中。

5.查看容器,看到已经部署好的registry容器,输入:

docker ps    #查看运行中的容器

6.容器部署好之后,本机的镜像仓库就建好了,接下来就是要添加仓库地址,才能实现连接。

在docker desktop中可以直接实现可视化配置,简单方便:把镜像仓库地址(本机ip:5000)添加到 insecure-registries

7.重启docker desktop,通过重命名(docker tag 镜像id 镜像新标签名)创建一个新镜像,注意格式,必须是(本机ip:5000/)开头

8.上传镜像到本地镜像仓库,输入:

docker push 

由于我事先上传过一次,所以显示 Layer already exists(数据已存在)

能看到 latest:digest:sha256:、、、 size:。。。(即为push成功)

下面演示一个首先上传镜像的结果图例子:

9.查看本机镜像仓库地址中的镜像,验证镜像是否成功上传:

方法1:打开浏览器,输入 本机ip:5000/v2/_catalog  可以访问docker接口,查看镜像信息,(该方法是最准确的):

方法2:直接打开 本机的 E:\registry\docker\registry\v2\repositories 文件路径,因为所有镜像都会存放在这个目录下,可以看见里面有个registry文件夹,这个文件夹就是刚才push的镜像数据文件:

注意:这里建议新手不要用registry镜像来测试,因为这个镜像的名字容易和路径中的registry混淆,概念不同,需区别开来。

进入该文件可以看到以下信息,则表示push成功

10.删除本机镜像仓库中的镜像,一开始我想到在本机文件夹中直接删除的方法,但是有弊端:

打开本机的 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容器的delete功能默认是不启动的

我觉得禁止删除功能,应该是为了安全因素的考虑吧。

但在好奇心的驱使下,我又去查阅资料,发现网上提供了一种修改配置文件的方法,可以启动删除功能,如下:

这里我就不实践了,网上还提供了另一种更安全的方法:

       就是来到registry容器中的 /var/lib/registry/docker/registry/v2/repositories 路径,直接删除掉你想要删除的镜像即可:

或者更简单的是

1.直接在cmd执行以下命令:

docker exec <容器名> rm -rf /var/lib/registry/docker/registry/v2/repositories/<镜像名>

通过 ls命令 查看,发现文件夹下已经空,即删除成功,可执行 exit命令 退出容器:(疑问:不需要删除blobs下的文件吗?猜测这个blobs也许是临时数据)

2.然后还需要执行垃圾回收操作:

docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml

结果反馈:

看到这个反馈中的3个0,总感觉这次可能没有删除成功。

然后我再push,发现还是存在,然而在多次实践后,却发现偶尔有一次是成功的:

所以我推测,是因为这个垃圾回收操作一般是不会立刻执行的,可能是需要一段时间后才能保证真正清除掉缓存数据,这个垃圾回收机制可能和blobs这个文件夹有关系。

验证:

于是我再删除镜像文件之后,等了10几分钟后,再去执行这个垃圾回收操作,发现有了新的反馈:

感觉有希望了,然而当我再次去push的时候,依旧是说已存在:

百般尝试之后,我突然想到了传说中那个能解决99%问题的方法:重启。

于是我在执行垃圾回收操作命令之后,执行了 restart命令,重启后再push,发现可以了,多次尝试都可以成功删除,至此终于解决了这个删除镜像的问题:

总结:

1.没事就还是不要删镜像吧,太折腾了。

2.删除步骤为:

   10.2.1:打开本机 E:\registry\docker\registry\v2\repositories 文件路径,删除你想要删除的镜像文件。

   10.2.2:cmd中,执行垃圾回收操作命令:

docker exec b0533d3f7f8e bin/registry garbage-collect /etc/docker/registry/config.yml

   10.2.3:重启 registry容器

docker restart registry容器的id

   10.2.4:再次push上传本地docker库镜像

docker push 192.168.2.120:5000/minio

11.服务器间的镜像仓库地址访问:

如:A服务器(本机)地址:192.168.2.120:5000

       B服务器地址:192.168.2.220:5000

要在 A 中访问 B 镜像仓库地址,实现从B的仓库中拉取镜像:

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库镜像,输入:

docker pull 

下载中:

下载完成:

注意:这里是下载到本机(A)的docker仓库,如果需要存放在本机私有镜像仓库,就需要和上面相同的方法,创建新的镜像并push即可,如下:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐