【问题标题】:Network setting in docker host and container using user defined bridge network, where ping fails from host to container使用用户定义的桥接网络在 docker 主机和容器中进行网络设置,其中从主机到容器的 ping 失败
【发布时间】:2021-02-01 07:01:16
【问题描述】:

我必须使用 ip 192.168.31.11 创建容器。因此,我使用了用户定义的桥接网络并将 mynet 创建为:

docker network create \
                --driver=bridge \
                --subnet=192.168.31.0/24 \
                --ip-range=192.168.31.0/24 \
                --gateway=192.168.31.1 \
                mynet

现在,使用命令

docker run --network mynet --name ca1 --ip 192.168.31.11 -itd -p 8002:80 -v $PWD:/build sc5

我已经创建了容器。 docker 主机现在有下面的 ifconfig:

br-426eea85deb3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500  metric 1
        inet 192.168.31.1  netmask 255.255.255.0  **broadcast 192.168.31.255**
        inet6 fe80::42:cfff:fe3e:d01b  prefixlen 64  scopeid 0x20<link>
        ether 02:42:cf:3e:d0:1b  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7  bytes 586 (586.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500  metric 1
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:58:0e:02:97  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500  metric 1
        inet 192.168.31.101  netmask 255.255.255.0  **broadcast 192.168.31.255**
        inet6 fe80::202:6bff:fe21:463c  prefixlen 64  scopeid 0x20<link>
        ether 00:02:6b:21:46:3c  txqueuelen 1000  (Ethernet)
        RX packets 16  bytes 1440 (1.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 65  bytes 3216 (3.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xdf000000-df01ffff

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536  metric 1
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 509  bytes 37544 (36.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 509  bytes 37544 (36.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethda02539: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500  metric 1
        inet6 fe80::f072:a4ff:fe51:18bb  prefixlen 64  scopeid 0x20<link>
        ether f2:72:a4:51:18:bb  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 14  bytes 1172 (1.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

但是,当我从主机到容器对容器执行 ping 操作时,ping 失败!!。

但是当我使用 /etc/sysconfig/network 更改 docker 主机网络设置时,主机 ip 从 192.168.31.101192.168.11.101时间>。主机到容器的 ping 成功!!

我无法理解在第一种情况下阻止 ping 成功的原因是什么!?

我已经在 ubuntu 机器上尝试了相同的方法,方法是使用与主机和容器 br-xxxx 广播相同的广播 xx.xx.xx.xx 创建 mynet。在这台 Ubuntu 机器上 ping 成功了!!

ubuntu 案例详情如下:

ifconfig:

br-7b1ed572fe95: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.2  netmask 255.255.255.0  **broadcast 10.0.2.255**
        inet6 fe80::42:bff:fe9d:d6eb  prefixlen 64  scopeid 0x20<link>
        ether 02:42:0b:9d:d6:eb  txqueuelen 0  (Ethernet)
        RX packets 97  bytes 12767 (12.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 61  bytes 6739 (6.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:11:f0:da:29  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  **broadcast 10.0.2.255**
        inet6 fe80::365a:ddd:b83c:4abe  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:82:79:c2  txqueuelen 1000  (Ethernet)
        RX packets 14188  bytes 15705468 (15.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3415  bytes 264989 (264.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1727  bytes 141367 (141.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1727  bytes 141367 (141.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth11ef32e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::b014:feff:feaa:cea3  prefixlen 64  scopeid 0x20<link>
        ether b2:14:fe:aa:ce:a3  txqueuelen 0  (Ethernet)
        RX packets 97  bytes 14125 (14.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 87  bytes 9899 (9.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我很困惑,不知道为什么在 192.xx.xx.xx 情况下 ping 失败,而在 Windows VM 上的 Ubuntu 情况下成功?

我是不是缺少 docker host 的一些东西?

任何帮助或指导将不胜感激。请让我知道是否需要更多信息或细节来进一步理解相同的建议。 谢谢,

【问题讨论】:

  • 您说您已经在 ubuntu 机器上尝试过相同的操作。什么机器遇到问题?你在虚拟机中运行 docker 吗?例如,这是在 mac 还是 windows 机器上?
  • @SoftwareEngineer,感谢您的回复。在第一种情况下,我使用运行 Linux 的 x86 英特尔芯片在嵌入式产品上运行(使用 Timesys)。是的,这是我在后来的 ubuntu 案例中尝试使用 Ubuntu 的带有 VM 的 Windows 机器。
  • 您通常不需要手动设置容器 IP 地址,或向容器发送 ICMP 数据包。 (对于非 Docker 进程,您不会做任何这些事情。)在大多数情况下,您应该完全忽略容器私有 IP 地址,因为它们只在同一主机上工作,然后当该主机是本机 Linux 时.您想通过此设置实现更高级别的目标吗?
  • @DavidMaze,是的,大卫。我只需要具有该特定私有 IP 的容器。不能使用 172.x.x.x 范围分配的默认 ip。简而言之,我将使用这个 192.168.31.11 来启动 html 页面并进一步进行用户交互以接收输入并使用卷存储它们。 ip 根据要求具有相互依赖关系。

标签: docker networking containers docker-networking docker-network


【解决方案1】:

我已彻底检查,VM 已使用相同的目标地址以及 enpxsx 和 br-xxx 管理路由。 但是在我的硬件上,当路由中的目标地址相同时,路由会发生冲突。

路由命令详情:

$route -vn
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.31.31        0.0.0.0         UG    100    0        0 enp0s3
192.168.31.0        0.0.0.0         255.255.255.0   U     0      0        0 br-7b1ed572fe95
192.168.31.0        0.0.0.0         255.255.255.0   U     100    0        0 enp0s3
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp0s3
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

所以,enp0s3 和 br-xxxx 也有 192.168.31.0 目的地。哪个阻塞路由!!为了验证这一点,我使用 192.168.11.x 设置创建了另一个用户定义的桥接网络,它按预期工作。 因此,主机和容器正在尝试使用 Iface ethX 和 br-xxxx 与目标地址 192.168.31.0 相同的硬件类型 ether。 所以不太可能使这个容器与 ip 192.168.31.11 一起工作。 (或者需要更改主机ip 192.168.11.X

或者我可以做些什么来工作,主机和容器上的相同 192.168.31.x ip 具有 192.168.31.x?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    相关资源
    最近更新 更多