必须在容器启动前配置max-size和max-file,否则默认json-file驱动会无限追加日志至单个*-json.log文件,导致磁盘爆满;推荐启动时用--log-opt指定10m/3或docker-compose中配置,已爆满需用truncate清空而非rm。

直接上结论:靠事后清理是救火,必须在容器启动前就配好 max-size 和 max-file,否则日志文件会无声无息涨到几十 GB,等你发现时系统可能已经卡死。
为什么容器日志会突然爆满?
默认的 json-file 驱动不设限,stdout/stderr 会持续追加写入一个 *-json.log 文件,哪怕容器只输出一行 debug 日志,跑半年也能撑到 50GB+。这不是 bug,是设计如此——Docker 不替你做轮转,除非你明确告诉它怎么做。
- 应用未关闭调试日志(比如 Spring Boot 的
logging.level.root=DEBUG) - 循环报错没兜底(如数据库连不上反复重试并打日志)
- 容器长期运行但从未配置日志限制
-
docker logs --tail 100看起来正常,但du -sh /var/lib/docker/containers/*/*-json.log可能显示单个文件已超 20GB
怎么在启动容器时就堵住日志膨胀?
最稳妥的方式是把日志限制写进容器定义里,而不是依赖全局配置——因为 daemon.json 的设置对已有容器不生效,且容易被覆盖或遗忘。
- 用
docker run启动时加参数:--log-opt max-size=10m --log-opt max-file=3 - 在
docker-compose.yml中配置:logging: driver: "json-file" options: max-size: "10m" max-file: "3" -
max-size推荐 10–100MB(小服务用 10m,高流量用 50–100m);max-file推荐 3–5,再多意义不大,旧日志基本没人查 - 注意:
max-size是单个文件上限,不是总大小;达到后自动轮转,旧文件名带数字后缀(如xxx-json.log.1),再超就删最老的
已经爆满了,怎么安全清空而不中断服务?
别直接 rm 或 echo "" > xxx-json.log —— Docker 进程仍持有文件描述符,磁盘空间不会释放。必须用 truncate。
- 查出最大日志文件:
find /var/lib/docker/containers -name "*-json.log" -exec du -sh {} \; | sort -hr | head -5 - 清空指定容器日志(不影响运行):
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_id>)</container_id> - 批量清空所有容器日志(慎用):
truncate -s 0 /var/lib/docker/containers/*/*-json.log - 验证是否释放成功:
df -h+docker system df对比,空间应立刻回落
为什么不用 docker system prune 清日志?
它完全不管日志文件。docker system prune 只清理容器、镜像、网络、构建缓存这四类对象,而 *-json.log 属于容器可写层下的独立文件,不在 Docker 对象模型里。所以无论加 -a 还是 --volumes,它都不会碰日志文件一指头。
真正容易被忽略的是:日志轮转配置必须在容器创建时生效,重启容器才能加载新设置;正在运行的容器不会自动套用 daemon.json 里的新日志选项——这点连很多运维都会踩坑。











