容器日志暴涨是什么
使用默认日志驱动时,容器日志没有大小上限:应用一旦进入错误循环或被打开高频调试日志,文件会迅速增长,磁盘占满后不只是这个容器不可用,Docker 守护进程与同宿主上的其他服务都会一起异常。处置分两步:先用截断的方式止血——直接删除文件并不释放空间,因为文件句柄仍被占用——再配置大小上限从根上解决,应用侧的日志级别与错误循环同样要修。
基本信息
| 止血手段 | truncate -s 0 <日志文件>,不要删除仍在被写入的文件 |
|---|---|
| 定位大户 | 按文件大小排序查看各容器日志占用 |
| 根治配置 | 全局设置日志大小与文件个数上限,或按容器单独设置 |
| 应用侧 | 修正日志级别与错误循环,日志暴涨本身往往是故障信号 |
| 监控加固 | 把磁盘使用率与日志增长速度纳入告警 |
典型使用场景
- 磁盘使用率告警,需要快速定位到底是哪个容器写满了磁盘
- 应用异常进入重试循环,日志量在几分钟内暴涨
- 检查是否有人关闭了日志上限配置,导致防护失效
- 大促或流量高峰前加固日志策略,提前划出安全边界
- 复盘时确认止血动作是否留下了足够定位根因的现场信息
止血与配置
止血与配置
truncate -s 0 /var/lib/docker/containers/<id>/<id>-json.log # 截断止血
du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail # 按大小排序定位大户
# /etc/docker/daemon.json
{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}
systemctl reload docker # 重载配置,对新建容器生效止血与根治对照
| 动作 | 作用 | 注意 |
|---|---|---|
| 截断日志 | 立即释放磁盘空间 | 文件与句柄保留,日志内容被清空 |
| 删除日志文件 | 空间不会释放 | 句柄仍指向原文件,白删还丢现场 |
| 配置大小上限 | 从根上限制增长 | 仅对新建容器生效,旧容器需重建 |
| 调整应用日志级别 | 减少日志产出 | 治本,但需要业务侧配合改动 |
| 磁盘与增速告警 | 提前发现趋势 | 比事后止血更有效 |
删除正在被写入的日志文件不会释放磁盘空间(文件句柄仍指向原文件):必须先截断,或者先停止容器再处理,否则会出现磁盘持续告警却查不到大户的情况。
截断会同时丢掉现场信息:操作前先把最后一段日志复制到别处留档,否则事后定位根因时缺少关键证据,只能等下次复现。