Docker 磁盘空间耗尽:先识别可清理对象,再恢复节点容量
Docker 节点磁盘满时,先量化镜像、容器、卷和日志的占用,避免一条 prune 误删仍需保留的数据。
维护者 Kevin · Ovalk
适用范围与前提
适用于 Linux Docker Engine;Docker Desktop、rootless 和自定义数据根目录的位置不同。
先确认 Docker Root Dir、日志驱动与实际耗尽的文件系统。Docker socket 权限很高,清理前必须识别业务数据卷。
常见症状
- docker pull 或容器写入失败并报 no space left on device
- 节点根分区使用率接近 100%
- 应用日志突然中断或容器反复退出
1. 先找占用,而不是先清理
确认是 inode 用尽还是块空间用尽,再用 Docker 自身视图和文件系统视图交叉核对。容器 JSON 日志常是最大单项,但也可能是匿名卷或构建缓存。
df -h; df -i
docker system df -v
docker info --format "{{.DockerRootDir}}"2. 以最小破坏性释放空间
先确认日志驱动和实际数据目录。不要直接截断或删除 Docker 管理的 JSON 日志;通过支持的轮转配置处理,并注意新默认配置不影响已存在的容器。仅清理确认可重建且不再需要的缓存;下方 prune 会删除构建缓存,执行前须批准。
下方包含会改变系统状态的示例,执行前确认授权、范围及恢复方案。
docker ps -a --size
docker builder prune --filter "until=168h"3. 恢复后校验与复盘
空间恢复只是一半。检查关键容器是否正常写入、日志采集器是否没有阻塞,以及根分区告警阈值是否足够早。
docker ps --format "table {{.Names}}\t{{.Status}}"
journalctl -u docker --since "30 min ago" --no-pager解读证据
| 观察结果 | 下一步检查 |
|---|---|
| inode 耗尽但字节有余量 | 检查该挂载点的大量小文件,删除一个大镜像未必能释放足够 inode。 |
| 可回收构建缓存 | 先确认 builder 使用者与缓存需求,清理会影响后续构建速度。 |
| 容器日志很大 | 确认日志驱动,不直接截断或删除 Docker 管理的 JSON 日志文件。 |
说明性诊断案例
以下假设案例用于解释推理,并非客户真实事故,也不代表已在你的技术环境中测试。
docker system df 中镜像占用不大,文件系统却接近满。某个容器使用无大小限制的 json-file 日志。删除镜像无法解决持续增长;应降低日志源写入,按支持方式处理日志,再评估中断后用轮转设置重建受影响容器。
验证恢复
- 检查块空间与 inode 余量,并确认镜像拉取与应用写入恢复。
- 恢复正常流量后观察增长;修改 Docker 默认日志设置不会自动应用到已有容器。
回滚与停止条件
重建前保存容器定义和日志配置。清理的镜像与缓存需重新拉取或构建,删除的卷数据需备份恢复;归属不清时优先评估临时扩容。
预防与长期修复
- 配置容器日志轮转与容量上限。
- 把镜像缓存、运行时数据和业务数据的容量预算分开。
- 对磁盘空间和 inode 同时告警。
参考资料与纠错
请使用与你安装版本匹配的文档。以下资料解释基础行为,命令仍需结合实际环境验证。
向 Kevin 提交更正,请附页面地址、版本与脱敏复现步骤。请查看编辑原则(英文)。