限制Docker Compose默认桥接网络,避免与物理VLAN网段冲突
我的机器连接到物理网络192.168.0.0/24,该网络包含物联网VLAN 107(网段192.168.107.0/24)。操作部分Docker容器后,主机突然无法访问VLAN 107。经排查,docker-compose创建的桥接网段为192.168.96.0/20,该网段包含192.168.107.0/24,导致ip route get 192.168.107.100流量导向桥接设备。执行docker-compose down和docker-compose up后,桥接网络恢复为172.22.0.0/16,访问恢复正常。
- Docker为何会创建192.168段桥接网络?主机曾创建过超255个桥接网络,但当前数量远低于此。
- 如何配置Docker,使其尝试创建192.168.*网段桥接网络时直接失败,拒绝创建该网络及相关容器?
1. Docker创建192.168段桥接网络的原因
Docker默认内置了多组私有网段池,除了常见的172.17.0.0/16到172.31.0.0/16这些172段网段,还包含192.168.0.0/20、192.168.16.0/20等多个192.168段的网段。
Docker分配网段时会优先从172段的网段池选未使用的网段,但你之前创建过超255个桥接网络,哪怕现在大部分已删除,Docker的网段分配机制会标记曾经使用过的网段(避免重复分配冲突),当可用的172段网段耗尽后,就会自动切换到192.168段的网段池进行分配,这就是出现192.168.96.0/20网段的原因。
2. 禁止Docker使用192.168.*网段的配置方法
通过修改Docker的daemon配置文件,自定义允许使用的网段池,完全排除192.168段即可:
- 编辑(或创建)Docker配置文件:
sudo nano /etc/docker/daemon.json - 添加以下配置内容,指定仅使用你允许的172段私有网段(可根据需求调整具体网段范围):
{ "default-address-pools": [ {"base": "172.17.0.0/16", "size": 24}, {"base": "172.18.0.0/16", "size": 24}, {"base": "172.19.0.0/16", "size": 24}, {"base": "172.20.0.0/16", "size": 24}, {"base": "172.21.0.0/16", "size": 24}, {"base": "172.22.0.0/16", "size": 24} ] } - 保存文件后重启Docker服务:
sudo systemctl restart docker
配置完成后,Docker只会从你指定的172段网段池中分配桥接网络,不会再使用192.168段。如果有容器或compose配置尝试指定192.168段的网络,Docker会直接报错并拒绝创建。
内容的提问来源于stack exchange,提问作者lutzky

