如果你在 WSL2 + Docker 环境里遇到 docker pull 超时、Temporary failure in name resolution、容器能启动但不能联网,先别重装系统。绝大多数问题都能在 15 分钟内定位并修好。
这篇给你一套可复制的排查顺序:先确认是 DNS、代理、虚拟网卡还是 Docker daemon 配置,再按最小改动恢复网络。
一、先判定故障层级(别上来就乱改)
先在 WSL 里跑下面三组命令:
# 1) 宿主网络是否正常(WSL 内)
ping -c 2 1.1.1.1
curl -I https://registry-1.docker.io
# 2) DNS 是否异常
cat /etc/resolv.conf
nslookup registry-1.docker.io
# 3) Docker daemon 与容器网络是否异常
docker info | sed -n '1,80p'
docker run --rm alpine sh -c "ping -c 2 1.1.1.1 && nslookup google.com"
快速判断:
ping 1.1.1.1通,但域名不通:DNS 问题。- WSL 能联网,容器不能联网:Docker 网络或 daemon 配置问题。
- 全都不通:优先查 Windows 侧代理/VPN/防火墙。
二、WSL2 DNS 修复(最常见)
WSL2 常见问题是 /etc/resolv.conf 被自动生成成不可用 DNS。建议先切到固定 DNS 验证:
sudo tee /etc/wsl.conf >/dev/null <<'CONF'
[network]
generateResolvConf = false
CONF
sudo rm -f /etc/resolv.conf
printf "nameserver 1.1.1.1\nnameserver 8.8.8.8\n" | sudo tee /etc/resolv.conf >/dev/null
然后在 Windows PowerShell 重启 WSL:
wsl --shutdown
重新进入发行版后再测:
nslookup registry-1.docker.io
docker pull alpine:latest
三、Docker daemon 镜像源与 DNS 兜底
如果 DNS 已恢复,但拉镜像依旧慢或超时,补一层 Docker daemon 配置:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json >/dev/null <<'JSON'
{
"dns": ["1.1.1.1", "8.8.8.8"],
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
JSON
sudo service docker restart || sudo systemctl restart docker
如果你用的是 Docker Desktop + WSL 集成,也可以在 Docker Desktop 设置里配置 DNS / 镜像加速,避免双端配置冲突。
四、常见错误与对应处理
1) Temporary failure in name resolution
- 结论:DNS 配置失效。
- 处理:按“第二步”固定
resolv.conf,再wsl --shutdown。
2) net/http: request canceled while waiting for connection
- 结论:网络出口被代理/VPN/防火墙拦截或路由异常。
- 处理:先关全局代理/VPN 复测;再检查公司网络策略。
3) WSL 能上网,容器不能
- 结论:Docker bridge/NAT 规则异常。
- 处理:重启 Docker 服务,必要时重建网络:
docker network prune -f
docker network ls
docker run --rm alpine ping -c 2 8.8.8.8
五、最小可行恢复方案(MVP)
如果你只想最快恢复可用,按这个顺序:
- 固定 WSL DNS(
wsl.conf + resolv.conf)。 wsl --shutdown后重测docker pull。- 仍失败再加 Docker daemon
dns + registry-mirrors。
这三步通常就能把 WSL2 Docker 网络异常 拉回可用状态,而且不会引入太多副作用。
延伸阅读建议
- WSL2 磁盘清理与性能优化(可减少 Docker 构建抖动)
- Docker 构建缓存策略(加速 CI/CD)
- 企业代理下的 Docker/apt/git 统一代理配置