Docker客户端无需密码访问私有仓库的关键在于:daemon.json配置insecure-registries解决连接问题,而是否需密码由仓库侧决定——Harbor需设项目为公开,Nexus需启用匿名访问,原生registry默认无认证。
要让 docker 客户端无需密码访问私有仓库(如 harbor、nexus、自建 registry),关键不是在 daemon.json 里“配置白名单”,而是通过配置 不校验 tls 证书 + 允许不安全的 http 仓库,并配合正确的客户端登录(或跳过认证)逻辑来实现。docker daemon 本身不支持“无密码白名单”这种访问控制机制——认证和授权由私有仓库自身管理,daemon 只负责通信策略。
1. 配置 daemon.json 允许不安全的私有仓库
如果你的私有仓库使用的是 HTTP(非 HTTPS)或自签名证书,Docker 默认拒绝连接。需在 /etc/docker/daemon.json 中添加 insecure-registries:
{
"insecure-registries": ["my-registry.local:5000", "192.168.1.100:8082"]
}
- 每项是
host:port格式,必须精确匹配你 push/pull 时使用的地址 - 不支持域名通配符(如
*.local),只能逐个列出 - 修改后需重启 Docker:
sudo systemctl restart docker
2. 跳过 TLS 证书校验(仅限自签名 HTTPS 仓库)
若私有仓库用了自签名 HTTPS 证书(如 https://harbor.example.com),除了加 insecure-registries,还需将证书加入系统信任链,否则 daemon 仍会报 x509: certificate signed by unknown authority:
- 把仓库的 CA 证书(如
ca.crt)复制到/etc/docker/certs.d/harbor.example.com:443/ca.crt - 目录名必须与仓库地址完全一致(含端口,HTTPS 默认 443)
- 无需重启 Docker,但需确保文件权限为
root:root且不可被组/其他写入
3. “无密码”的本质:取决于仓库是否开启匿名拉取
Docker daemon 不处理用户名密码;是否需要密码由私有仓库决定:
-
Harbor:需在项目设置中开启“公开”(Public),或为
anonymous用户赋权 - Nexus Repository:在仓库的 “Anonymous Access” 设置中启用,并分配对应 blob store 权限
-
原生 registry:默认无认证;若启用了 Basic Auth,则必须用
docker login登录才能 pull(即使 daemon 配置正确)
也就是说:daemon.json 配置解决的是“连得上”,而“要不要密码”由仓库侧策略决定。
4. 客户端无需反复 login 的技巧
如果仓库确实要求登录,但你想免输密码,可预置凭据:
- 运行一次
docker login my-registry.local:5000 -u user -p pass,凭据会存入~/.docker/config.json - 也可用
credHelpers配合外部凭据工具(如pass或gcloud auth configure-docker) - 注意:
config.json文件权限应为600,避免泄露密码


















