Docker 报 no space left on device(磁盘空间不足)怎么解决?
先 docker system df 看空间去向,再 docker system prune -a 清理未使用资源;日志文件撑爆用 log-opt 限制,构建缓存用 builder prune。本文给出去向分析、清理命令与预防配置。
应急两步:docker system df 看清空间被谁吃掉(镜像/容器/卷/缓存),然后 docker system prune -a 清掉所有未使用资源。之后做两件预防:给容器日志加大小限制(log-opt),定期 prune 构建缓存,否则迟早再满。
第一步:看空间去向
docker system df
docker system df -v # 细看每个镜像/容器/卷
df -h /var/lib/docker # Docker 数据目录所在分区
四大去向:镜像(含悬空层)、停止的容器、卷、构建缓存。另外容器日志文件(json-file)常是隐藏大户,在 /var/lib/docker/containers/*/ 下。
第二步:对症清理
docker system prune # 温和:停止的容器+悬空镜像+未用网络
docker system prune -a # 加清所有未被容器使用的镜像
docker system prune -a --volumes # 连未用卷一起(数据会丢,慎用!)
docker builder prune -a # 单清构建缓存
docker container prune # 单清停止的容器
容器日志手动清(不清容器本身):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
第三步:配置预防复发
/etc/docker/daemon.json 限制日志无限增长:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
重启 Docker 生效(只对新容器生效)。再加一条 crontab 定期清理:
0 3 * * 0 docker system prune -f
还没解决?inode 耗尽
df -h 显示空间够但还报错,查 inode:
df -i /var/lib/docker
海量小文件(如构建缓存、旧日志碎片)会耗尽 inode,清理思路相同。
观测云对照
磁盘水位前置告警。 用 DataKit 采集主机磁盘与 Docker 目录用量指标,监控器设 80% 预警、90% 紧急两档告警,配合容器维度用量排行,定位"谁的日志/镜像在膨胀"一次查询搞定。
常见问题(FAQ)
Q:prune -a 会删掉我在用的镜像吗?
A:不会删被容器(含停止的)引用的镜像;但"没在跑但想留着的镜像"会被删,执行前先确认。
Q:清理后 df 没变化?
A:可能有容器进程还握着已删文件(lsof +L1 查),重启 Docker 或相关容器释放。
Q:/var/lib/docker 能挪到大磁盘吗?
A:可以,daemon.json 里配 "data-root": "/data/docker",迁移后重启 Docker。