Docker Registry 私有仓库镜像数据的删除
如果你使用 Docker Registry 自己搭建私有的 Docker 镜像仓库,以下我的踩坑记录可能会有些帮助。
Docker Registry 对于镜像的管理并没有提供功能齐全的命令行或者web管理工具,默认的仓库管理是通过api调用来完成的,这点在仓库积累了很多无用镜像数据,需要清理释放磁盘空间时就显得非常不方便。尽管Github上有一些不错的开源项目,提供了可视化管理界面(比如 joxit/docker-registry-ui 这个项目,就非常不错),但是需要额外为这个并不是太高频的需求再部署一个容器,还是有一点麻烦。我的做法是通过简单的命令行完成这个操作。
一、安装 Crane
crane 是 google 官方提供的仓库管理命令行工具,打包在 go-containerregistry 这个项目中,去 releases 页面下载压缩包,将其中的crane 可执行文件拷贝到宿主机 /usr/local/bin/ 这个路径下。然后运行:
crane version
如果没有问题的话,可以看到 crane 的版本号。
二、使用 Crane 查看私有仓库的镜像信息
首先登录你的私有仓库
# 登录你的私有仓库 (xxx.com 是你的私有仓库地址,5000是仓库对外暴露的端口号,如果你使用反代,填写宿主机对外暴露的仓库端口)
crane auth login xxx.com:5000 -u 你的用户名 -p 你的密码
查看你的镜像信息
# 1. 查看 xxx.com:5000 这个仓库下有哪些镜像
crane catalog xxx.com:5000
# 2. 查看 myapp 这个镜像都有哪些版本(tags)
crane ls xxx.com:5000/myapp
删除你要删除的镜像Tag
# 删除 myapp 的 v1.0 版本
crane delete xxx.com:5000/myapp:v1.0
确认你要删除的镜像已经没有Tag
# 如果Tag被正常移除,执行这条命令应该没有任何显示
crane ls xxx.com:5000/myapp
注意:和 Docker Registry 的 API 一样,crane delete 也只是删除了元数据(manifest),镜像的层数据(blob)还占着硬盘空间。
三、进入容器清理blob数据
在容器内部执行
registry garbage-collect /etc/distribution/config.yml --delete-untagged
执行这条命令前,需要先找到config.yml配置文件的具体位置,可以使用 find / -name "config.y*ml" 在容器内查找一下,这个配置文件在不同版本的 Docker Registry 中有着不同的位置。
四、手动清理宿主机数据卷中镜像对应的物理目录
执行完上述命令后,无用的镜像blob数据已经被清理掉了,但是使用 crane catalog xxx.com:5000 你依然可以看到 myapp 这个镜像存在,这是因为宿主机持久化数据卷中还存在 myapp 这个目录,Docker Registry 默认的管理规则不会主动去删除目录,所以如果你想干净的清理掉这个无用镜像(请确认该镜像已没有其他标签关联),需要手动删除宿主机这个镜像目录,一般这个目录的位置在 data/docker/registry/v2/repositories ,data是你宿主机持久化的数据卷。
在 repositories 目录下,找到 myapp 目录,删而去之,再次执行 crane catalog xxx.com:5000 ,就不会再有 myappp 这个镜像的信息,至此,垃圾镜像数据彻底清理完毕。
评论
0发表评论