用jq验证daemon.json语法是最快速可靠的方法:运行sudo jq . /etc/docker/daemon.json,若输出美化json则语法基本正确,若报错则精准定位行号与字符问题,如无效控制字符、中文引号、尾随逗号、注释或bom等。
daemon.json 一写错,docker 就起不来,报错往往只显示 job for docker.service failed,根本看不出哪行错了。关键不是猜,而是用工具直接定位。
用 jq 验证 JSON 语法是否合法
这是最快速、最可靠的一步。jq 能明确告诉你错在哪一行、哪个字符:
- 运行
sudo jq . /etc/docker/daemon.json - 如果输出美化后的 JSON,说明语法基本没问题
- 如果报错,例如
parse error: Invalid string: control characters from U+0000 through U+001F must be escaped,说明文件里混入了不可见字符(比如 Vim 粘贴带格式文本、Windows 换行符或中文空格) - 常见错误包括:中文引号(“”)、末尾多余逗号、漏掉引号、注释(JSON 不支持 // 或 /* */)
检查文件内容是否纯净
编辑器容易悄悄塞进隐藏字符。别依赖肉眼检查:
- 用
sudo cat -A /etc/docker/daemon.json查看所有不可见字符(如^M表示 Windows 换行,M-bM-^@M-^@可能是 UTF-8 BOM 或乱码) - 推荐用
tee重写干净文件:sudo tee /etc/docker/daemon.json { "registry-mirrors": ["https://docker.m.daocloud.io"] }<br> EOF - 避免用图形编辑器或 Word 类工具保存,一律用 nano、vim -u NONE 或命令行生成
确认文件权限和路径正确
Docker 守护进程必须能读取该文件,且不能被其他配置覆盖:
- 执行
ls -l /etc/docker/daemon.json,权限应为-rw-r--r--(644),所有者是root:root - 执行
ls -ld /etc/docker,目录权限应为drwxr-xr-x(755) - 确保没有同名的
/etc/docker/daemon.conf或 systemd drop-in 文件(如/etc/systemd/system/docker.service.d/override.conf)在干扰加载
绕过 systemd,用 dockerd 直接调试
systemctl 只告诉你失败,dockerd 命令会打印具体错误原因:
- 先停掉服务:
sudo systemctl stop docker - 手动运行守护进程:
sudo dockerd --config-file /etc/docker/daemon.json -D - 终端会实时输出启动日志,遇到 JSON 解析失败时,会明确提示类似:
failed to load JSON file /etc/docker/daemon.json: invalid character '}' looking for beginning of object key string - 这个方式能跳过 systemd 封装,直击配置解析环节











