ref="/tag/439/" style="color:#8B0506;font-weight:bold;">容器跑着跑着系统盘就满了?别慌,这是常态
用Docker开发或部署服务的人应该都有类似经历:明明没放几个应用,/var/lib/docker 目录却占了几十GB。查了一圈发现,罪魁祸首往往是那些已经停掉的容器、废弃的镜像,还有没人管的日志文件。
先看看磁盘到底被谁占了
别急着删东西,先搞清楚现状。执行下面命令,能直观看到Docker各部分占用情况:
docker system df
输出结果会列出镜像、容器、卷、构建缓存等的使用量。比如你可能发现“RECLAIMABLE”那一栏写着十几GB,说明有大量可回收空间。
一键清理:最常用的回收命令
如果只是想快速释放空间,这条命令能清掉所有未使用的资源:
docker system prune -a
加上 -a 是为了连带删除未被任何容器引用的镜像。执行后通常能腾出可观空间。但注意,这会删掉你不用的镜像,下次启动还得重新拉,所以生产环境慎用。
精准下手:单独处理日志膨胀问题
有时候空间暴增不是因为镜像,而是某个容器狂写日志。比如你本地跑了个Node.js服务,调试时输出一堆信息,时间一长单个容器日志就能到几个GB。
查看某个容器日志大小:
du -sh /var/lib/docker/containers/<container_id>/*.log
限制日志大小可以在启动容器时加参数:
docker run -d --log-opt max-size=100m --log-opt max-file=3 your_image
这样日志最多保留3个文件,每个不超过100MB,避免无限增长。
定期维护:别让缓存堆积成山
如果你经常build镜像,那构建缓存可能是隐藏大户。时间久了,这些中间层会越积越多。清理它们:
docker builder prune --all
或者直接清空整个构建缓存:
docker builder prune -a -f
顺手再检查下有没有孤立的volume:
docker volume ls -qf dangling=true
有就删:
docker volume rm $(docker volume ls -qf dangling=true)
自动化点:加个定时任务省心
如果你在服务器上长期运行Docker,可以设置一个cron任务每月自动清理一次:
0 0 1 * * /usr/bin/docker system prune -af
加 -f 是免交互执行。不过记得评估业务场景,别把正在用的资源误删了。
小技巧:换个数据目录也行
如果根分区实在紧张,可以把Docker的数据目录迁到其他大容量分区。改配置文件 /etc/docker/daemon.json:
{
"data-root": "/mnt/bigdisk/docker"
}
重启Docker服务后,新容器都会存到新位置,老的可以逐步清理。