容器磁盘暴涨?清理实操指南
问题背景
在生产或开发环境中,容器化应用常因日志堆积、未清理的镜像层、悬空卷等导致磁盘占用飙升,甚至触发存储告警。本文提供一套可立即执行的清理流程,适用于Docker及containerd环境。
一、诊断磁盘占用
执行以下命令快速定位消耗源:
docker system df该命令会按镜像、容器、卷、构建缓存分类显示占用空间。若需查看具体容器的磁盘写入量:
docker ps --size二、清理未使用的对象
1. 清理所有未使用的资源
运行docker system prune并附加--volumes标志来删除:停止的容器、未被任何容器引用的网络、悬空镜像(dangling images)以及所有未使用的卷。
docker system prune -a --volumes -f注意:-a会删除所有未使用的镜像(而非仅悬空镜像),-f跳过确认。
2. 单独清理镜像
若需保留部分镜像,可先查看镜像列表:
docker images --digests然后批量删除:
docker image prune -a -f3. 清理构建缓存
Docker BuildKit默认在/var/lib/docker/buildkit下累积大量缓存。执行:
docker builder prune -a -f该操作会删除所有构建缓存,释放大量空间。
三、日志文件专项清理
容器日志默认写入宿主机/var/lib/docker/containers下的JSON文件,且不会自动轮转。
1. 手动清理日志文件
定位日志文件:
ls -lh /var/lib/docker/containers/*/*.log清空文件内容(不删除文件):
truncate -s 0 /var/lib/docker/containers/*/*.log2. 设置日志轮转
在启动容器时添加--log-opt参数限制日志大小:
docker run --log-opt max-size=10m --log-opt max-file=3也可在daemon.json中全局配置:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}修改后重启Docker Daemon:systemctl restart docker。
四、卷与临时文件清理
1. 移除未使用的卷
docker volume prune -f2. 清理容器内临时文件
进入容器或使用docker exec删除/tmp、/var/cache等目录:
docker exec -it rm -rf /tmp/*注意:该操作可能影响正在运行的服务,建议在业务低峰期执行。
五、深入分析镜像层
工具dive可逐层查看镜像文件变动:
dive 帮助识别哪些层产生了额外体积(如无用的包缓存、中间产物),进而优化Dockerfile减少层数。
六、定期自动化
将清理命令加入crontab:
0 3 * * 0 docker system prune -a --volumes -f每周日凌晨3点自动清理。
总结
容器磁盘暴涨多由未清理的镜像、日志和构建缓存引起。通过上述步骤,大部分场景可回收30%~70%的已用空间。建议结合日志轮转策略和定期cron任务,从源头控制增长。