在两台不同的机器(一台台式机和一台服务器)上,相同的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,构建未知
答案1
我对这个问题的根源的认识是完全错误的。
我正在使用 systemd-networkd 来管理这台机器的网络,并且我有一个按名称捕获所有网络接口的过滤器,以便 docker 桥和 veth 都可以由 networkd 管理。
这当然是错误的。
这也导致每次启动后都需要手动重新启动docker。
为了解决这个问题,我配置了 systemd-networkd 来忽略 docker 管理的接口。
您可以在此处找到一个示例:
- https://github.com/coreos/coreos-overlay/tree/master/app-emulation/docker/files
- 50-docker.network
- 90-docker-veth.网络