【问题标题】:Docker containers with bridge network cannot ping anything (even default gateway)具有桥接网络的 Docker 容器无法 ping 任何东西(即使是默认网关)
【发布时间】:2021-06-07 20:09:24
【问题描述】:

我无法使用桥接网络从容器 ping 任何东西(例如:docker run --network bridge --rm -it bash ping 8.8.8.8)。甚至不是容器的默认网关。

ip route 来自容器内部:

bash-5.1# ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 scope link  src 172.17.0.2

ip link 来自我的机器:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether 6c:02:e0:77:5a:c1 brd ff:ff:ff:ff:ff:ff
    altname enp16s0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000
    link/ether a4:97:b1:86:f9:6b brd ff:ff:ff:ff:ff:ff
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:bd:d0:fb:cc brd ff:ff:ff:ff:ff:ff
6: veth40b832a@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
    link/ether ba:e5:3a:88:e4:67 brd ff:ff:ff:ff:ff:ff link-netnsid 0

即使容器正在运行,docker0 接口也会保持关闭状态。

brctl 表明容器接口没有桥接到docker0

bridge name bridge id       STP enabled interfaces
docker0     8000.0242bdd0fbcc   no

这是iptables -S -t nat的输出:

-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN

到目前为止,我已经尝试重新安装 docker 并在 iptablesnftablesiptables-nft 之间切换。当我尝试运行k3d 示例集群时,整个问题就开始了。我正在使用官方包在 Arch 上运行所有内容。

【问题讨论】:

  • 一般 IPTABLES 支持是题外话。支持问题可通过superuser.com 提出。

标签: docker networking iptables archlinux


【解决方案1】:

检查
猫 /etc/sysctl.conf
如果你有
net.ipv4.ip_forward=1

【讨论】:

  • 我没有那个文件。检查 sysctl net.ipv4.ip_forward 并将其设置为 1:net.ipv4.ip_forward = 1
  • 从链接中尝试了一些东西。分配给docker0 的 IP 是172.17.0.1。我可以从我的机器中 ping 它,但不能从容器内 ping 它,即使它是它们的默认网关。我还尝试添加iptables 规则iptables -A INPUT -i docker0 -j ACCEPT。还是一样的情况
【解决方案2】:

我终于明白了

NetworkManager 和 systemd-networkd 都在我的系统上运行,它通过多个 DHCP 服务与接口 IP 混淆。这导致桥接网络无法正常工作,进而扰乱了容器流量。

专业提示:不要运行多个守护进程来尝试做同样的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2022-01-26
    • 2017-09-30
    • 1970-01-01
    • 2020-07-28
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多