Linux

使用網橋時 Docker 網路超時

  • February 13, 2022

我正在使用 Ubuntu 版本20.04.3 LTS(核心5.4.0-96-generic)和 Docker 的專用伺服器上執行20.10.7, build 20.10.7-0ubuntu5~20.04.2。該系統是全新安裝。

我有一個用於我的服務之一,它使用和Dockerfile拉入一些庫。中間容器之一總是無法連接到 Internet,出現 DNS 或 TCP 超時錯誤。哪個容器失敗是完全隨機的。apt``go get

另請注意,問題不在於某個特定服務,我嘗試建構一個在 NodeJS 上執行的完全不同的服務,但npm install失敗並出現相同的錯誤

今天我也遇到了我的 Nginx 容器無法訪問的問題。與它的所有連接都導致超時錯誤。

使用 docker 網路的容器之間的連接也無法正常工作。

執行sudo systemctl restart docker暫時解決了這個問題,但它會重新出現一兩個建構線。當我使用網路而不是預設橋接網路建構時host,問題就消失了,這就是我懷疑橋接配置錯誤的原因。

我試過重新安裝 Docker,重置 iptables 和橋接配置,設置不同的 DNS 伺服器,但無濟於事。泊塢窗日誌文件顯示沒有錯誤。

這個問題的原因可能是什麼?

更新:

我禁用了 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

最後,經過大量探勘,我發現了問題:

第一個請求終止後,我的docker0網路失去了其 IPv4 地址,因此無法與 Internet 的其餘部分通信。

GitHub上的這個問題評論終於為我解決了這個問題:moby#40217:我systemd-networkd正在管理docker0網路,並且以某種方式觸發了運營商失去檢查,然後導致networkd刪除了IPv4。docker0將和網路標記br-*為非託管最終使一切正常

如果你有這些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

引用自:https://serverfault.com/questions/1091502