必须全局配置daemon.json中的max-size和max-file成对参数,推荐设为"10m"和"5"并启用mode:"non-blocking",重启docker后新容器自动生效,单容器超50mb即轮转删除最旧文件。

直接配 max-size 和 max-file 就能有效防日志撑爆磁盘,关键是要选对配置层级和参数值。
全局配置(推荐用于所有新容器)
编辑 /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、.1、.2….4),总占用 ≤ 50MB/容器 - mode: "non-blocking" —— 日志写满时不阻塞应用线程,保障服务不卡死
保存后执行:systemctl daemon-reload && systemctl restart docker。注意:该配置只对重启 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 \ 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"
验证是否生效
检查某容器的日志配置:
docker inspect <container_id> --format='{{.HostConfig.LogConfig}}'</container_id>
查看实际日志文件大小:
ls -lh /var/lib/docker/containers/<container-id>/<container-id>-json.log</container-id></container-id>
如果看到多个带编号的 -json.log.* 文件,且单个不超过设定值,说明轮转已正常工作。
常见误区提醒
- 不设
mode=non-blocking,日志写满时可能让应用线程挂起,引发超时或熔断 -
max-file是“最多保留几个文件”,包含当前正在写的那个,不是“额外保留几个” - 单位支持
k、m、g,但不要写成10MB(必须小写m) - 已有容器不会自动继承新 daemon 配置,必须重建或手动
docker update --log-opt(部分版本支持)











