‘docker-compose down’ 刪除 ip 路由
在兩台不同的機器(桌面和伺服器)上,同一個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://github.com/coreos/coreos-overlay/tree/master/app-emulation/docker/files
- 50-docker.network
- 90-docker-veth.network