【问题标题】:Networking not working on Docker / Centos 7.9网络在 Docker / Centos 7.9 上不起作用
【发布时间】:2020-11-21 23:35:56
【问题描述】:

我在 Centos 7.9.2009 上运行 Docker,遇到了一个非常奇怪的问题。容器没有网络访问权限,无法从主机访问。我已经搜索了潜在的解决方案,其中很多似乎与 DNS 问题有关(我认为这不是这里发生的事情,因为即使从容器内 ping 8.8.8.8 也不起作用)。我试过安装 iptables-service,按顺序重启 iptables 和 docker,完全重启等。

在尝试找出问题所在的过程中,我在一个单独的终端中运行了 tcpdump。一旦我这样做,一切正常!终止 tcpdump 进程,一切都停止 - 无法访问网络。关于为什么运行 tcpdump 可以解决问题的任何建议?与tcpdump监听docker0并建立网络状态有关吗?

启动时tcpdump的输出:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on docker0, link-type EN10MB (Ethernet), capture size 262144 bytes

uname -a 的输出:

Linux 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

/etc/redhat-release 的输出:

CentOS Linux release 7.9.2009 (Core)

ip地址的输出:

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:8b:94:46:19 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
   valid_lft forever preferred_lft forever
inet6 fe80::42:8bff:fe94:4619/64 scope link
   valid_lft forever preferred_lft forever

iptables 的输出 --list -t nat:

  Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  anywhere            !loopback/8           ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        anywhere

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

docker 版本的输出:

    Client: Docker Engine - Community
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:03:45 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:02:21 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

提前致谢!

【问题讨论】:

    标签: docker networking


    【解决方案1】:

    tcpdump 开始监听一个接口时,它会将那个接口放入promiscuous mode
    这就是您的容器网络开始工作的直接原因。

    通常docker0 不需要混杂模式即可工作。
    您描述的行为表明您的网络堆栈存在问题。

    首先,您的 Linux 内核已经很老了。
    版本 3.10.0-327 是 Redhat 的 released in year 2015
    检查this issue - 看起来完全一样的问题。
    作者设法通过内核升级和br_netfilter 模块修复解决了这个问题。

    在其他一些情况下(onetwo),只需删除接口并重启 Docker 即可。
    但我认为你仍然需要升级内核——它太旧了,真的。

    【讨论】:

    • 谢谢奥莱西亚。我已经升级到 3.10.0-1160.6.1,它似乎已经解决了这个问题。感谢您的解释和帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2022-11-18
    • 2017-08-31
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多