必须在daemon.json中全局配置log-driver、max-size、max-file等参数,重启docker后对新建容器生效;推荐使用local驱动并启用compress以节省空间和提升稳定性。
直接在 docker 守护进程层面统一配置日志驱动,是控制所有新启动容器日志体积最稳妥的方式。它不依赖单个容器的启动参数,避免遗漏或配置不一致,尤其适合生产环境批量管理。
修改 daemon.json 启用自动轮转
编辑 /etc/docker/daemon.json,加入日志驱动与限流参数:
-
log-driver:保持为
json-file(默认值,可省略)或改用更优的local驱动(自带压缩和更稳的缓冲) -
max-size:建议设为
"10m"~"100m",数值越小越早触发切割,降低单文件风险 -
max-file:设为
"3"~"5",保留最近若干份,旧文件被自动删除,不占额外空间 -
compress(仅
local驱动支持):设为"true",轮转后自动 gzip 压缩,节省 70%+ 空间
示例配置(使用 local 驱动):
{
"log-driver": "local",
"log-opts": {
"max-size": "20m",
"max-file": "5",
"compress": "true"
}
}
保存后执行 sudo systemctl restart docker 生效。
验证配置是否生效
重启后新建容器无需再加 --log-opt,其日志行为即受全局控制:
- 运行
docker run -d nginx,然后docker inspect $(docker ps -q --filter ancestor=nginx | head -1) | jq '.[0].HostConfig.LogConfig' - 确认输出中
Type为local或json-file,且Config包含你设置的max-size和max-file - 检查日志文件位置:
/var/lib/docker/containers/<id>/<id>-json.log</id></id>(json-file)或/var/lib/docker/containers/<id>/<id>-local.log</id></id>(local),观察大小是否被限制
注意容器生命周期与日志留存的关系
日志文件不会随容器停止而自动清理,只在容器被 docker rm 删除时才移除对应日志。因此:
- 长期运行的容器,靠
max-size+max-file控制体积;临时容器(如 CI 任务),建议配合docker run --rm,结束即删日志 - 若需清理已有旧容器残留日志,可手动清理
/var/lib/docker/containers/*/下已无对应容器的*-json.log文件(先停 dockerd 更安全) - Kubernetes 环境下,节点级 daemon.json 配置同样生效,但需确保 kubelet 不覆盖日志驱动设置(如未显式指定
containerLogMaxSize)
避免“隐形天花板”导致日志丢失
高频日志场景下,仅靠 max-size 不足以防止丢日志。还需关注底层缓冲:
- 检查宿主机 inotify 队列上限:
cat /proc/sys/fs/inotify/max_queued_events,低于 65536 时建议调高(如设为 524288) - 若用
json-file驱动且日志量极大,推荐切换至local驱动——它绕过 inotify,采用内存队列+异步刷盘,稳定性更高 - 避免同时启用
mode=non-blocking却不调大max-buffer-size,否则缓冲溢出会静默丢弃日志











