如果你在 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)

如果你只想最快恢复可用,按这个顺序:

  1. 固定 WSL DNS(wsl.conf + resolv.conf)。
  2. wsl --shutdown 后重测 docker pull
  3. 仍失败再加 Docker daemon dns + registry-mirrors

这三步通常就能把 WSL2 Docker 网络异常 拉回可用状态,而且不会引入太多副作用。

延伸阅读建议

  • WSL2 磁盘清理与性能优化(可减少 Docker 构建抖动)
  • Docker 构建缓存策略(加速 CI/CD)
  • 企业代理下的 Docker/apt/git 统一代理配置