容器镜像瘦身自动化脚本减少存储占用
为什么容器镜像会越用越占空间
Docker容器在不断拉取、构建、停止后,本地会堆积大量中间层镜像、悬空镜像(none标签)以及构建缓存。
如果团队频繁更新应用,磁盘空间很容易被撑满。
手动执行docker system prune虽然能临时释放,但无法针对特定项目做精细化清理。
因此,编写一个容器镜像瘦身自动化脚本,定期检查和清除无用资源,是减少存储占用的最直接方案。
准备工作:环境检查与状态快照
在动手写脚本前,先确认你的服务器已安装Docker,并且当前镜像目录空间足够。
执行以下命令查看目前的存储占用情况:
docker system df
输出会显示 Images、Containers、Local Volumes 的大小。
记下这个值,后面对比效果。
如果你使用的是宝塔面板,可以在“Docker - 管理”页面看到类似统计,但命令行更准确。
编写瘦身自动化脚本
以下脚本包含三个核心动作:
- 删除所有悬空镜像(
): - 清理停止的容器
- 清理构建缓存和未被使用的卷(可选)
完整脚本示例
#!/bin/bash
# docker-slim.sh: 自动清理无用Docker资源
LOG_FILE="/var/log/docker-slim.log"
echo "=== $(date) 开始镜像瘦身 ===" >> $LOG_FILE
# 删除悬空镜像
echo "删除悬空镜像..." >> $LOG_FILE
docker image prune -af >> $LOG_FILE 2>&1
# 删除停止容器
echo "删除停止的容器..." >> $LOG_FILE
docker container prune -f >> $LOG_FILE 2>&1
# 删除未被使用的卷(可选,谨慎使用)
echo "删除无用卷..." >> $LOG_FILE
docker volume prune -f >> $LOG_FILE 2>&1
echo "=== 结束 ===" >> $LOG_FILE
将脚本保存为 /opt/scripts/docker-slim.sh,并赋予执行权限:
chmod +x /opt/scripts/docker-slim.sh
避坑提醒:docker image prune -af 会删除所有没有标签且没有被容器引用的镜像层。如果某些镜像被多个容器共用,删除前务必确认业务不受影响。建议先在测试环境运行。
配置定时任务实现自动化
直接手动运行脚本不够省心,搭配cron定时执行才能真正释放人力。
编辑crontab
crontab -e
添加以下一行,表示每天凌晨2点执行一次:
0 2 * * * /opt/scripts/docker-slim.sh
保存退出。
可通过crontab -l查看是否写入成功。
如果你使用宝塔面板,可以在“计划任务”中添加Shell脚本,周期设为每天,命令填完整路径。
效果验证与常见问题
验证方法
执行脚本前先记录磁盘占用,运行后再次运行docker system df对比。
示例输出:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 5 3 450MB 120MB (26%)
Containers 3 1 0B 0B
Local Volumes 2 1 200MB 50MB (25%)
如果RECLAIMABLE有明显变化,说明瘦身成功。
高频问题解答
Q:脚本运行后导致镜像丢失,容器启动失败怎么办?
A:只要镜像有标签(docker images中显示为形式),不会被prune -af删除。如果误删,可以从远程仓库重新拉取。建议脚本执行前先做一次全量备份。
Q:我有些容器使用了无标签镜像作为依赖,怎么保留?
A:使用docker image prune -a会在删除悬空镜像的同时也删除未被引用的带标签镜像(如果没有任何容器使用)。保险做法:先执行docker ps -a列出的容器ID,然后用docker inspect查看所用镜像,确保它们有标签或手动加标签。
Q:能否只清理某个项目的镜像?
A:可以。在脚本中加入过滤条件,例如docker image prune --filter label=project=myapp。需要镜像构建时添加标签。
总结
通过上述自动化脚本和定时任务配置,你就能做到每周甚至每天自动清理容器镜像中的“垃圾”。
核心步骤只有三步:写脚本、赋权限、开定时。
后续根据业务需要可调整清理范围(比如只清理悬空镜像,保留中间构建缓存)。容器镜像瘦身自动化脚本能有效减少存储占用,尤其适合运维人员管理多台服务器时批量使用。
如果在实际执行中遇到问题,建议优先检查权限和日志文件,或回看本文的避坑说明。