Skip to content
DevOps2026-09-083 分钟阅读

Docker no space left on device 磁盘爆满:清理命令从安全到激进的完整阶梯

现象:build 到一半 / pull 到一半,突然没空间了

# 构建时
failed to solve: ... write /var/lib/docker/tmp/...: no space left on device

# 拉镜像时
failed to register layer: Error processing tar file(no space left on device)

# 运行中容器写日志
Error response from daemon: ... no space left on device

一行结论:宿主机放 /var/lib/docker 的那块盘满了。Docker 用「写时复制」层叠镜像,每一次 build、pull、run 都在往同一个目录堆东西——而其中大部分是可再生成的垃圾。

先看清楚:空间被谁吃了

df -h /var/lib/docker        # 盘还剩多少
docker system df             # Docker 视角的四类占用

docker system df 的输出对应四个清理维度:

| 类别 | 是什么 | 可清理性 | |---|---|---| | Images | 镜像(含 dangling 悬空层) | 多数可再生 | | Containers | 停止的容器占着的可写层 | 看业务 | | Local Cache | build cache | 可再生 | | Volumes | 持久化数据 | ⚠️ 数据,默认不动 |

-v 能看到每个镜像/容器的具体体积,先定位再动手,不要上来就 prune -a

清理阶梯:从安全到激进,逐级执行

# 第一级:只清已停止的容器(docker ps -a 里非 Up 的)
docker container prune

# 第二级:清 dangling 镜像(<none>:<none> 的悬空层,build 失败的残留)
docker image prune

# 第三级:清所有「没有被任何容器引用」的镜像——含旧版本 tag
docker image prune -a

# 第四级:清 build cache
docker builder prune

# 组合拳:上面几样一起来(不含 volume)
docker system prune

大多数「磁盘爆满」到二三级就解决了。每条命令都会列出将删除的对象和可回收空间,看一眼再按 y

最危险的开关:--volumes

docker system prune --volumes   # ⚠️ 会删除「未被引用」的 volume

数据库容器重建后原 volume 不再被引用?--volumes 会把它连同数据一起删掉。除非你明确知道自己在干什么,否则不要加这个参数。生产环境删 volume 前先备份。

也别直接 rm -rf /var/lib/docker/*——绕过 Docker 元数据,注册表和实际文件对不上,之后所有镜像操作都会出诡异错误。清空间永远用 docker 自己的命令。

两个「清了还会满」的根因

1. 容器日志无上限增长

json-file 日志驱动默认不限大小,一个疯狂打日志的容器能把盘写满:

du -sh /var/lib/docker/containers/*/*-json.log | sort -rh | head -5

根治:/etc/docker/daemon.json 配日志轮转(对新容器生效,旧容器需重建):

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "50m", "max-file": "3" }
}

改完 sudo systemctl restart docker。单容器也可以在 docker run --log-opt max-size=50m 指定。

2. 磁盘其实没满,inode 满了

df -h 显示还有空间却仍报 no space?查 inode:

df -i /var/lib/docker
# IUse% 100% ← 小文件(overlay 层、cache)把 inode 耗尽了

解法同样是 prune——层叠文件系统里一个 inode 泄漏源头能造出海量小文件。

预防

  1. CI/CD 构建机加定时任务:每天 docker system prune -af(纯构建机没有 volume 顾虑);
  2. daemon.json 配好日志轮转(见上),这是最多人漏掉的一条;
  3. 监控 /var/lib/docker 所在分区,告警阈值 80%;
  4. 生产把 /var/lib/docker 挂独立分区,爆了不影响系统日志和数据库。

排查清单

  1. df -h /var/lib/docker + docker system df — 空间和占比一目了然
  2. 按阶梯执行:container prune → image prune → builder prune
  3. --volumes 不到万不得已不加;rm -rf /var/lib/docker 永远不用
  4. 清完没多久又满?查容器日志大小 du -sh .../*-json.log
  5. df -h 有空间仍报错?df -i 查 inode
  6. daemon.json 日志轮转配置了吗?

本文由 ToolVault 工具匣 提供。相关工具:Dockerfile 生成器字节单位换算Linux 命令速查。相关阅读:Docker daemon 连不上排查端口被占用 EADDRINUSE。访问 首页 查看更多开发者工具。


广告