Docker registry是docker私有镜像仓库。长期运行会存在一些遗留的镜像,清理时可以从两个方面去清理:
- 镜像标签为none的镜像,是被覆盖的镜像,不会再被拉取到;
- 清理多次重复构建,镜像层数较高的冗余镜像。
本次操作使用的是registry:2的镜像搭建的私有仓库,并没有做特殊的改动。其它版本可能需要修改storage配置中增加delete=true配置项,详细参考下方参考链接。
1. 清理指定none镜像
下载清理脚本
curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null
sudo chmod a+x /usr/local/bin/delete_docker_registry_image
【可选】安装python,如服务器已安装,直接跳过这一步
yum install -y python3
映射出镜像仓库在宿主机的挂载地址
- 我部署的时候,是使用挂载项 registry_data:/var/lib/registry
- 那么我需要找到宿主机的registry_data的实际地址
- 使用
docker volume ls
找到registry_data - 找到实际地址
docker inspect ${volume_id}
,可以看到是/var/lib/docker/volumes/lcdp-swarm-deploy_registry-data/_data - 综上,我得到映射地址,执行下面命令声明环境变量
export REGISTRY_DATA_DIR=/var/lib/docker/volumes/lcdp-swarm-deploy_registry-data/_data/docker/registry/v2
清理指定的none镜像,如果不知道要清理哪些镜像,可以看第二种方法的内容,找出哪个镜像占用比较大
python3 delete_docker_registry_image -i ${image_name} -u
执行垃圾回收,清理二进制数据
docker exec -t ${container_name} registry garbage-collect /etc/docker/registry/config.yml
2. 暴力清理指定镜像
# 进入容器
docker exec -it ${container_name} sh
# 进入容器后的操作
# 查看镜像总占用空间
du -sch /var/lib/registry
# 分析镜像层数较多的镜像,仅显示占用前10的镜像名称
registry garbage-collect --dry-run /etc/docker/registry/config.yml awk -F : '{print $1}' | sort | uniq -c | sort -rn -k1 | head -10 | grep -v "redis|jdk|php|mysql|nginx|apache|zk|elastic"
# 从上方的输出,酌情考虑哪些镜像需要删除
cd /var/lib/registry/docker/registry/v2/repositories
ls
# 酌情使用rm 删除想要删除的镜像文件夹
# 使用垃圾回收,清理二进制空间
registry garbage-collect /etc/docker/registry/config.yml
# 再次查看占用空间,看清理是否有效果
du -sch /var/lib/registry