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 泄漏源头能造出海量小文件。
预防
- CI/CD 构建机加定时任务:每天
docker system prune -af(纯构建机没有 volume 顾虑); - daemon.json 配好日志轮转(见上),这是最多人漏掉的一条;
- 监控
/var/lib/docker所在分区,告警阈值 80%; - 生产把
/var/lib/docker挂独立分区,爆了不影响系统日志和数据库。
排查清单
df -h /var/lib/docker+docker system df— 空间和占比一目了然- 按阶梯执行:container prune → image prune → builder prune
--volumes不到万不得已不加;rm -rf /var/lib/docker永远不用- 清完没多久又满?查容器日志大小
du -sh .../*-json.log df -h有空间仍报错?df -i查 inode- daemon.json 日志轮转配置了吗?
本文由 ToolVault 工具匣 提供。相关工具:Dockerfile 生成器、字节单位换算、Linux 命令速查。相关阅读:Docker daemon 连不上排查、端口被占用 EADDRINUSE。访问 首页 查看更多开发者工具。
相关工具
相关文章
Permission denied (publickey) 怎么解决?Git 推送失败的 6 种原因与修复
git clone/push 报 Permission denied (publickey) fatal: Could not read from remote repository?覆盖公钥没生成、没加载进 agent、没添加到 GitHub/Gitee、多账号配错密钥、deploy key 权限、remote URL 写错六种根因,附 ssh -v 诊断方法。
npm ERR! ERESOLVE:peer dependency 冲突的四种解决策略
npm install 报 ERESOLVE unable to resolve dependency tree 怎么办?理解 peer dependency 的设计意图,掌握四种解决策略(版本修复 / legacy-peer-deps / overrides / dedupe)及其适用场景与风险。
error:0308010C digital envelope routines::unsupported 怎么解决?Node 17+ 跑老项目的三种修法
Node 17+ 启动 webpack 4 老项目报 error:0308010C:digital envelope routines::unsupported?根因是 OpenSSL 3.0 移除了 MD4 哈希。本文给出 --openssl-legacy-provider 临时方案、升级 webpack 5 根治方案和锁定 Node 16 的取舍。