使用网桥时 Docker 网络超时

使用网桥时 Docker 网络超时

我在一台专用服务器上运行 Ubuntu 版本20.04.3 LTS(内核5.4.0-96-generic)和 Docker 20.10.7, build 20.10.7-0ubuntu5~20.04.2。系统是全新安装的。

我的一项服务有一个Dockerfile,它使用apt和提取一些库go get。其中一个中间容器始终无法连接到互联网,并出现 DNS 或 TCP 超时错误。哪个容器发生故障完全是随机的。

另请注意,问题不在于某一个特定的服务,我尝试构建一个完全不同的服务,该服务在 NodeJS 上运行,但失败npm install了,并出现了同样的错误

今天我也遇到了无法访问 Nginx 容器的问题。与它的所有连接都导致超时错误。

使用 docker 网络的容器之间的连接也无法正常工作。

运行sudo systemctl restart docker暂时解决了问题,但一两次构建后问题又会再次出现。当我使用网络host而不是默认桥接网络进行构建时,问题就消失了,这就是我怀疑桥接配置有问题的原因。

我尝试重新安装 Docker、重置 iptables 和网桥配置、设置不同的 DNS 服务器,但都无济于事。docker 日志文件未显示任何错误。

造成此问题的原因可能是什么?

更新:

我已禁用 UFW,但没有成功。这是构建超时期间从我的 dmesg 日志中转储的信息,也许这有助于确定原因:

[758001.967161] docker0: port 1(vethd0c7887) entered blocking state
[758001.967165] docker0: port 1(vethd0c7887) entered disabled state
[758001.967281] device vethd0c7887 entered promiscuous mode
[758002.000567] IPv6: ADDRCONF(NETDEV_CHANGE): veth7e3840a: link becomes ready
[758002.000621] IPv6: ADDRCONF(NETDEV_CHANGE): vethd0c7887: link becomes ready
[758002.000644] docker0: port 1(vethd0c7887) entered blocking state
[758002.000646] docker0: port 1(vethd0c7887) entered forwarding state
[758002.268554] docker0: port 1(vethd0c7887) entered disabled state
[758002.269581] eth0: renamed from veth7e3840a
[758002.293056] docker0: port 1(vethd0c7887) entered blocking state
[758002.293063] docker0: port 1(vethd0c7887) entered forwarding state
[758041.497891] docker0: port 1(vethd0c7887) entered disabled state
[758041.497997] veth7e3840a: renamed from eth0
[758041.547558] docker0: port 1(vethd0c7887) entered disabled state
[758041.551998] device vethd0c7887 left promiscuous mode
[758041.552008] docker0: port 1(vethd0c7887) entered disabled state

答案1

如果你有这些dmesg

[15300.615904] neighbour: arp_cache: neighbor table overflow!

尝试这个:

sudo sysctl -w net.ipv4.neigh.default.gc_thresh3=30000
sudo sysctl -w net.ipv4.neigh.default.gc_thresh2=20000
sudo sysctl -w net.ipv4.neigh.default.gc_thresh1=10000

答案2

最后,经过一番挖掘,我发现了这个问题:

第一个请求终止后,我的docker0网络丢失了其 IPv4 地址,因此无法与互联网的其余部分通信。

GitHub 上的这个问题评论最终为我解决了这个问题:莫比#40217:我的systemd-networkd正在管理docker0网络,不知何故触发了载波丢失检查,这导致networkd删除 IPv4。将docker0br-*网络标记为非托管终于使一切正常运行

相关内容