我们在使用docker registry时,(特别是基于docker构建PaaS平台的研发人员)应该都知道,docker registry会消耗大量的磁盘空间。特别是在我们的开发环境中,通过持续集成模块构建docker镜像,日积月累,终究会消耗光我们的磁盘,到时候,我们的运维人员不得不宕机给机器扩容磁盘。
Docker Registry在1.0版本的时候,我们很难删除仓库中的镜像。docker registry 2.0版本已经提供了restful API删除镜像。
 
在使用registry API之前,我们先了解一下registry 中的几个概念。理解这些概念后,我们才能知道调用registry API会产生的后果。
image
在registry中,镜像(image)由多个tag组成。一般情况下,我们一个应用或者一个模块打包成一个镜像。
tag
站在应用的角度,tag代表应用的一个版本;站在镜像角度,可认为tag是镜像的标签。一个tag由多个层(layer)组成。每个layer有独一无二的digest (sha256),digest是layer的签名。一个tag对应一个manifest(layer清单)。manifest由多个layer组成的清单。一个layer对应一个blob,blob对应物理磁盘的存储。所以,清理blob才能释放磁盘的空间。
 
注意:多个tag可能对应同一个manifest。所以,在删除manifest时候需要注意。删掉manifest后,对应的tags也会被删除。后面我也是通过删除manifest方式来删除镜像的。
明白以上关系后,我们可以删除registry 中的manifest后,使得layer没有被任何manifest引用,然后使用registry自带的垃圾回收机制回收没有被引用的layer以及blob文件。
下面我们开始使用Docker Registry API删除镜像。
1. 修改docker registry配置,使其支持垃圾回收
修改config.yml文件。
storage:
  delete:
     enabled: true
2. 查看仓库中所以的镜像
| 接口 | http://{your-registry-ip}/v2/_catalog | 譬如,linux执行:curl http://127.0.0.1:5000/v2/_catalog | 
| 返回值 | { "repositories": [ "admin/hello" ] } | 
可以看到,目前我们的仓库中只有“admin/hello”的镜像。
3. 查看镜像的所有的tags
| 接口 | http://{your-registry-ip}/v2/{image}/tags/list | 譬如,linux执行:http://127.0.0.1:5000/v2/admin/hello/tags/list | 
| 返回值 | { "name": "admin/hello", "tags": [ "1.0.0-201806041925053", "2.0.0-201809251650031", "3.0.0-201809251651008" ] } | 
4. 查看tag对应的manifest对应的digest
| 接口 | http://{your-registry-ip}/v2/{image}/manifests/{tag} | 譬如,linux执行: curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://127.0.0.1:5000/v2/admin/hello/manifests/1.0.0-201806041925053 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}' | 
| 返回值 | sha256:cfbc3139d969152f...... | 
5. 删掉manifest
使用上面接口返回的digest 值,删掉manifest。
| 接口 | http://{your-registry-ip}/v2/{image}/manifests/{digest} | 譬如,linux执行: curl -v -X DELETE http://127.0.0.1:5000/v2/admin/hello/manifests/sha256:cfbc3139d969152f053104c7b25ea8eac585a5b796cc34e4bdf0c4ebd4b0ad7b | 
| 返回值 | 
6. 执行registry垃圾回收
执行完registry垃圾回收脚本后,没有被引用的blob将会被清除。
docker Registry API:https://docs.docker.com/registry/spec/api/
 
			 
					