容器日志悄悄吃满磁盘:三步先定位再清理

举报
yd_291415297 发表于 2026/10/24 22:00:35 2026/10/24
【摘要】 容器默认把 stdout 写进宿主机 json.log,容器里 df 看不出来。用 du、docker ps 和 docker logs 三步定位,再用 max-size 限制增长。

刚把一个 Python 小服务放进 Docker 时,我只关心 docker ps 是不是 Up。直到宿主机磁盘报警到百分之九十五,进容器执行 df -h 却发现根分区还很空,才明白空间常常不在容器可写层里,而在宿主机上 Docker 托管的 json 日志。

容器默认使用 json-file 日志驱动。标准输出和标准错误都会追加到路径 /var/lib/docker/containers/容器ID/容器ID-json.log。如果服务在循环里打印调试信息,或者把访问日志也打到 stdout,这个文件会一直变大。你用 docker exec 进去看不到它,所以会出现「容器里还有空间、宿主机却满了」的错位。

我固定用三步排查,都不改业务代码。第一步在宿主机执行 sudo du -sh /var/lib/docker/containers//-json.log,再按大小排序,先看是哪一个容器在写。第二步用 docker ps --no-trunc 对照容器 ID 前缀,确认是自己的服务,而不是系统组件。第三步执行 docker logs --tail 50 容器名,看最近是不是同一行错误在重复刷屏。如果每秒几十次,优先把日志降下来,而不是先删文件。

想限制增长,运行时可以加上参数 --log-opt max-size=10m 和 --log-opt max-file=3。它只对新建容器生效,已经很大的旧文件不会自动缩小。清理前先 docker stop,再处理对应的 json.log,避免运行中直接截断导致日志驱动报错。生产环境更稳妥的做法,是把日志交给采集端,容器本身只保留短期滚动。

给学生做实验时记住一件事就够:stdout 不是免费的。本地练习也给日志设上限;磁盘报警时先找 json.log,确认来源后再决定要不要清。

另外,json.log 里每一行都带时间戳和流类型,不适合当业务日志的长期存档。实验做完记得停掉不用的容器,避免后台进程还在刷日志。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。