全部排错手册
容器 / Docker更新于 4 分钟阅读 · 执行耗时因环境而异

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 提交更正,请附页面地址、版本与脱敏复现步骤。请查看编辑原则(英文)