You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:07:05