清除docker registry仓库中的镜像

2018-09-25 浏览量:513

我们在使用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 garbage-collect /app_home/conf/config.yml --dry-run

 

执行完registry垃圾回收脚本后,没有被引用的blob将会被清除。

docker Registry API:https://docs.docker.com/registry/spec/api/

上一篇:如何在一分钟内创建一个数据库环境?

下一篇:2018年9月世界编程语言排名

为什么选择龙石数据?