使用網橋時 Docker 網路超時
我正在使用 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