飞牛自带的ovs-docker命令,可以将容器桥接到ovs网络,这就意味这个容器就可以向虚拟机一样使用局域网ip地址。但是ovs-docker命令是即时的,也就是容器重启之后桥接就失效了,所以就使用systemd服务来实时监控指定容器的start事件,一旦指定容器启动就立马触发ovs-docker命令去创建桥接。
虽然前面分享让容器获取独立物理ip地址,也能是容器获取到与宿主机同网段的ip地址,但是不能与宿主机通信,这就很难受。
正文开始,具体步骤如下:
- 首先在飞牛的 系统设置--->网络设置---->网卡接口上启用ovs 系统会自动创建一个OVS虚拟交换机桥接名称,即enp1s0-ovs。

- 在ssh端执行命令:sudo nano /etc/systemd/system/container-bridge-ovs.service, 以创建“container-bridge-ovs.service”文件,并输入下面的内容:
[Unit]
Description=监听指定容器启动事件并配置 OVS 网络
Requires=docker.service openvswitch-switch.service
After=docker.service openvswitch-switch.service
[Service]
Environment="CONTAINER_NAME=NETTEST"
Environment="OVS_BRIDGE=enp1s0-ovs"
Environment="IP_ADDR=192.168.10.161/24"
Environment="GATEWAY=192.168.10.1"
Environment="MAC_ADDR=C6:08:39:C2:AC:D9"
Type=simple
# 等待 Docker 启动,最长 15 分钟(450 次循环,每次 2 秒)
ExecStart=/bin/bash -c ' \
max_attempts=450; \
attempt=1; \
# 循环等待 Docker 就绪,最多 15 分钟 \
while ! docker info >/dev/null 2>&1; do \
if [ $attempt -ge $max_attempts ]; then \
echo "等待 Docker 启动超时(已超过 15 分钟),退出"; \
exit 1; \
fi; \
echo "Docker 未就绪,等待 2 秒后重试($attempt/$max_attempts)..."; \
attempt=$((attempt + 1)); \
sleep 2; \
done; \
echo "Docker 已就绪"; \
# 检查 OVS 服务 \
if ! systemctl is-active --quiet openvswitch-switch.service; then \
echo "OVS 服务未运行,退出"; \
exit 1; \
fi; \
echo "OVS 服务已就绪,开始监听容器事件..."; \
# 核心逻辑 \
docker events --filter "event=start" --filter "container=${CONTAINER_NAME}" | while read -r event; do \
echo "检测到容器 ${CONTAINER_NAME} 启动,重新配置 OVS 网络..."; \
ovs-docker del-port ${OVS_BRIDGE} eth0 ${CONTAINER_NAME} 2>/dev/null; \
ovs-docker add-port ${OVS_BRIDGE} eth0 ${CONTAINER_NAME} \
--ipaddress=${IP_ADDR} \
--gateway=${GATEWAY} \
--macaddress=${MAC_ADDR}; \
echo "OVS 网络配置完成,MAC 已设置为 ${MAC_ADDR}"; \
done'
Restart=always
User=root
[Install]
WantedBy=multi-user.target
你可以根据自己的情况更改ip和mac地址,容器名字。需要修改的部分如下:
[Service]
Environment="CONTAINER_NAME=NETTEST" #第二个”=“号后面的字符,比如这里容器名就是:NETTEST,即一旦启动就给这个容器分配ovs桥接ip地址。
Environment="OVS_BRIDGE=enp1s0-ovs" #enp1s0-ovs就是ovs创建的桥,这里不用动,是我们开启ovs网络时默认创建的。
Environment="IP_ADDR=192.168.10.161/24" #我分配的时10网段的161地址,你可以改成自己的
Environment="GATEWAY=192.168.10.1" #这是网段,改成自己的网段,与上面的ip地址保持一致
Environment="MAC_ADDR=C6:08:39:C2:AC:D9" #这是要分配给容器的mac地址,自己设置一个,不是顺便写,是有格式要求的。
填写完成之后:ctl+x 按键,再按y键,再按回车进行保存退出。
- 激活container-bridge-ovs.service服务:
#重新加载 systemd:
sudo systemctl daemon-reload
#注册开机启动 且 立即启动服务:
sudo systemctl enable --now container-bridge-ovs.service
- 其他命令,留着备用:
#查看服务状态
sudo systemctl status container-bridge-ovs.service
#查看实时日志 -u 指定查看某个服务的日志 -f 表示 “跟随模式”,实时输出新日志
sudo journalctl -u container-bridge-ovs.service -f
#查看历史日志
sudo journalctl -u container-bridge-ovs.service.service
#查看今天的日志
sudo journalctl -u container-bridge-ovs.service --since today
#查看最近一小时的日志
sudo journalctl -u container-bridge-ovs.service --since "1 hour ago"
#如果修改了 .service 文件,需要重启服务
sudo systemctl daemon-reload
sudo systemctl restart container-bridge-ovs.service
#启动服务
sudo systemctl start container-bridge-ovs.service
#停止服务
sudo systemctl stop container-bridge-ovs.service
#禁用服务,禁用之后,服务就不会自动启动了
sudo systemctl disable container-bridge-ovs.service
#查看ovs-docker桥接的端口:
sudo ovs-vsctl show
#删除ovs桥接的僵尸端口
sudo ovs-vsctl del-port enp1s0-ovs 端口名
如果sudo ovs-vsctl show名称查出来不带引号,端口名就要不带引号。如果带引号就要也带上。
注意注意:你如果打算使用ovs桥接到容器,这个容器的network_mode的值最好是none。否则可能带来网络混乱。