容器默认会将 stdout/stderr 输出保存到宿主机的 JSON 文件中随着容器运行时间增长日志文件可能占满磁盘导致服务不可用。同时分布式环境下查看分散在各主机上的日志极其低效。本文深入讲解 Docker 的日志驱动机制如何限制日志大小、配置不同的日志驱动json-file、syslog、fluentd并搭建 ELK 或 Loki 实现集中日志管理。一、Docker 日志基础容器中的应用程序如果输出日志到标准输出stdout和标准错误stderrDocker 会捕获这些输出并通过日志驱动logging driver进行处理。默认驱动是 json-file将日志写入宿主机的 /var/lib/docker/containers//-json.log 文件。问题容器不限制日志文件大小可能导致磁盘被写满。默认驱动不支持日志轮转和压缩。多主机环境下日志分散难以统一查看。二、配置日志驱动2.1 查看当前日志驱动dockerinfo|grepLogging Driver2.2 运行时指定日志驱动# 使用 syslog 驱动dockerrun --log-driver syslog --log-opt syslog-addresstcp://192.168.1.10:514 alpineechotest# 使用 fluentd 驱动dockerrun --log-driver fluentd --log-opt fluentd-address192.168.1.10:24224...2.3 全局默认驱动配置daemon.json编辑 /etc/docker/daemon.jsonjson{“log-driver”: “json-file”,“log-opts”: {“max-size”: “10m”,“max-file”: “3”,“compress”: “true”}}重启 Dockersystemctl restart docker。三、常用日志驱动详解四、json-file 驱动配置本地轮转# 运行容器时指定dockerrun-d--log-driver json-file\--log-opt max-size10m\--log-opt max-file3\--log-optcompresstrue\nginxmax-size单个日志文件最大大小如 10m、1g。max-file最多保留的文件数轮转后保留旧文件数量。compress是否压缩旧日志。查看日志文件ls/var/lib/docker/containers/container-id/# 会出现id-json.log, id-json.log.1.gz 等五、集中日志收集方案5.1 使用 ELKElasticsearch Logstash Kibana架构容器 → 日志驱动 → Logstash → Elasticsearch → Kibana步骤配置 daemon.json 使用 gelf 驱动发送到 Logstashjson{“log-driver”: “gelf”,“log-opts”: {“gelf-address”: “udp://localhost:12201”}}启动 Logstash 配置 gelf inputrubyinput {gelf {port 12201}}output {elasticsearch {hosts [“http://elasticsearch:9200”]}}启动 Elasticsearch 和 Kibana可通过 Docker Compose。5.2 轻量级方案Loki PromtailGrafana 栈Loki 是受 Prometheus 启发的日志聚合系统不索引全文只索引标签成本低。docker-compose 示例version:3services:loki:image:grafana/loki:latestports:-3100:3100promtail:image:grafana/promtail:latestvolumes:-/var/lib/docker/containers:/var/lib/docker/containers:ro-/var/run/docker.sock:/var/run/docker.sockcommand:-config.file/etc/promtail/promtail-docker-config.yamlgrafana:image:grafana/grafana:latestports:-3000:3000在 Grafana 中添加 Loki 数据源即可通过 LogQL 查询日志。5.3 使用 Fluentd最通用# 启动 Fluentd 容器dockerrun-d--namefluentd\-p24224:24224\-v/var/log/fluentd:/fluentd/log\fluent/fluentd:latest# 运行容器时指定日志驱动dockerrun --log-driver fluentd --log-opt fluentd-addresslocalhost:24224...Fluentd 可将日志转发到 Elasticsearch、S3、Kafka 等。六、日志驱动常见问题七、清理日志命令# 清理所有容器的日志文件保留最近 3 天dockercontainer prune--filteruntil72h# 手动清理单容器日志文件truncate-s0/var/lib/docker/containers/*/*-json.log# 使用 logrotate 工具推荐cat/etc/logrotate.d/docker /var/lib/docker/containers/*/*-json.log{daily rotate7compress missingok delaycompress copytruncate}八、最佳实践生产环境必须配置日志轮转max-size / max-file。集中日志收集选择 ELK / Loki / Splunk避免登录各主机查看。避免在容器内写日志文件应输出到 stdout/stderr由 Docker 驱动统一处理。使用标签丰富日志如 --log-opt tag“{{.ImageName}}|{{.Name}}”对于 json-file 驱动有效。安全考虑日志中避免输出密码、token 等敏感信息。监控磁盘使用率设置告警避免日志占满导致容器崩溃。九、小结Docker 日志管理不仅仅是防止磁盘爆满更是可观测性的基石。通过选择合适的日志驱动和集中收集工具你可以轻松查看、搜索和告警显著提升故障排查效率。