镜像清理
在我们使用 Docker 容器的过程中,无论是在本地环境还是在镜像仓库,都会积累大量的镜像文件。这些镜像中,有许多可能在一段时间后变得不再需要,或者被更新的镜像所取代。这些被淘汰的镜像文件会占用大量的存储空间。通过高效合理地管理和清理 Docker 镜像,不仅可以节省存储空间,还可以提高系统的运行效率和稳定性。因此,定期清理 Docker 镜像是进行 Docker 容器管理的一个重要环节。
本地镜像清理
悬空镜像
-
在 Docker 中,悬空镜像(Dangling Image)指的是仓库名(镜像名)和标签 TAG 都是
<none>
的镜像。在实际开发中,在构建或者删除镜像时出错会有一定概率出现悬空镜像。这些悬空镜像可能会占用大量的磁盘空间,因此,一旦发现,必须删除。 -
使用命令来查看所有的悬空镜像:
docker image ls -f dangling=true
手动清理
-
使用
docker image prune
及过滤器参数--filter
-
docker image prune -a --filter "until=168h"
-
docker image prune -a
:删除所有没有被任何容器使用的镜像,-a
参数表示删除所有无用的镜像 -
--filter "until=168h"
:这个过滤器会限制命令只删除在特定时间(7天,7*24=168)之前创建的镜像。
自动清理
-
结合Crontab实现每天定时自动清理
-
Crontab 文件是一个包含了一系列作业(jobs)的列表,这些作业被 cron 守护进程定期执行
-
每一行的 crontab 文件代表一个作业,包含了六个字段:
-
分钟(0 - 59)
-
小时(0 - 23)
-
月份中的第几天(1 - 31)
-
月份(1 - 12)
-
星期几(0 - 7)(星期天可以是 0 或者 7)
-
要执行的命令
-
-
先使用命令
crontab -e
进入 crontab 文件编辑,然后加入命令0 1 * * * docker image prune -a --force --filter "until=168h"
(标识每天凌晨一点执行清理7天以上未使用的镜像),保存并关闭编辑器时,新的 crontab 文件会被安装,并且 cron 守护进程会开始执行新的作业。
镜像仓库清理
Docker registry
-
Docker Registry 是一个用于存储和分发 Docker 镜像的系统。它允许用户将预构建的镜像推送到 Registry 中,并可以在需要时拉取这些镜像来运行,而无需访问原始的 Dockerfile。
-
Docker Registry 是开源的,可高度扩展。Docker Hub 是最知名的公共 Docker Registry。
-
Docker Registry 提供了一种称为垃圾收集的机制,用于删除不再被清单引用的 blob。这些 blob 可以包括层和清单。
-
垃圾收集可以帮助节省磁盘空间,并确保某些层不再存在于文件系统中,这在安全性方面可能是一个考虑因素。分为两个阶段:
-
标记阶段:在此阶段,进程扫描Registry中的所有清单,并从这些清单中构造一组内容地址摘要的集合。这个集合是“标记集”,表示不要删除的 blob 集合。
-
扫描阶段:在此阶段,进程扫描所有的 blob,如果 blob 的内容地址摘要不在标记集中,那么进程就会删除它。
-
-
可以使用以下命令来运行垃圾收集1:
bin/registry garbage-collect [--dry-run] [--delete-untagged] /path/to/config.yml
-
其中,
--dry-run
参数会打印标记和扫描阶段的进度,但不会删除任何数据。 -
如果需要清理未标记的清单,你可以使用
--delete-untagged
参数来运行命令。
-
-
此外,还可以编写自定义脚本来自动化 Docker Registry 的镜像清理过程
Harbor
-
Harbor 是一个开源的企业级 Docker Registry 服务器,由 VMware 公司开发。Harbor 扩展了 Docker Distribution,添加了一些企业必需的功能,如安全、身份认证和管理。
-
Harbor 提供了自定义保留规则,实现自动清理不需要的镜像。
-
保留规则按顺序进行筛选,依次是“仓库”—>”个数或时间”—>”tags”
-
在Harbor页面中设置保留规则的步骤具体如下:
-
选择一个项目,当前账户至少具有该项目的管理员权限
-
进入项目界面,选择“策略”,然后选择“TAG保留”
-
点击”添加规则”,开始设置保留规则,共分为三个部分,顺序分先后:
3.1 应用到仓库:可以选择“匹配”或者“排除”,选择或者排除具有特定名称的仓库或者使用通配符标记名称符合特定规则的仓库;被选中的仓库将应用该条保留规则,并且在此阶段,不会对未选中的存储库执行任何操作。
3.2 以数量或时间为条件:通过指定最大tags数(按最近pull/push的顺序)或指定保留tags的最长时间(最近pull/push的时间)来设置要保留的tags
3.3 Tags:可以选择“匹配”或者“排除”,选择或者排除具有特定名称的仓库或者使用通配符标记名称符合特定规则的tags。同时,可以选择是否应将无tag的镜像捕获为符合标记保留规则的一部分。
-
-
每个Harbor项目最多可以设置 15 个保留规则
-
定时执行:可以制定保留规则自动执行计划,支持自定义
-
如果定义多个规则,则计划将应用于所有规则,不能将不同的规则安排在不同的时间运行
-
如果选择自定义,需要输入cron 作业命令以制定计划
-
-
手动执行和试运行:可以在试运行模式下,查看一条或多条保留规则的运行结果;确认结果无误后可手动执行保留规则,一旦执行,过程不可逆。
-
注意:如果在项目上设置了配额,则不能超过此配额。即使设置的保留规则超过配额,配额也会应用于项目,不能使用保留规则来绕过配额。