根分区被docker占满的核心问题是/var/lib/docker下长期积累的停止容器可写层、悬空镜像、构建缓存和无主卷等隐形资源;必须先用docker system df及df -v诊断占用分布,再按优先级用system prune等原生命令安全清理,最后通过日志轮转和定期脚本防复发。
根分区被 docker 占满,核心问题不在容器本身,而在 /var/lib/docker 目录下长期积累的“隐形资源”——停止的容器可写层、悬空镜像、构建缓存、无主卷等。直接删文件风险高,必须用 docker 原生命令按逻辑顺序清理。
先诊断:看清空间到底被谁吃掉
别急着删,先执行:
docker system df —— 查总用量(镜像、容器、卷、构建缓存各占多少)
docker system df -v —— 查明细,比如哪个镜像超 2GB、哪个卷存了数据库备份没清理
du -sh /var/lib/docker/* —— 快速定位大目录(常见大户:overlay2、build-cache、volumes)
安全清理:只动真正无用的资源
这是日常维护推荐方式,不碰运行中服务,也不删有标签的镜像:
-
docker system prune -f:一键清掉已停止容器、悬空镜像(
<none>:<none></none></none>)、未用网络、全部构建缓存 - 单独补刀更可控:
• docker container prune -f(清停止容器)
• docker image prune -f(清悬空镜像)
• docker builder prune -f(清构建缓存,常占数 GB)
深度清理:释放更多空间(操作前确认)
当 system df 显示大量“未使用镜像”或“未使用卷”时启用:
-
docker system prune -a -f:删所有未被任何容器引用的镜像(含带标签但没在用的,如旧版
myapp:v1.2) -
docker volume prune -f:删所有未被容器挂载的卷(⚠️ 确保里面没存生产数据,比如 PostgreSQL 的
pgdata卷不能乱删) - 如需连日志也控量:进容器日志目录
/var/lib/docker/containers/*/*-json.log,用truncate -s 0 *.log清空(或配置 Docker daemon 的日志驱动限大小)
防复发:避免下次又爆满
清理只是救火,长期得靠机制:
- 给 Docker 配置日志轮转:
在/etc/docker/daemon.json加:
{"log-driver": "json-file","log-opts": {"max-size": "10m","max-file": "3"}}
然后sudo systemctl restart docker - 定期跑清理脚本(例如每天凌晨):
docker system prune -f --filter "until=24h"(只删 24 小时前的无用资源) - 构建镜像时加
--no-cache或优化 Dockerfile,减少中间层堆积











