配置解决什么问题
默认情况下 Docker 客户端只信任带合法证书的 HTTPS 注册表。对只有 HTTP 或使用自签证书的内部仓库,需要在守护进程配置文件 /etc/docker/daemon.json 中把地址写进 insecure-registries,并重启 docker 服务后客户端才会前往连接。这等于放弃对该仓库的传输加密与身份校验,只能作为受控内网里的过渡手段。
基本信息
| 用途 | 让客户端信任非 HTTPS 或自签证书的注册表 |
|---|---|
| 配置位置 | /etc/docker/daemon.json(需 root 权限) |
| 字段 | insecure-registries 数组,元素形如 host:port |
| 生效方式 | 重启 docker 服务,重启守护进程后才读取 |
| 安全前提 | 仅限受控内网,且仓库本身可信任 |
典型使用场景
- 内网测试仓库(registry:2 未配 TLS)需要先跑通推送流程
- 证书链临时不可用时应急放行,随后换正式证书
- 使用自签证书但暂时没把 CA 装入系统信任库
- 离线或隔离网络中自建仓库分发镜像
- 迁移期新旧仓库地址并存,需要同时可用
配置与应用
配置与应用
{
"insecure-registries": ["registry.internal:5000", "10.10.0.8:5000"]
}校验与验证
校验与验证
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak # 改前备份
sudo python3 -m json.tool /etc/docker/daemon.json # 先校验 JSON 语法
sudo systemctl restart docker # 重载守护进程配置
docker info | grep -A3 'Insecure Registries' # 确认配置已读入
docker push registry.internal:5000/team/app:1.0 # 验证推送是否成功报错与处置对照
| 现象 | 原因 | 处置 |
|---|---|---|
| server gave HTTP response to HTTPS client | 仓库是 HTTP,客户端按 HTTPS 连接 | 加入 insecure-registries 或给仓库配置 TLS |
| x509: certificate signed by unknown authority | 自签证书未被信任 | 把 CA 装入系统信任库,或临时用该参数过渡 |
| 改完配置没有任何变化 | 未重启守护进程 | systemctl restart docker |
| docker 服务起不来 | daemon.json JSON 语法错误 | 用 json.tool 校验后修正 |
地址要按 host:port 原样写入,域名与 IP 被视为不同条目,写错一个字符就等于没有配置。
长期方案是给仓库配置受信证书并全部走 HTTPS,把该字段只保留在离线或隔离环境的例外清单里。
该配置只改变客户端侧的信任判断,不会让仓库本身变得安全;仓库若需要对外提供服务,仍要配置 TLS 证书、账号与访问控制。