连接拒绝(Connection refused)表明TCP连接无法建立,主因是私有仓库服务未运行、未监听目标端口、防火墙拦截或Docker客户端协议配置不匹配(如HTTP仓库未配置insecure-registries)。
连接拒绝(connection refused)在 docker 私有仓库客户端推送时,通常意味着客户端根本无法建立 tcp 连接,不是认证或权限问题,而是通信链路在最底层就中断了。排查要从网络可达性、服务监听状态和 tls/http 配置三方面入手。
确认私有仓库服务是否正在运行并监听正确端口
在私有仓库服务器上执行:
- 检查容器或进程是否存活:
docker ps | grep registry(若用 Registry 官方镜像)或systemctl status harbor(若用 Harbor) - 验证监听端口:
ss -tuln | grep ':5000\|:443',确认服务确实在目标端口(如 5000 或 443)上 bind 到 0.0.0.0 或具体 IP,而非仅 localhost - 若使用 Harbor,确保
core和registry组件都处于 running 状态,docker-compose ps可快速查看
验证客户端能否直连仓库服务器端口
在推送镜像的客户端机器上操作:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 用
telnet registry.example.com 443或nc -vz registry.example.com 5000测试 TCP 层连通性 - 若失败,说明是防火墙、安全组或路由问题:检查客户端出口策略、服务器入站规则(如 iptables、ufw、云平台安全组)、中间代理是否拦截
- 注意:Docker daemon 默认不走系统代理,需单独为
dockerd配置 HTTP_PROXY(写入/etc/docker/daemon.json并重启服务)
检查仓库协议与客户端配置是否匹配
常见错配导致“连接拒绝”假象:
- 仓库只启用了 HTTPS(443),但客户端用
http://地址推送 → 实际发起的是 HTTP 请求,被拒绝 - 仓库是 HTTP(如本地测试用
localhost:5000),但 Docker daemon 默认拒绝非 HTTPS 仓库 → 需在/etc/docker/daemon.json中添加"insecure-registries": ["registry.example.com:5000"]并重启 dockerd - 自签名证书未被信任:若用 HTTPS + 自签证书,客户端会因证书校验失败而中止连接(错误常表现为 timeout 或 x509 错误,但某些场景下也表现为连接拒绝)
抓包定位真实失败点(进阶)
当上述步骤仍无结论时,在客户端执行:
-
tcpdump -i any host registry.example.com and port 5000(替换为目标地址和端口) - 同时另起终端运行
docker push registry.example.com/myapp:latest - 观察抓包结果:若完全无 SYN 包发出 → 本地 DNS 或路由问题;若发出 SYN 但无 SYN-ACK → 服务未监听或被拦截;若有 RST 返回 → 服务明确拒绝连接(如端口关闭或防火墙 DROP)

















