在两台不同的机器(桌面和服务器)上,同一个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 管理的接口。
你可以在这里找到一个例子: