磁盘爆满需先用df -h和df -i同时判断性质:若Use%高而IUse%正常,属容量型,主清日志/缓存;若Use%不高但IUse%达100%,则为inode耗尽,须清理小文件而非大文件。

df -h 和 df -i 必须一起看
根分区爆满,第一反应不是删文件,而是确认“满”的性质。只跑 df -h 看到 Use% 100%,可能掩盖真实问题——比如 df -i 显示 IUse% 也是 100%,那就是 inode 耗尽,和日志大小无关,删大日志没用。常见于 /var/lib/docker/containers 下大量小日志碎片,或 /var/log/journal 里堆积的 journal 条目。两个命令必须同时执行,缺一不可。
定位真正吃空间的容器日志文件
别靠 docker ps 猜,直接查磁盘上的日志实体:
-
du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -hr | head -5—— 找出前 5 个最大的日志文件 -
find /var/lib/docker/containers -name "*-json.log" -size +100M 2>/dev/null—— 快速筛出超 100MB 的日志 -
docker inspect --format='{{.LogPath}}' <container-id>—— 验证某容器日志路径是否和磁盘上一致(避免误删其他容器)
注意:*-json.log 是默认驱动生成的文件名,如果你改过 log-driver(比如用了 syslog),那日志根本不在这个目录下,查了也白查。
清空日志不能用 rm,得用 truncate
直接 rm -f /var/lib/docker/containers/xxx/xxx-json.log 后,df -h 可能完全不释放空间。因为 Docker 进程仍持有该文件句柄,文件只是被 unlink,实际 inode 还在写入。正确做法是清空内容而非删除文件:
- 单个清理:
truncate -s 0 /var/lib/docker/containers/xxx/xxx-json.log - 批量清理(谨慎):
find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} \; - 别用
cat /dev/null > xxx-json.log—— 如果当前用户没权限写该文件,会报错;而truncate在 root 下更可靠
执行后立刻 df -h 对比,空间应实时回落。如果没变,说明还有别的大文件,或者你清的是错的路径。
限制新容器日志大小必须改 daemon.json 或加启动参数
临时清空只是救火,不配置日志轮转,一周后还会爆。两种方式选其一,但效果不同:
- 单容器生效(适合已有服务):
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ... - 全局生效(推荐,影响所有后续新建容器):编辑
/etc/docker/daemon.json,加入:{ "log-driver": "json-file", "log-opts": { "max-size": "20m", "max-file": "5" } }然后systemctl restart docker
注意:旧容器不会自动继承新配置,必须 docker stop && docker rm && docker run 重建才生效。很多人改完 daemon.json 就以为万事大吉,结果发现老容器还在狂写,这点最容易忽略。


















