V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
AllenHua
V2EX  ›  Linux

[问题已解决|后续] docker 容器能 PING 通 IP 但 PING 不通域名问题的排查经历分享

  •  1
     
  •   AllenHua · 2021-04-13 21:27:45 +08:00 · 1906 次点击
    这是一个创建于 1347 天前的主题,其中的信息可能已经有所发展或是发生改变。

    编辑好了…… v 站不让我发,就分享这个链接了,写在了博文中

    前情提要: https://www.v2ex.com/t/769968

    [已解决] 记一次 docker 容器内能 ping 通 ip 但 ping 不通域名问题的排查经过 https://hellodk.cn/post/496

    12 条回复    2021-04-15 00:29:06 +08:00
    vivisidea
        1
    vivisidea  
       2021-04-13 22:47:57 +08:00
    还没看,盲猜 daemon.json 配置了 iptables: false
    vivisidea
        2
    vivisidea  
       2021-04-13 22:52:38 +08:00
    比我想象的复杂一点,之前碰到过配置了 iptables: false 现象跟你这个一样,手动加防火墙规则就行了

    理论上说配置了 iptables: true,docker 会自动加防火墙规则的
    Sasasu
        3
    Sasasu  
       2021-04-13 22:59:31 +08:00
    TL;DR

    1. 没有配置 udp 转发
    2. 自建 dns 没有接受来自 docker 网卡的查询
    CallMeReznov
        4
    CallMeReznov  
       2021-04-13 22:59:49 +08:00
    这个之前再机房得时候遇到过一次,外包开发部署得系统和 docker.
    他们说网络异常,然后就装死不解决了,没办法我亲自上去排查.
    当时直接先查路由还有 ping 发现全打到本地上了,于是怀疑是不是路由表或者虚拟 IP 导致得,ip addr 一下果然是 docker 得默认 bridge 与实际网卡地址段冲突了.告诉开发让他们修改 docker0 得默认地址段重启就解决了.

    还有就是 wsl 每次重启也会随机分配 IP,偶尔也会分配到 172.1X 2X 3X 得地址段上,也是个坑,得注意.
    AllenHua
        5
    AllenHua  
    OP
       2021-04-13 23:05:34 +08:00
    @vivisidea #2 是的 但我一开始实在是不知道这个固件的 docker 配置 以及 dockerd 的启动脚本就有问题 ( /etc/config/docker 和 /etc/init.d/dockerd )
    配置了 iptables true docker 会在防火墙上添加对应规则


    @Sasasu #3 是的总结的很好 问题就两个 一个 iptables 一个自建 dns 没有监听来自 docker 网卡的查询请求


    @CallMeReznov #4 所以能自定义 cidr 的 subnet ip-range gateway 这些的 可以自定义 免得冲突
    zhangsanfeng2012
        6
    zhangsanfeng2012  
       2021-04-14 09:40:28 +08:00
    跟我想的一样
    但是按理说,你把 openwrt 的 53 端口重定向关掉,也应该会通啊
    AllenHua
        7
    AllenHua  
    OP
       2021-04-14 14:32:05 +08:00
    @zhangsanfeng2012 #6 当时删掉了哪两条 iptables 规则不太记得了

    总之交给谁查询 中间环节还是要重点关注了 (经验+1 😹️)

    刷好固件一开始我并没有配置 dnsmasq 的时候 ping 域名没问题,这个时候就应该想到应该是 dnsmasq 这个中间环节没有打通
    naruco
        8
    naruco  
       2021-04-14 14:51:42 +08:00
    @AllenHua subnet 的 ip-range 是怎么做到自定义的,能否分享一下?谢谢
    AllenHua
        9
    AllenHua  
    OP
       2021-04-14 15:31:06 +08:00
    @naruco #8

    ```
    $ docker network create \
    --driver=bridge \
    --subnet=172.28.0.0/16 \
    --ip-range=172.28.5.0/24 \
    --gateway=172.28.5.254 \
    mynetwork
    ```

    来自 https://docs.docker.com/engine/reference/commandline/network_create/#specify-advanced-options

    --driver 指定使用的驱动 有四种可选项 Driver to manage the Network (default "bridge")
    --subnet 子网的规划,使用 cidr 格式,上面网络 172.28.0.0,掩码 16 。官方解释是 Subnet in CIDR format that represents a network segment
    --ip-range 这个网络划分范围要比上面的子网要小,然后分配的容器使用这些 ip 地址。官方这个参数解释是 Allocate container ip from a sub-range
    --gateway 指定该网络的网关地址 IPv4 or IPv6 Gateway for the master subnet

    上面的 --ip-range 定义了 172.28.5.0/24 这个网络给使用这个 network 的容器使用,这些容器的 ip 分配将从 172.28.5.1/24 开始,最多分配到 172.28.5.253/24,所以用户创建的这个 user-defined network 最多能分配给 253 个 docker 容器。172.28.5.0 是这个网络,网关是 172.28.5.254 ,172.28.5.255 是广播地址
    AllenHua
        10
    AllenHua  
    OP
       2021-04-14 15:52:32 +08:00
    @naruco #8 我刚测试了一下 发现 docker 中的容器 使用自定义 bridge 网络,第一个容器的 ip 地址是从 0 开始的(不是从 1 ),也就是说给第一个使用这个 network 的容器分配的 ip 是 172.28.5.0,网关是 172.28.5.254 ,掩码是 16 位。不过一般情况下 .0 代表本网络,.255 代表广播地址

    docker 自己实现的 bridge 网络中,容器中的接口和在宿主机上生成的虚拟网络接口 广播地址都是 0.0.0.0,zero network,代表本机上的所有 ipv4 地址
    naruco
        11
    naruco  
       2021-04-14 17:00:29 +08:00
    @AllenHua
    最近也在摸索这些,环境 win10, hyper-v, wsl 2, docker-desktop
    正好在 B 站看了一集视频讲到 docker network,和你这一结合,印象深刻!非常感谢
    AllenHua
        12
    AllenHua  
    OP
       2021-04-15 00:29:06 +08:00 via iPhone
    @naruco #11 客气了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1865 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:15 · PVG 00:15 · LAX 08:15 · JFK 11:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.