问题描述
在国内 VMware 虚拟机里执行 docker pull 时报错:
Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp xxx.xxx.xxx.xxx:443: i/o timeout
原因:Docker Hub 在国内网络环境下无法直连,国内镜像源(阿里云、南大等)也基本不可用。
解决方案:让虚拟机走 Windows 上的网络代理
前提条件
Windows 上已配置并开启网络代理工具(如 Clash Verge),且代理可以正常使用。
第一步:代理工具开启局域网连接
打开代理工具设置(以 Clash Verge 为例),找到 "局域网连接" 开关,确保它是开启状态(蓝色)。
记下端口号(Clash Verge 默认端口是 7897,在设置的"端口设置"里查看)。
第二步:Windows 添加防火墙规则
以管理员身份打开 PowerShell(右键开始菜单 → 终端管理员),执行:
netsh advfirewall firewall add rule name="Clash Verge LAN All" dir=in action=allow protocol=TCP localport=7897 profile=any
把 7897 换成你实际的代理端口。
第三步:确认 Windows 主机 IP
VMware NAT 模式下有两个容易混淆的 IP:
| IP | 是什么 |
|---|---|
192.168.220.1 | Windows 主机的 VMnet8 虚拟网卡 ← 应该用这个 |
192.168.220.2 | VMware 内部 NAT 网关 ← 不是 Windows 主机,连不上 |
在虚拟机里执行 ip route | grep default 看到的网关是 .2,但代理要填 .1。
在虚拟机里确认连通性:
ping 192.168.220.1
能 ping 通说明 IP 正确。
第四步:配置 Docker 走代理
在虚拟机里执行(IP 和端口换成你实际的):
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf << 'EOF'
[Service]
Environment="HTTP_PROXY=http://192.168.220.1:7897"
Environment="HTTPS_PROXY=http://192.168.220.1:7897"
Environment="NO_PROXY=localhost,127.0.0.1"
EOF
systemctl daemon-reload
systemctl restart docker
第五步:拉取镜像
docker pull redis
成功后即可正常使用。
常见报错对照
| 报错信息 | 原因 | 解决 |
|---|---|---|
i/o timeout | 直连 Docker Hub 网络不通 | 配置代理或镜像源 |
connection refused | 代理 IP 填错(填了 .2 VMware NAT 网关) | 改成 .1 Windows 主机 IP |
connection refused | Windows 防火墙拦截 | 加防火墙规则 profile=any |
| 镜像源配置了但没生效 | 南大/阿里云等镜像源已基本不可用 | 改用代理方案 |
以后换机器的注意事项
- 每次 VMware 虚拟机的子网可能不同,先用
ip route | grep default查网关,把最后一位改成.1就是 Windows 主机 IP - 代理端口以 Clash 实际设置为准,不一定是 7897
- 防火墙规则重装系统后需要重新添加