当前位置: 首页 > news >正文

Ubuntu server配置Docker Daemon.json 顽固不生效

序言:

搭建私有仓库,但是没有签名证书。由于docker要求必须走https,因此需要修改daemon.json。

摘要

本文详细记录了在 Ubuntu Server(ubuntu-24.04.3-live-server-amd64) 环境中,Docker 守护进程(dockerd)拒绝加载 /etc/docker/daemon.json 配置的疑难杂症。即使配置内容和权限都正确,问题依然存在。本文提供了一个从标准检查到强制 Systemd 覆盖的完整、专业的故障排除路径,帮助你解决 insecure-registries 等配置不生效的问题。


一、故障现象与工程逻辑分析

故障现象: /etc/docker/daemon.json 文件已创建并包含正确的 insecure-registries 配置,但执行 systemctl restart docker 后,docker info 命令显示该配置未被加载(Insecure Registries: 后面为空)。

核心推论: Docker 守护进程在启动时,要么找不到文件,要么找到了但无法解析,或者被更高优先级的配置或系统安全模块覆盖。


二、标准排查路径(排除基本错误)

在着手复杂修复前,必须排除 90% 的常见错误。

1. 检查配置文件的内容和格式 (Vim/Nano 陷阱)

确保您的 JSON 文件格式严格正确,这是最常见的失败原因。

步骤 命令 检查要点
文件内容 sudo cat /etc/docker/daemon.json 确保是有效的 JSON。最后一个键值对后不能有逗号
格式示例 json\n{\n "insecure-registries": [\n "192.168.1.100:57080"\n ]\n}\n
字符污染 确保没有 Vim/Nano 引入的不可见字符、UTF-8 空格或制表符。(我们使用 echo -eprintf 写入纯净内容来解决此问题)

2. 检查文件权限与所有权

Docker 守护进程以 root 权限运行,它必须能读取文件。

步骤 命令 检查结果
文件权限 ls -l /etc/docker/daemon.json 权限应为 -rw-r--r--
目录权限 ls -ld /etc/docker 所有者应为 root root,权限应为 drwxr-xr-x

3. 检查服务操作 (Systemd 流程)

必须按照正确的 Systemd 顺序进行操作。

步骤 命令 逻辑
重新加载 sudo systemctl daemon-reload 告诉 Systemd 重新扫描配置。
重启服务 sudo systemctl restart docker 重新启动 dockerd 守护进程。
验证 `docker info sed -n '/Insecure Registries/p'`

三、进阶排查与终极解决方案(绕过 Bug)

如果标准排查失败,问题极可能在于 dockerd 被 systemd 启动时,配置加载逻辑被环境 Bug 干扰。

1. 失败的控制变量法诊断

我们使用 log-opts 替换 insecure-registries,如果依然失败,则证明 daemon.json 文件本身在您的环境中根本没有被读取。

2. 终极解决方案:Systemd ExecStart 强制覆盖

既然配置文件失败,我们就强制 Systemd 在启动时,直接将配置作为命令行参数传递给 dockerd

步骤 1:启动 Systemd 编辑器

使用 EDITOR=vim 确保您用 Vim 打开文件,并准备进行精简操作。

sudo EDITOR=vim systemctl edit docker.service

步骤 2:在 Vim 中写入纯净的 ExecStart 覆盖

这是解决问题的关键步骤。您需要删除 systemctl edit 自动生成的所有注释和参考内容,只保留以下三行纯配置:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.1.100:57080 --insecure-registry nyat.app:12345
  • Vim 操作提示: 使用 :1,$d 清空文件,然后进入插入模式 (i) 粘贴配置。然后 :wq 保存退出。

步骤 3:重新加载并重启服务

sudo systemctl daemon-reload
sudo systemctl restart docker

逻辑: 这种方法彻底绕开了 daemon.json 文件解析,直接告诉 dockerd 携带这些参数启动。

3. 版本有问题!

如果仍然还不可以,那就是你安装docker的过程是参考的别人的博客,而博客内容有一定的错误。我这次就参考了安装,花费了很多小时,里里外外都排查了,甚至切换了不同版本的Linux系统仍然存在。
后面怀疑该docker教程(以前参考别人博客搭建的)有问题,于是通过控制变量法得出:兼容性有问题。

需要按照官方的教程重新安装,官方安装教程.

http://www.jsqmd.com/news/26949/

相关文章:

  • sunpinyin online的简单例子
  • 程序员修炼之道:从小工到专家
  • microsoft edge webview离线安装包
  • 概率递推1
  • Revit Api打印当前项目的所有的可打印视图
  • 实验课收获2025.10.30
  • DW1000芯片帧组成解析
  • revit api测量距离
  • 《程序员修炼之道》第一章有感
  • 10月30日日记
  • 代码大全2阅读笔记(3)
  • rustdesk 下载Windows版
  • apue笔记-进程环境、进程控制、进程关系
  • 数字识别(非汉字版)
  • Rust 解析验证码:结合 Tesseract OCR 进行文本识别
  • UML图以及设计模式部分总结
  • Consul访问宿主机api项目失败 - binzi
  • 读《代码大全2》第一章有感
  • 10.30博客
  • 251030
  • FOC学习
  • 软件技术第二次作业
  • 前端三剑客——javascript流程控制与异常处理
  • 《代码大全2》-观后感-一本可以陪伴整个职业生涯的“案头书”
  • Android Tor浏览器缩略图取证技术解析
  • 串口打印彩色log
  • 洛必达法则
  • 2025平航杯
  • 第七天第四天7.4
  • Linux提权基础