2018-09-25 20:03 浏览量:1071
我们在使用docker registry时,(特别是基于docker构建PaaS平台的研发人员)应该都知道,docker registry会消耗大量的磁盘空间。特别是在我们的开发环境中,通过持续集成模块构建docker镜像,日积月累,终究会消耗光我们的磁盘,到时候,我们的运维人员不得不宕机给机器扩容磁盘。
Docker Registry在1.0版本的时候,我们很难删除仓库中的镜像。docker registry 2.0版本已经提供了restful API删除镜像。
在使用registry API之前,我们先了解一下registry 中的几个概念。理解这些概念后,我们才能知道调用registry API会产生的后果。
在registry中,镜像(image)由多个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删除镜像。
修改config.yml文件。
storage:
delete:
enabled: true
接口 | http://{your-registry-ip}/v2/_catalog | 譬如,linux执行:curl http://127.0.0.1:5000/v2/_catalog |
返回值 | { "repositories": [ "admin/hello" ] } |
可以看到,目前我们的仓库中只有“admin/hello”的镜像。
接口 | 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" ] } |
接口 | 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...... |
使用上面接口返回的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 |
返回值 |
执行完registry垃圾回收脚本后,没有被引用的blob将会被清除。
docker Registry API:https://docs.docker.com/registry/spec/api/