Docker默认使用json-file日志驱动,但易致磁盘占满;推荐生产环境用local驱动并配置max-size、max-file和compress,或对接syslog/fluentd实现集中管理。

默认情况下,Docker 使用 json-file 日志驱动,将容器 stdout/stderr 日志以 JSON 格式写入宿主机磁盘。这种方式简单但易导致磁盘被撑满,且缺乏轮转、压缩和远程投递能力。合理配置日志驱动并规划持久化路径,是生产环境稳定运行的关键一环。
常用日志驱动选型与适用场景
Docker 支持多种日志驱动,不同驱动解决不同问题:
-
json-file:默认驱动,适合开发调试或短期运行容器;需配合日志轮转(
max-size/max-file)避免磁盘爆满 - local:比 json-file 更轻量,支持自动压缩(zstd)、按大小/时间轮转,内存占用更低,推荐替代 json-file 用于大多数业务容器
- syslog:将日志转发至本地或远程 syslog 服务(如 rsyslog、syslog-ng),便于统一收集与审计
- fluentd 或 loki:对接日志平台,适用于需要结构化处理、标签过滤、长期存储与可视化分析的场景
- none:完全禁用日志采集,仅在明确不需要日志时使用(如纯后台计算任务)
全局日志配置(daemon.json)
通过修改 /etc/docker/daemon.json 可统一设置所有新建容器的日志行为,避免逐个指定:
{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
修改后需执行 sudo systemctl reload docker 生效。注意:已有容器不受影响,只对新创建容器生效。
若需为特定容器覆盖全局配置,可在 docker run 中使用 --log-driver 和 --log-opt 参数,例如:
docker run --log-driver=syslog --log-opt syslog-address=udp://192.168.1.100:514 nginx
日志目录映射与宿主机持久化管理
Docker 默认将 json-file/local 日志存于 /var/lib/docker/containers/<container-id>/<container-id>-json.log。该路径属 Docker 内部管理,不建议直接操作或挂载 volume 替换。正确做法包括:
- 启用
local驱动并配置轮转参数,让 Docker 自动清理旧日志 - 使用
syslog或fluentd将日志实时导出到外部系统,宿主机仅保留短期缓冲 - 若必须落盘到自定义路径,可通过
rsyslog或logrotate定期归档/var/lib/docker/containers/下的日志文件(需注意文件锁与容器生命周期) - 禁止对
/var/lib/docker目录做 bind mount 或 NFS 挂载,易引发权限、性能与一致性问题
排查与验证日志配置是否生效
确认容器实际使用的日志驱动及参数:
docker inspect <container-name> | grep -A 5 LogConfig
查看当前日志内容(仅限 json-file/local):
docker logs <container-name>
检查日志文件实际大小与数量:
ls -lh /var/lib/docker/containers/*/*-json.log
若使用 syslog,可检查 journalctl -u rsyslog 或目标 syslog 服务器接收情况。











