Iptables

‘docker-compose down’ 刪除 ip 路由

  • February 23, 2020

在兩台不同的機器(桌面和伺服器)上,同一個docker-compose 文件的行為不同……

在一台機器上docker-compose down似乎完全刪除了以下docker-compose up不會重新創建的 ip 路由。

成績單:

給出後systemctl restart docker ip route

default via 192.168.22.1 dev enp3s0 proto dhcp src 192.168.22.30 metric 202 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 172.18.0.0/16 dev br-b32036613f97 proto kernel scope link src 172.18.0.1 linkdown 172.20.0.0/16 dev br-3f0603a1198c proto kernel scope link src 172.20.0.1 linkdown 192.168.22.0/24 dev enp3s0 proto dhcp scope link src 192.168.22.30 metric 202 192.168.22.1 dev enp3s0 proto dhcp scope link src 192.168.22.30 metric 1024

之後docker-compose up

default via 192.168.22.1 dev enp3s0 proto dhcp src 192.168.22.30 metric 202 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 172.18.0.0/16 dev br-b32036613f97 proto kernel scope link src 172.18.0.1 172.20.0.0/16 dev br-3f0603a1198c proto kernel scope link src 172.20.0.1 192.168.22.0/24 dev enp3s0 proto dhcp scope link src 192.168.22.30 metric 202 192.168.22.1 dev enp3s0 proto dhcp scope link src 192.168.22.30 metric 1024

之後compose-compose down伺服器會給出:

default via 192.168.22.1 dev enp3s0 proto dhcp src 192.168.22.30 metric 202 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 192.168.22.0/24 dev enp3s0 proto dhcp scope link src 192.168.22.30 metric 202 192.168.22.1 dev enp3s0 proto dhcp scope link src 192.168.22.30 metric 1024

但是桌面會顯示(如預期的那樣):

default via 192.168.22.1 dev enp3s0 proto dhcp src 192.168.22.30 metric 202 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 172.18.0.0/16 dev br-b32036613f97 proto kernel scope link src 172.18.0.1 linkdown 172.20.0.0/16 dev br-3f0603a1198c proto kernel scope link src 172.20.0.1 linkdown 192.168.22.0/24 dev enp3s0 proto dhcp scope link src 192.168.22.30 metric 202 192.168.22.1 dev enp3s0 proto dhcp scope link src 192.168.22.30 metric 1024

桌面上的後續docker-compose up操作將成功,但在伺服器上不會重新創建路由,並且容器對外界不可見……

只有完全重啟 docker 服務的代價太高,才會將路由帶回伺服器上……

我不知道我做錯了什麼。

兩台機器都執行最新版本的 arch linux。桌面使用 Gnome 並執行 NetworkManager,伺服器是無頭的並執行 systemd-networkd ……這幾乎是我能看到的唯一區別……

兩個版本都執行:

  • Docker 版本 19.03.5-ce,建構 633a0ea838
  • docker-compose 版本 1.25.1,建構未知

我對問題的根源完全錯誤。

我正在使用 systemd-networkd 來管理這台機器的網路,並且我有一個按名稱過濾網路介面的包羅萬象的過濾器,因此即使是 docker bridges 和 veth 也由 networkd 管理。

這當然是錯誤的。

這也導致需要在每次啟動後手動重新啟動 docker。

為了解決這個問題,我將 systemd-networkd 配置為忽略 docker 管理的介面。

你可以在這裡找到一個例子:

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