daemon.json配置不生效需聚焦三点:一是JSON语法必须严格合法(如引号、逗号、无注释)、registry-mirrors为带https://的数组;二是执行systemctl daemon-reload和restart docker后,用docker info验证是否加载;三是排除Windows Docker Desktop不读取该文件、权限错误、BOM头或旧加速地址失效等环境干扰。
daemon.json 配置不生效,不是“改了没用”,而是某个环节断开了链路。排查要聚焦三个真实落点:配置本身是否合法、docker 守护进程是否真正加载、运行环境是否覆盖或拦截了该文件。
检查 daemon.json 内容和格式是否真正合规
JSON 语法极其严格,一个多余逗号、一个中文引号、一行注释都会让 dockerd 直接忽略整个文件。
- 用 sudo jq . /etc/docker/daemon.json 验证语法(报错即说明 JSON 不合法)
- 确保 registry-mirrors 是数组格式,每个地址带完整 https:// 协议头,例如:
"https://docker.m.daocloud.io",不能写成docker.m.daocloud.io - 确认没有混入 Vim/Nano 保存时产生的 BOM 头、不可见空格或制表符;推荐用 printf 重写内容,避免编辑器污染
- 阿里云等厂商的加速地址已更新,旧地址如
https://<id>.mirror.aliyuncs.com</id>已停用,需登录控制台重新获取有效地址
确认配置是否被守护进程实际读取
改完文件不等于生效。Docker 启动时只在初始化阶段读取一次 daemon.json,必须强制重载并重启服务。
- 执行 sudo systemctl daemon-reload(重载 systemd 配置)
- 再执行 sudo systemctl restart docker(重启 dockerd 进程)
- 立即验证:docker info | grep -A 1 "Registry Mirrors",若输出为空或显示
none,说明配置未加载 - 常见干扰项:CentOS/RHEL 系统中可能同时存在
docker.socket,需一并 stop:sudo systemctl stop docker.socket,再 reload + restart
识别运行环境是否绕过或覆盖该文件
不同平台加载机制差异极大,尤其 Windows Docker Desktop 和新版 Docker Engine 26+ 有独立逻辑。
-
Windows Docker Desktop 默认不读取
%PROGRAMDATA%\Docker\config\daemon.json,而是通过 GUI 设置或命令 docker desktop set-engine-config 动态生成 WSL2 中的/etc/docker/daemon.json;可用 docker desktop show-engine-config 查看当前生效配置源 -
Docker 26.1.4+ 存在多 socket 监听冲突问题,若 systemd 的
ExecStart固定使用-H fd://,可能导致 daemon.json 加载失败;建议通过/etc/systemd/system/docker.service.d/override.conf显式指定--host=unix:///var/run/docker.sock - 检查文件权限:ls -l /etc/docker/daemon.json 应为
-rw-r--r-- root:root;目录/etc/docker权限应为drwxr-xr-x
快速定位错误根源的底层方法
当 systemctl restart 报错或静默失效时,跳过 systemd,直接用 dockerd 命令启动,能暴露真实错误。
- 临时运行:sudo dockerd --debug --config-file /etc/docker/daemon.json
- 终端会实时打印解析过程和第一处错误位置(比如 “invalid character ‘/’ after object key”),比查 journal 日志快得多
- 若该命令能成功启动并显示你配置的镜像源,则说明问题出在 systemd 启动参数或 socket 配置上


















