Docker 报 no space left on device(磁盘空间不足)怎么解决?

先 docker system df 看空间去向,再 docker system prune -a 清理未使用资源;日志文件撑爆用 log-opt 限制,构建缓存用 builder prune。本文给出去向分析、清理命令与预防配置。

最佳实践
Docker 报 no space left on device(磁盘空间不足)怎么解决?封面

应急两步: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。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台