容器日志管理:别让 json-file 吃满磁盘
docker logs 看着方便,代价是 json-file 默认无限增长。一个报错循环的服务,一天能写几十 G。
日志策略要回答三件事:留多久、放哪里、出事怎么查。
先说结论
全局配 max-size 10m + max-file 3,重要服务再上集中收集。
- daemon.json 里配 log-opts 全局生效
- compose 里可单独覆盖
- 集中收集用 Loki/ELK,避免容器重建丢日志
- 应用侧控制日志级别与采样
先把问题说清楚
json-file 每行一条记录,体积膨胀快;local 驱动有内置轮转,更适合单机。
集中收集的价值在于容器重建后日志仍在,且能跨服务关联查询。
具体怎么做
按顺序执行,每步都验证完再进下一步:
- 在 /etc/docker/daemon.json 配置 log-driver 与 log-opts
- 重启 docker 使配置生效(影响新容器)
- 对已有容器逐个更新或重建
- 重要服务接入 Loki/Promtail 或 ELK
- 加磁盘水位告警,阈值 80%
参数与成本对照
把关键数值摊开,方便判断该选哪条路:
| 驱动 | 轮转 | 适用 |
|---|---|---|
| json-file | 需手动配 | 开发/单机 |
| local | 内置 | 单机生产 |
| loki/fluentd | 外部管理 | 多机集中 |
| none | 无 | 高频无价值日志 |

几个容易踩的坑
下面这些是最常见的错误做法:
- daemon.json 改完不重启 docker:不生效
- 只改 compose 不管全局:其他容器照样疯长
- 日志轮转后仍用 docker logs 查历史:查不到
- 把日志目录挂到宿主机却忘了清理
最后补两句
日志要能回答「什么时候、哪个服务、发生了什么」。配好这三点,比留一堆无用日志强。
工具是手段,理解机制才是能力。命令记不住没关系,知道「该看什么」就够了。
评论 (3)
照着做了一遍,确实少走弯路。第二步最容易漏,建议顺手加个检查清单。
比「一键脚本」有用多了,知道为什么比知道怎么做重要。
补充一句:不同版本行为会变,动手前先确认自己的版本号。
发表评论