必须配置insecure-registries并重启docker服务:linux编辑/etc/docker/daemon.json添加带端口的仓库地址数组后执行systemctl restart docker;macos/windows需在docker desktop的docker engine设置中修改json并apply & restart。
要让 docker 守护进程信任 http 或自签名 https 的私有仓库,必须在 /etc/docker/daemon.json(linux)、docker desktop 设置(macos/windows)中正确配置 insecure-registries。它不是客户端登录配置,而是 daemon 层的安全豁免规则,不配就无法 push/pull。
Linux 系统:编辑 daemon.json 并重启服务
这是最常见也最直接的方式:
- 确保
/etc/docker/daemon.json文件存在(不存在就新建),用 root 权限编辑 - 添加或补全
insecure-registries字段,值为字符串数组,每个地址需带端口(即使默认 80/443 也要显式写) - 示例配置(支持 IP、域名、本地别名):
{ "insecure-registries": [ "harbor.internal:8080", "192.168.1.50:5000", "registry.local" ] } - 保存后执行两步命令生效:
sudo systemctl daemon-reloadsudo systemctl restart docker - 验证是否加载成功:
docker info | grep -A 5 "Insecure Registries"
macOS 和 Windows(Docker Desktop):图形界面操作
Docker Desktop 不读取系统级 daemon.json,需通过设置界面修改:
- 点击右上角 Docker 图标 → Settings → Docker Engine
- 在 JSON 编辑器中加入
insecure-registries字段(格式同上) - 特别注意 macOS 常用的本地访问方式:
"host.docker.internal:5000"是推荐写法,不是localhost - 点 Apply & Restart,等待 Docker 重启完成
关键细节和常见踩坑点
很多失败不是因为不会写,而是忽略这些硬性要求:
-
必须带端口:哪怕仓库监听 80 或 443,Docker 仍要求显式写出,如
"myreg.example.com:80",不能只写域名 -
不支持通配符:不能写
"*.example.com"或"192.168.*.*",必须逐个列出具体地址 - HTTP 和自签 HTTPS 都需要加:只要证书不被系统信任(包括自签名、内网 CA、无证书的纯 HTTP),都得进这个列表
-
与 registry-mirrors 互不干扰:可同时配置两者,
insecure-registries只影响连接协议校验,不影响镜像加速逻辑 -
改完不重启 = 白改:修改 daemon.json 后,仅 reload 不够,必须
restart docker才会重新加载整个配置
配置后仍失败?快速自查方向
如果加了配置还是报 http: server gave HTTP response to HTTPS client:
- 确认 Docker 服务确实已重启(
systemctl status docker查状态) - 检查 JSON 格式是否合法(多一个逗号、少一个引号都会导致整个 daemon.json 加载失败)
- 确认仓库服务本身在目标地址+端口上可访问(用
curl -v http://xxx:5000/v2/测试) - 确认你 push/pull 时使用的地址,和 daemon.json 中写的完全一致(大小写、端口、路径都不能差)











