最稳妥方式是直接修改 /etc/docker/daemon.json,全局生效且无需重启容器,但已有容器不继承新配置;可用 docker info | grep 'logging driver' 查看默认日志驱动,若无输出则可能 docker 版本过旧。

直接改 /etc/docker/daemon.json 是最稳妥的方式,全局生效、无需重启容器,但已有容器不继承新配置。
怎么确认当前 Docker 默认日志驱动
运行 docker info | grep 'Logging Driver',输出类似 Logging Driver: json-file。注意:这个值只反映 daemon 级默认配置,单个容器可能被 --log-driver 覆盖。
如果没看到输出,说明 docker info 没有返回该字段——大概率是 Docker 版本太老(systemctl status docker。
改 daemon.json 配置 local 驱动并启用轮转
local 驱动比默认的 json-file 更省磁盘和内存,支持自动压缩、按大小/时间轮转,且不依赖外部服务,适合大多数生产容器。
编辑 /etc/docker/daemon.json,写入:
{"log-driver": "local",
"log-opts": {
"max-size": "20m",
"max-file": "5",
"compress": "true"
}}
关键点:
-
max-size必须带单位(m、k、g),写成20或20MB都会失效 -
compress: "true"是字符串,不是布尔值;写成true(无引号)会导致 daemon 启动失败 - 改完必须执行
sudo systemctl reload docker,restart会中断正在运行的容器
为单个容器覆盖全局日志配置
比如某个 Nginx 容器要发日志到远程 syslog,而其他容器走 local:
docker run --log-driver=syslog --log-opt syslog-address=udp://192.168.1.200:514 nginx
常见陷阱:
-
syslog-address必须指定协议(udp://或tcp://),漏掉会报错unable to configure logging driver - 若用
tcp://,目标 syslog 服务必须监听 TCP 端口,且防火墙放行 - 使用
fluentd驱动时,fluentd-address的 IP 必须是宿主机能访问的地址,不能写localhost(容器内解析的是自己)
为什么不要挂载 /var/lib/docker/containers/ 目录
Docker 把日志文件锁死在内部路径,比如 /var/lib/docker/containers/abc123.../abc123...-json.log。有人想用 volume 映射出来方便查看,这会出问题:
- 容器启动时,Docker 尝试创建日志文件但发现路径已被挂载,可能静默失败或写入失败
- 日志文件被外部进程(如
tail -f)打开时,Docker 轮转会卡住,旧日志删不掉 - NFS 或 bind mount 到该路径,极易引发 inode 泄漏或权限混乱,导致
docker logs命令报错failed to open log file
真要落盘到自定义路径,正确做法是用 rsyslog 或 logrotate 定期 copytruncate 归档,而不是动 Docker 的根目录。











