V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zcion
V2EX  ›  程序员

[求助]宿主机无法 ping 通 docker 的 ubuntu 容器

  •  
  •   zcion · 1 天前 · 1040 次点击

    环境

    windows11 wsl2 + docker desktop + ubuntu22.04

    docker 拉取的 ubuntu 镜像是在原有 ubuntu22.04 的基础上自己 apt install 了一些常用工具的镜像。

    问题

    通过 docker 创建 ubuntu 容器 ubuntu_b,以下是其网络配置信息: Imgur

    在宿主机中(wsl2 环境) ping ubuntu_b 的 ip ( 172.17.0.3 )无法 ping 通,但 ping 其网关( 172.17.0.1 )却 ping 的通.

    宿主机( 172.20.166.206 ) ping ubuntu_b 容器: Imgur

    同时用 tcpdump 抓包: Imgur

    宿主机 ping 网关能通: Imgur

    但在 ubuntu_b 中 ping 宿主机能够 ping 通: Imgur

    ubuntu_b 中 ping 另一台 ubuntu 容器 ubuntu_c( 172.17.0.2 )也能够 ping 通,并且两者相互 ping 的通。 Imgur

    尝试

    自己查看了一些信息,也问了 deepseek ,主要还是说防火墙问题,但以上宿主机和 ubuntu 容器的防火墙都是默认接收所有流量的状态(这里贴的是 ubuntu_c 的,ubuntu_b 没有配置 root 权限无法查看,不过不影响问题的发生,ubuntu_c 同样有以上的问题): Imgur

    求大佬解答一下!!!

    13 条回复    2025-04-04 01:33:48 +08:00
    ThreeSidedCoin
        1
    ThreeSidedCoin  
       1 天前
    桥接网络?
    zcion
        2
    zcion  
    OP
       1 天前
    @ThreeSidedCoin 是的,网络模式用的是默认设置
    hwdq0012
        3
    hwdq0012  
       1 天前
    wsl 默认是 nat
    docker 默认也是 nat
    docker 运行在 wsl 中(如果设置了 docker 和 wsl2 集成的话

    host pin 子网 ubuntu ping 不通 是正常的
    子网的 ubuntu ping Host 能 ping 能 ping 通,说明子网路由正确


    wsl -l -v 可以看到一个 docker desktop 的实例, 你是在 docker desktop 里操作的吗
    如果是,我觉得 wsl ping 不通 contianer 是因为 docker 和 wsl 都是 hyper v 的 平级的虚拟网络子网
    zcion
        4
    zcion  
    OP
       1 天前
    @hwdq0012 wsl -l -v 默认用的是 ubuntu22.04 的,并没有用 docker-desktop.
    docker-desktop 里也是设置的 ubuntu22.04 distros (settings->Resources->WSL integration).
    不理解为啥说宿主机 ping 不通容器 ip 是正常,我的理解是,两者都能够 ping 通容器网关(172.17.0.1),那正常来说外部也应该 ping 的通内部
    求解答
    hwdq0012
        5
    hwdq0012  
       1 天前
    @zcion
    你说的 wsl 里 ping 不通 ubuntu 是 在哪个 wsl 里操作的
    你可以在 windows 下用 tracert 172.17.0.3 看看路由是怎么跑的
    zcion
        6
    zcion  
    OP
       1 天前
    @hwdq0012
    在 ubuntu22.04 里操作的,当时安装 wsl2 用的这个
    ![Imgur]( )

    windows 中 tracert 的结果:
    ![Imgur]( )

    附带 wsl2 中 traceroute 的结果:
    ![Imgur]( )

    突然想起来,因为之前的某些缘故重新卸载在安装过 wsl 过,之后它的网关就有两个了,在 windows 中 ipconfig 的结果:
    ![Imgur]( )

    感谢大佬解答
    yinmin
        7
    yinmin  
       1 天前
    docker 28.0 的 iptables 防火墙规则改了,默认不允许 ip forward 到容器里了。

    你试试在 docker host 里加一条防火墙规则:

    iptables -I DOCKER-USER -d 172.17.0.0/24 -j ACCEPT
    yinmin
        8
    yinmin  
       1 天前
    我可能知道原因了,你的 windows 路由有问题。另外:172.30.0.1 不是你的 docker ,是你宽带电信营运商的某台服务器。你完全关闭 docker 和 wsl2 ,或者换一台别的电脑,然后 ping 172.30.0.1 也能 ping 通。
    bingfengfeifei
        9
    bingfengfeifei  
       1 天前
    没用过这种环境,你可以先在 wsl2 环境中 排查下。
    使用 ip route 命令看下路由表发出来,然后 ip neigh 命令看看 arp 是否通了,MAC 获取到没。
    然后看下 cat /proc/sys/net/ipv4/ip_forward 看下 ip 转发开了没
    以及看下 ip link ,docker 用的什么接口
    看下 brctl show 网桥
    laminux29
        10
    laminux29  
       1 天前
    wsl2 + docker desktop ,你这 Debuff 拉满了。VMware Workstation 也有网络问题。

    想要稳定,建议找台大内存的 x99 洋垃圾,安装 PVE 。
    XuHuan1025
        11
    XuHuan1025  
       1 天前
    wsl2 遇到过很多问题 还是 vmwarre 好
    512357301
        12
    512357301  
       1 天前 via Android
    [两者都能够 ping 通容器网关(172.17.0.1),那正常来说外部也应该 ping 的通内部]
    你这很明显有点想当然了,你的容器在 nat 内部,宿主机怎么可能访问到它。。。,除非开启端口转发,否则 nat 网络无解,别说 docker 了,虚拟机也是这样的逻辑啊。
    另外去复习或者学习下网络拓扑的入门知识吧。
    再另外,建议用虚拟机搞 docker 吧,wsl 坑挺多,不如虚拟机。
    siweipancc
        13
    siweipancc  
       1 天前 via iPhone
    ……你要是不懂网络可以换成 mirror 网络模式
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2305 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 02:15 · PVG 10:15 · LAX 19:15 · JFK 22:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.