Docker基于bond0绑定接口配置桥接网络的问题咨询
Docker基于bond0绑定接口配置桥接网络的问题咨询
看起来你已经搞定了bond0的基础创建,但换成bond0当父接口后容器就没网了,换成单NIC又正常,确实挺挠头的。我来针对你的问题一步步捋:
先看你核心的三个疑问:
1. 用bond0作为父接口时,Docker有没有特殊配置要求?
有几个容易忽略的关键细节:
- 确保bond0真的处于激活状态:你用
nmcli conn add创建了bond0的连接,但别忘了执行nmcli conn up cmynode把它启动起来!可以用ip link show bond0检查状态,开头显示UP才是正常的。 - bonding模式要适配网络环境:如果用的是
active-backup(最常用的主备容错模式),Docker完全支持;但要是用802.3ad(LACP)这种模式,必须确保交换机端也配置了对应的LACP组,不然bond0本身就会工作异常,容器自然没网。 - 主机转发必须开启:执行
sysctl net.ipv4.ip_forward,如果返回0,赶紧用sysctl -w net.ipv4.ip_forward=1临时开启,再把net.ipv4.ip_forward=1写入/etc/sysctl.conf永久生效——这是容器跨网络通信的基础前提。
2. 有没有更好的方式让容器继承主机bond的容错性?
推荐两种更直接的方案,容错切换对容器完全透明:
- Macvlan网络(首推):直接在bond0上创建macvlan网络,容器会拿到和bond0同网段的独立IP,流量直接走bond0,完全继承bond的容错特性。创建命令改成这样试试:
这种方式没有bridge的额外转发开销,bond主备切换时容器完全感知不到,容错最彻底。docker network create -d macvlan \ --subnet=10.11.11.0/24 \ --gateway=10.11.11.8 \ -o parent=bond0 \ bondmacvlan - 简化桥接配置:如果非要用bridge网络,建议给bond0只留一个管理IP,然后让Docker自定义桥直接挂在bond0下,避免bond0的IP和容器IP范围冲突(你当前的配置里IP范围是分开的,这步没问题,但桥接时要确保bond0允许桥接)。
3. nmcli或Docker网络创建有没有遗漏步骤?
你可能漏了这几个关键检查:
- nmcli配置要收尾:除了创建bond0的连接,必须确认它的slave接口都已加入并激活!执行
nmcli conn show --active,看看bond的各个子NIC(比如enp0s8)是不是在活跃列表里。如果没激活,得用nmcli conn up <slave-conn-name>把它们启动。 - Docker bridge的parent参数注意事项:你给bridge网络加
-o parent=bond0是想让桥绑定到bond0,但Docker的bridge网络的parent选项对物理接口的桥接有要求。可以临时关闭桥接的iptables调用试试:sysctl -w net.bridge.bridge-nf-call-iptables=0,要是这样容器能通了,就把这个参数写到/etc/sysctl.conf里永久生效。 - 排查容器内的网络链路:启动容器后,进去跑几个ping看看卡在哪:
docker exec -it flask ping 10.11.11.8(网关)、ping 10.11.11.241(主机bond0的IP),如果连主机都ping不通,大概率是bond0到桥的转发有问题;如果能ping主机但ping不通网关,那就是bond0本身的路由或交换机配置的问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

