直接修改 /etc/docker/daemon.json 可全局配置 docker 日志驱动,使新容器默认走 elk 链路;支持 fluentd(推荐)和 syslog 两种方案,需 reload docker 服务且已运行容器须重启才生效,elk 端须正确配置接收与解析。

直接改 Docker daemon 的全局配置,就能让所有新容器默认走 ELK 日志链路,不用每个容器都加 --log-driver 参数。核心是修改 /etc/docker/daemon.json,指定驱动、地址和基础字段。
配置 daemon.json 启用全局日志驱动
编辑或新建 /etc/docker/daemon.json,填入对应驱动的配置。以下为两种主流方案:
-
fluentd 方案(推荐):适合需要结构化、重试、自动补字段的场景
{ "log-driver": "fluentd", "log-opts": { "fluentd-address": "192.168.1.100:24224", "tag": "docker.${name}.${id:.12}" } } -
syslog 方案(轻量):适合已有 Logstash 接收 syslog 的环境
{ "log-driver": "syslog", "log-opts": { "syslog-address": "tcp://192.168.1.100:514", "syslog-tag": "{{.Name}}.{{.ID}}" } }
保存后执行 sudo systemctl reload docker 生效。注意:已运行的容器不会自动继承,需重启才生效。
确保 ELK 端服务就绪
全局配置只是“发出去”,ELK 端必须能接住并正确解析:
- Fluentd 实例需启用
forward输入插件监听24224,输出插件用elasticsearch并设include_timestamp true - Logstash 若接 syslog,必须启用
sysloginput 插件,并在 filter 中用date过滤器将原始时间转为@timestamp - 所有节点间网络要通,时间需同步(NTP),否则 Kibana 时间轴会偏移
覆盖单个容器的日志行为
全局配置可被容器启动参数覆盖。例如某容器想单独打 JSON 格式日志,可临时指定:
docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 nginx- 或强制走 fluentd 但换 tag:
--log-driver=fluentd --log-opt tag="legacy-app"
这种覆盖优先级高于 daemon.json,适合灰度验证或特殊服务隔离。
验证与排错要点
配置完别急着上线,先做三件事确认链路通:
- 用
docker info | grep "Logging Driver"确认 daemon 已加载目标驱动 - 起一个测试容器,立刻查 Fluentd 或 Logstash 日志,看是否有新事件流入
- 在 Kibana 中查
docker-*索引,确认@timestamp、service、host字段存在且合理
常见断点:防火墙拦了 24224/514 端口、Fluentd 输出插件没装 elasticsearch、Logstash date 过滤器未匹配到时间字段。











