背景
现在许多团队使用 Nexus 来管理 Docker 镜像,版本不断迭代,镜像仓库占用的磁盘空间也越来越大。Nexus 的控制台并未提供批量操作镜像功能,清理镜像十分不便,只能通过相关api来完成指定镜像的批量删除操作。
镜像内容是存储在一层虚拟文件系统(VFS)之上,由多个文件块(Blobs)、描述清单文件(Manifests)和 标签文件(tags)组成,因为镜像设计是多层的,这些文件会互相依赖,在没有确认文件块(Blob)是否被其他镜像使用的情况下,直接删除会让仓库不完整,所以一般的做法是只做删除标记,而不是真删除,通过垃圾回收机制来遍历当前仓库的有向关系图(DAG),然后在删除没有被引用的文件块。
清理工具
工具 | 说明 |
---|---|
nexus-cli |
根据IMAGE_NAME删除,可以保留最新的几个tag,需要手动执行Tasks来清理空间 |
nexusCleanUp |
根据IMAGE_NAME+TAG删除,可以自动执行Tasks自动清理空间 |
nexus-cli
工具安装
wget https://s3.eu-west-2.amazonaws.com/nexus-cli/1.0.0-beta/linux/nexus-cli
chmod +x nexus-cli
工具配置
nexus-cli configure
Enter Nexus Host: http://127.0.0.1:8081
Enter Nexus Repository Name: docker-release
Enter Nexus Username: admin
Enter Nexus Password: xxxxxx
操作镜像文件
列出所有镜像
nexus-cli image ls
清理镜像
#nexus-cli image delete -name IMAGE_NAME -keep X(-keep X 表示保留几个最新的tag)
nexus-cli image delete -name fund-service -keep 2
清理磁盘空间
创建两个Nexus Task 用于清理物理空间,进入Server administraion and configuration
>> System
>> Tasks
,分别创建如下两个类型的任务:
-
Docker - Delete unused manifests and images
Admin - Compact blob store
其中Task frequency
属性选择Manual
,也可以设置成定时执行,其他属性根据实际情况填写完保存即可;创建好任务后先运行Delete unused manifests and images
,再运行Compact blob store
,可以清理磁盘空间。
nexusCleanUp
工具安装
JSON
命令行工具
wget -O jq https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
chmod +x ./jq
cp jq /usr/bin
jq
官方下载地址:https://stedolan.github.io/jq/download/
nexusCleanUp
下载地址: https://github.com/IamMichael/nexusCleanUp.git
#包含如下脚本
-rwxr-xr-x. 1 root root 4226 3月 29 10:05 cleanNexus.sh
-rw-r--r--. 1 root root 11357 10月 21 2019 LICENSE
-rwxr-xr-x. 1 root root 1993 10月 21 2019 pullAndpush.sh
修改cleanNexus.sh
脚本内容
# 访问仓库地址
nexus_url="http://192.168.58.100:8081"
registry_url="http://192.168.58.100:8081/repository/docker-release"
# auth 认证用户名密码
auth_user="admin"
auth_passwd="123456"
创建Nexus Task
创建两个Nexus Task 用于清理物理空间,进入Server administraion and configuration
>> System
>> Tasks
,分别创建如下两个类型的任务:
-
Docker - Delete unused manifests and images
Admin - Compact blob store
其中Task frequency
属性选择Manual
,其他属性根据实际情况填写完保存即可;创建好任务后,注意脚本中获取任务ID的操作是否有误,可以在脚本中task01_id
和task02_id
后面添加输出信息,如果遇到没有输出任务ID,可以把脚本中的地址在浏览器执行看下结果,如果存在问题,手动执行下两个任务再刷新下返回结果应该就正常了:
echo -e "task01_id : ${task01_id}"
echo -e "task02_id : ${task02_id}"
操作镜像文件
查看帮助信息
sh cleanNexus.sh -h
查询镜像
sh cleanNexus.sh -q
删除指定镜像
sh cleanNexus.sh -d busybox:1.0.1-RC1
批量删除镜像
创建要批量删除的镜像列表文本
vi imagelist.txt
#添加如下镜像
busybox:1.0.1-RC1
ubuntu:latest
centos:7.5sh
sh cleanNexus.sh -d `cat imagelist.txt`
查看磁盘空间
df -h
du /nexus/* -h|sort -h