通过修改 docker 守护进程的配置文件 /etc/docker/daemon.json,将日志驱动切换为 journald 或 local 可以解决权限问题。具体做法是添加 {"log-driver": "journald"} 配置项并重启服务,这能利用系统级日志服务接管写入,避免容器进程因无法访问宿主机的特定日志文件路径而崩溃。

Docker 默认日志驱动为何会报权限错误
Docker 默认的 json-file 驱动会将日志写入宿主机目录 /var/lib/docker/containers/。如果该目录的属主不是 root 或者权限设置过于严格(例如仅允许 root 写入),运行在容器内的非特权进程尝试通过挂载卷或重定向输出时,就会触发 EACCES 错误导致服务退出。

{
"storage-driver": "overlay2",
"log-driver": "journald",
"log-opts": {
"tag": "{{.Name}}"
}
}
上述配置片段展示了如何永久更改全局日志策略。保存后执行 systemctl restart docker 生效。此后所有新建容器的标准输出和错误输出都会直接发送给 systemd-journald,不再产生独立的 JSON 文件,从而彻底规避了针对 /var/lib/docker/containers 的权限检查。
如何在不修改全局配置的情况下修复单个服务
如果不想影响其他容器,可以在启动命令中指定 --log-driver 参数,或者在 docker-compose.yml 中配置 logging 字段。推荐使用 local 驱动,它在本地保留少量轮转文件,但路径由 Docker 内部逻辑管理,通常比 json-file 更稳定且占用空间更小。

version: '3.8'
services:
web:
image: nginx
logging:
driver: local
options:
max-size: '10m'
max-file: '3'
这段 Compose 配置将 web 服务的日志限制为最多 3 个文件,每个最大 10MB。这种局部覆盖方式不会影响全局的 json-file 设置,适合微服务架构中不同组件对日志存储有不同需求的场景。
切换到 journald 后如何查看特定容器的日志
使用 journald 驱动后,传统的 docker logs 命令依然可用,因为它底层会查询 journal。可以通过 journalctl 命令结合标签进行过滤。例如,查看名为 my-app 的容器日志,可以使用 journalctl -t my-app。这种方式利用了 systemd 强大的日志管理能力,支持实时跟踪和持久化存储。











