docker仓库存放着公司内部的镜像、时间长了难免存在一些废弃的镜像在里面。如果不删除造成空间的浪费。下面就简单的看看仓库中的镜像是怎么删除的。

第一步:registry启动依赖config.yml配置文件:在默认文件的storage区域中添加delete_enable_ture配置项。也可以在启动时候指定-e添加。允许删除镜像:

配置文件:

wKiom1nAwMyxKZNnAABTQuETG9Q515.png

第二步:下载registry镜像并启动容器。

docker run  -d -v /conf/:/etc/docker/registry -v /opt/registry:/var/lib/registry -p5000:5000 --restart=always --name registry docker.io/registr y:latest

wKiom1nAvaKhsjXcAACTVyOn2Bo147.png

第三步:上传镜像

wKiom1nAvaPBkUCqAACaC-uBPSU014.png

前边三个步骤都是为删除镜像做准备。现在正式开始删除操作。

先看下官网怎么说:

wKioL1nAvXCgl0DeAABh0RIC9vE676.png

语法非常简单。官网上注明可以通过name和digest删除p_w_picpath。name我们是知道的。现在去获取digest:

wKiom1nAvaOR8CZeAAB7NreWI_k506.png

删除一个p_w_picpath所需要的name和digest都有了。现在执行删除操作:

[root@docker1 ~]# curl -XDELETE 127.0.0.1:5000/v2/registry_test/manifests/sha256:48b7957fb8794 3139789779c6e1448ce3cbd52adf1eba62f4633c0e289c08c1b

wKioL1nAvXHzQT1TAAB5CN96aG0109.png

看似已经删除了,其实硬盘地址并没有释放。是因为docker删除p_w_picpath只是删除的p_w_picpath的元数据信息。层数据并没有删除。现在进入registry中进行垃圾回收

[root@docker1 ~]# docker exec -it <容器ID|容器名称> /bin/sh
/ # cd /var/lib/registry/
/var/lib/registry # du -sch
10.3M    .
10.3M    total
/var/lib/registry # registry garbage-collect /etc/docker/registry/config.yml
/var/lib/registry # du -sch
28.0K    .
28.0K    total

这样就达到我们的目的了。及删除了仓库容器,又释放了磁盘空间

注意事项:

1、registry配置文件:如果想要进行仓库p_w_picpaths的删除操作: 至少要添加REGISTRY_STORAGE_DELETE_ENABLED: true这个环境变量也就是第一步标注的

2、获取digest:自从registry2.3之后,获取digest需要进行安全检查。所以必须加头部信息Accept: application/vnd.docker.distribution.manifest.v2+json。否则获取到的digest将不能使用。