在WSL中用sudo dockerd --iptables=false启动Docker时解决getaddrinfo EAI_AGAIN错误
问题原因
你启动Docker时使用了--iptables=false参数,这会直接禁用Docker对iptables规则的自动管理。Docker默认依赖iptables配置NAT(网络地址转换)规则,实现容器网络与外部互联网的路由。禁用后,容器发出的网络数据包无法正确通过WSL的网络栈转发到外部,同时DNS解析请求也无法正常处理,最终导致npm install时出现getaddrinfo EAI_AGAIN的DNS解析失败错误。
解决方法
1. 移除--iptables=false参数(推荐)
Docker的iptables自动管理是默认且稳定的网络配置方式,直接禁用会破坏容器网络的正常路由:
- 直接用默认命令启动Docker:
sudo dockerd - 如果是通过配置文件永久禁用了iptables,编辑
/etc/docker/daemon.json,删除或注释掉"iptables": false这一行,然后重启Docker服务:sudo systemctl restart docker # 若WSL未启用systemd,使用: sudo service docker restart
2. 手动配置网络规则(若必须禁用Docker的iptables管理)
如果因为特定需求必须保留--iptables=false,需要手动补全网络路由规则:
- 确认Docker默认网桥
docker0的子网地址(通常为172.17.0.0/16),执行命令查看:ip addr show docker0 - 添加NAT转发规则,让容器子网的流量能被正确转发到外部:
sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j MASQUERADE - 开启内核IP转发功能,确保数据包能跨网络转发:
若要永久生效,编辑sudo sysctl -w net.ipv4.ip_forward=1/etc/sysctl.conf,添加net.ipv4.ip_forward=1后保存。
3. 排查并修复DNS解析问题
如果WSL本身网络正常,但容器DNS解析失败,可以手动指定容器的DNS服务器:
- 在
docker-compose.yml的frontend服务中添加DNS配置,比如使用公共DNS:services: frontend: # ... 原有配置 ... dns: - 8.8.8.8 - 1.1.1.1 - 先验证WSL主机的网络连通性,执行
ping registry.npmjs.org,如果主机也无法解析,重启WSL解决基础网络问题:wsl --shutdown
4. 验证容器网络
修复配置后,重新构建容器并测试网络:
sudo docker compose up --build # 或者进入已启动的容器测试网络 sudo docker exec -it frontend ping registry.npmjs.org
内容的提问来源于stack exchange,提问作者Rida Elmaaroufi
相关产品推荐
相关产品推荐

