日志为什么占盘
容器日志默认由 json-file 驱动写入宿主上的文件,而且默认不轮转:容器持续输出,对应文件就一直变大,最终可能撑满整个数据分区。控制方式有两种:创建容器时用日志选项限定单文件大小与保留个数,或者在守护进程配置里下发全局默认值,后者只对之后新建的容器生效。
基本信息
| 默认驱动 | json-file,写入宿主文件且默认不轮转 |
|---|---|
| 运行参数 | --log-opt max-size=10m --log-opt max-file=3 |
| 守护进程级 | daemon.json 里的 log-opts 下发默认值 |
| 生效时机 | 创建容器时写入 |
| 查看方式 | 按占用排序找出大日志文件 |
典型使用场景
- 长跑服务上线前统一加轮转参数
- 磁盘告警后定位并清空已经写大的日志
- 为整套环境下发默认轮转策略
- 排障期临时放宽上限,定位完成后恢复
- 统计各容器日志占用,找出主要贡献者
限制与回收
限制与回收
docker run -d --log-opt max-size=10m --log-opt max-file=3 --name web nginx:1.27
du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -h | tail -5 # 找大日志
truncate -s 0 /var/lib/docker/containers/<id>/<id>-json.log # 已写大的文件用清空方式回收
docker inspect -f '{{.HostConfig.LogConfig}}' web # 核对容器的日志配置设置位置与生效范围
| 对象 | 设置位置 | 生效范围 |
|---|---|---|
| 单个容器 | 运行参数中的日志选项 | 仅该容器 |
| 守护进程默认 | 守护进程配置文件 | 新建容器 |
| 已有容器 | 参数需重建后生效 | 重建才写入 |
| 日志文件 | 数据目录下的容器目录 | 轮转后保留最近若干份 |
已经写大的日志要用清空内容的方式回收空间:直接删除正在写入的文件不会立即释放,进程仍持有该文件的句柄。
轮转参数只在创建容器时写入,存量容器需要重建才会生效;守护进程默认值同样只作用于新建的容器。
另一类做法是把日志驱动换成写入宿主本地文件的驱动,日志由宿主侧统一轮转,代价是读取容器日志的习惯需要相应调整。