Table of Contents
为什么自动打扫器是磁盘空间管理的基本条件
容器为应用开发、测试和部署提供了轻量级、一致的环境。然而,快速旋转和拆卸容器的方便成本是很高的:磁盘布卢特。随着时间的推移,拖动图像、停止的容器、未使用的数量以及剩余部分会积存、消耗宝贵的磁盘空间。如果不加以控制,这种杂乱可导致性能退化、部署失败,甚至系统失效。 自动化清理不仅可以回收存储,而且可以确保一个可预测、可维护的多克主机。
单个开发者工作站可能在几周内收集未使用的 Docker 图像 的千兆字节。 在生产环境中, 容器经常更新或更换, 问题会迅速发生。 人工清理容易出错, 并且常常被忽略。 通过实施自动的、 预定的搜索策略, 您可以取消猜测, 并释放资源, 用于最重要的: 运行您的应用程序 。
理解 Docker 的清理工具
Docker 提供了一组删除未使用数据的命令。 最强大的是 [[FLT: 0]], 它可以瞄准容器、图像、卷和网络。 让我们拆分关键选项 :
- ] – 删除所有被停止的容器,所有拖动的图像,以及未使用的网络.
- ] — 添加去除所有未使用的图像(不仅仅是拖动的图像),包括任何容器未引用的图像.
- ] — 也挤压未使用的卷(默认卷不删除).
- ] – 将所有旗帜合并:未经确认强行删除,所有未使用的图像和卷。这是清理的核选项 。
对于更多的颗粒控制,多克会给出单独的命令:[,,,和]. 每个都接受过滤器(例如]),以限制删除时间超过一定时间的资源.
Cron 自动化的步进设置
在 Linux 系统中, cron 仍然是重复任务最简单的调度工具。 要自动清理 Docker, 您只需要在您的 crontab 中使用几行 。
1. 验证 Docker 命令路径
运行环境有限的 Cron 任务。 通过运行确定 [[FLT: 10] 的全部路径 :
which docker
通常此返回 [[FLT: 12]]。 在您的 cron 命令中使用该路径 。
2. 编辑您的克朗塔b
运行 :
crontab -e
如果这是你第一次, 您会被提示选择编辑器。 添加一条类似以下的行, 每天凌晨2: 00运行 :
0 2 * * * /usr/bin/docker system prune -af --volumes > /dev/null 2>&1
自动调试 [[FLT: 15] 将 stdout 和 stderr 重排为无效,以避免将输出填充您的邮箱。 需要时调整时间表(例如每周[[FLT: 16] )。
3. 测试工作
在依赖 cron 之前, 手动运行命令, 以确保它能如预期的那样工作 :
sudo /usr/bin/docker system prune -af --volumes
如果您正在使用非“ root” 的 Docker 安装, 您可能需要添加 [[FLT: 18] ] 或作为 [[FLT: 19] 组中的用户运行 cron 任务 。
带有系统计时器的高级自动化
系统化的计时器可以提供更好的记录、依赖性处理和与其它输入系统整合。 这里,如何为Docker清理创建计时器。
1. 设立服务股
将以下保存为:
[Unit]
Description=Docker system prune
Wants=docker.service
After=docker.service
[Service]
Type=oneshot
ExecStart=/usr/bin/docker system prune -af --volumes
User=root
StandardOutput=journal
2. 设立计时股
另存为]:
[Unit]
Description=Run Docker cleanup daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
3. 启用和启动计时器
sudo systemctl daemon-reload
sudo systemctl enable docker-cleanup.timer
sudo systemctl start docker-cleanup.timer
使用 [[FLT: 25]] 校验。 这种方法将输出记录到系统化日记簿, 从而更容易审计清理工作。
配置保留政策的清理过滤器
冲刺对大多数开发环境来说是安全的,但生产系统可能需要保留政策[。例如,您可能想要将图像标记为或],或者只删除超过48小时的资源。
按年龄过滤
将超过24小时的未使用的图像和容器推倒:
docker system prune -af --filter "until=24h" --volumes
过滤器既适用于图像,也适用于容器。组合到,多次用于更为复杂的规则。
不包括具体资源
Docker没有内置的忽略列表,但您可以使用标签来防止删除. 标签重要容器或图像(例如]),然后使用负标签过滤器(尚未支持在 中). 工作变通是将与自定义的脚本合并,在删除前检查标签。或者使用像docker-gc]或[docker-clean这样的工具来进行标签意识清洗.
监测磁盘空间和清理效果
自动化只与您的监控一样好。 每次清理后设置提示以跟踪磁盘的使用。 简单的方法包括:
- 运行 在一个 cron 工作并记录结果。
- 使用类似docker-system-resource-flux]这样的工具,将公制量表发送到InfluxDB或Prometheus.
- 与数据犬或新遗物结合,可视化多克存储随时间推移.
如果您的清理运行但磁盘使用率仍然很高, 请使用 [[FLT: 35]] 来调查空间的耗用。 常见的罪犯包括在 CI 系统中建立缓存或大量未删除的量, 因为这些量仍然被被停止的容器引用 。
生产环境最佳做法
1. 始终采用分阶段办法
开始使用 [[FLT: 36] ] 的每周干燥, 标记为无 [[FLT: 37]] 。 请先检查输出后才能自动删除 。
2. 与CI/CD管道的坐标
如果您的构建系统创建了许多临时图像, 则在构建后或低流量窗口中会进行排程。 运行时避免在构建时进行排程, 以防止在使用中层的意外删除 。
3. 备份关键数据
包含数据库或用户上传的卷数在任何积极的卷数浏览之前应该备份。使用“ ” 等 Docker卷数管理工具,将不会受到prune影响的外部存储装入。
4. 运行 Pruning 作为非“ Root” 用户
对于安全性, 需要时可避免将 cron 任务作为根运行。 将您的用户添加到 [[FLT: 40] ] 组中, 并且不使用 [[FLT: 41] ] 运行该任务。 但是, 请注意, [[FLT: 42] 组中的任何用户都有效拥有对主机的根访问权; 评估您环境中的风险 。
5. 清理日志活动
将输出重定向到日志文件, 而不是用于审计 : [[FLT: 43]]:
0 2 * * * /usr/bin/docker system prune -af --volumes >> /var/log/docker-cleanup.log 2>&1
定期检查日志中的错误或意外的清除。
常见的陷阱和如何避免它们
- 错过运行中的容器数据:]]旗删除所有未使用的图像,包括未来构建可能需要的中间层。如果频繁重建,考虑设置短 过滤器或运行,而不使用]]。
- ]包含重要状态的卷 :默认情况下,]不删除卷,除非使用旗。只有在确定没有卷有持续数据时,才添加该旗。
- 网络松树断裂容器连接]:删除未使用的网络。如果自定义网络不再被任何容器引用,它将被移除,有可能打破未来的容器启动。如果在Swarm中使用覆盖网络,请记住这一点。
- Cron环境问题:Cocker在 cron运行时可能不在 PATH 中,总是使用二进制的全部路径.
备选工具和办法
虽然本地的Docker命令满足了大多数需求,但一些第三方工具提供了高级特性:
- 瞭望台 – 自动更新运行中的容器,并在更新后可以清理旧图像.
- Portainer – 用于Docker管理的网络UI,包含一个预定的清理功能.
- docker buildinger prune] — 具体目标建立缓存,在CI/CD管道中可能很庞大.
对于Kubernetes环境,考虑使用 kubelet垃圾收集和工具如 Kured 或[deschleder 用于节点级清理.
结论
自动清理 Docker 容器是保持一个健康高效的 Docker 主机的简单但关键的做法。 无论您选择了 cron, 系统计时器, 还是第三方工具, 关键是定期运行一个策略, 平衡磁盘节省和删除所需数据的风险。 保守地启动过滤器和日志, 然后随着您的信心增强而缩短您的日程。 通过将自动清理纳入您的操作常规, 您确保磁盘空间永远不会成为瓶颈, 您的容器会保持精致、 安全和 性能 。