必须对docker容器日志主动限制,否则高频服务几天可生成几十gb日志导致磁盘挤爆;推荐全局配置daemon.json设json-file驱动、max-size=10m、max-file=5、mode=non-blocking,重启docker后对新建容器生效。

在微服务生产环境中,必须对 Docker 容器日志做主动限制,否则单个高频输出日志的服务(比如网关、订单处理模块)几天就可能生成几十 GB 日志,直接挤爆磁盘,触发 Kubernetes 驱逐或容器崩溃。
全局配置 daemon.json(推荐用于所有新容器)
这是最稳妥的生产实践,一次配置,永久生效(对后续新建容器):
- 编辑 /etc/docker/daemon.json,写入以下内容(若文件不存在则新建):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5",
"mode": "non-blocking"
}
}
- max-size: "10m" —— 单个日志文件上限 10MB,避免单文件过大难排查、难传输
-
max-file: "5" —— 最多保留 5 个轮转文件(如
xxx-json.log、xxx-json.log.1….4),总占用 ≤ 50MB/容器 - mode: "non-blocking" —— 关键!防止日志写满时阻塞应用线程,保障服务可用性
- 保存后执行:
systemctl daemon-reload && systemctl restart docker
⚠️ 注意:该配置只影响重启后新建的容器,已有运行中容器需重建才生效。
单容器精准控制(适合关键服务单独调优)
对日志量特别大或特别敏感的服务(如支付核心、风控引擎),可在启动时覆盖全局策略:
- 使用
docker run启动时显式指定:
docker run -d \ --name payment-service \ --log-driver json-file \ --log-opt max-size=5m \ --log-opt max-file=10 \ --log-opt mode=non-blocking \ -e LOG_LEVEL=warn \ registry/payment:v2.8
- 或在
docker-compose.yml中声明(适用于微服务编排):
services:
payment:
image: registry/payment:v2.8
logging:
driver: "json-file"
options:
max-size: "5m"
max-file: "10"
mode: "non-blocking"
这样可为高危服务设置更保守的日志上限(例如 5MB × 10 = 50MB),同时不影响其他模块。
清理已膨胀的日志(紧急补救操作)
配置生效前,旧容器日志可能已占满磁盘。不能直接 rm -f,否则空间不释放(进程仍持有句柄):
- 先定位最大日志文件:
du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | head -10 - 安全清空(不中断进程):
cat /dev/null > /var/lib/docker/containers/abc123.../abc123...-json.log - 或批量清空脚本(谨慎执行):
find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} \;
✅ 这种方式立即释放磁盘空间,且不影响正在运行的容器。
验证与监控不可少
配置不是一劳永逸,要确认它真正在工作:
- 检查某容器是否启用轮转:
docker inspect my-service | jq '.HostConfig.LogConfig' - 查看宿主机实际日志文件:
ls -lh /var/lib/docker/containers/*/,确认有.1、.2等轮转文件 - 加一条基础监控:用
df -h或 Prometheus + cAdvisor 报警/var/lib/docker使用率 > 85%
真正稳定的微服务日志管理,靠的不是“等出事再删”,而是默认就设好边界、留有余量、并有人盯着水位线。











