You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在ONOS SDN中使用运行的Docker容器构建虚拟网络?

基于ONOS SDN连接Docker容器到Mininet虚拟交换机的实现方案

针对你用ONOS+Mininet搭建包含Docker容器的虚拟网络需求,先修正你代码里的几个关键问题,再给出完整的可运行实现方案:

原代码存在的核心问题

  • 控制器添加时机错误:原代码在net.start()后才添加控制器,此时交换机已启动但未关联控制器,ONOS无法接管这些OVS交换机。
  • Postgres容器缺少必要配置:postgres官方镜像启动必须指定POSTGRES_USER和POSTGRES_PASSWORD环境变量,否则容器会直接退出,无法加入网络。
  • 类导入缺失:未明确导入RemoteController,会导致控制器初始化报错。

修正后的完整代码

from mininet.net import Mininet
from mininet.node import RemoteController, Docker, OVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel

setLogLevel('info')

# 初始化网络,指定远程控制器类型、OVS交换机,自动设置MAC地址
net = Mininet(controller=RemoteController, switch=OVSSwitch, autoSetMacs=True)

# 添加ONOS远程控制器,提前在网络启动前配置
controller_ip = '127.0.0.1'  # ONOS控制器的IP地址
controller_port = 6653       # ONOS默认OpenFlow 1.3端口
c0 = net.addController('c0', ip=controller_ip, port=controller_port)

# 添加虚拟交换机
s1 = net.addSwitch('s1')
s2 = net.addSwitch('s2')
s3 = net.addSwitch('s3')

# 添加Ubuntu Docker容器主机,privileged=True确保容器有网络操作权限
ubuntu1 = net.addHost(
    'ubuntu1',
    cls=Docker,
    dimage='ubuntu:latest',
    privileged=True,
    cmd='/bin/bash'  # 保持容器运行
)
ubuntu2 = net.addHost(
    'ubuntu2',
    cls=Docker,
    dimage='ubuntu:latest',
    privileged=True,
    cmd='/bin/bash'
)

# 添加PostgreSQL Docker容器,设置必要环境变量确保容器正常启动
postgres = net.addHost(
    'postgres',
    cls=Docker,
    dimage='postgres:latest',
    privileged=True,
    environment={
        'POSTGRES_USER': 'admin',
        'POSTGRES_PASSWORD': 'password',
        'POSTGRES_DB': 'testdb'
    }
)

# 建立容器与交换机、交换机之间的链路
net.addLink(ubuntu1, s1)
net.addLink(ubuntu2, s3)
net.addLink(postgres, s2)
net.addLink(s1, s2)
net.addLink(s2, s3)

# 启动网络,交换机自动关联已配置的控制器
net.start()

# 验证连通性(可选,可直接在CLI中执行pingall)
print("Testing network connectivity...")
net.pingAll()

# 启动Mininet命令行交互
CLI(net)

# 停止网络,清理所有资源
net.stop()

关键实现要点说明

  • 控制器配置:提前在网络初始化时指定RemoteController类型,并添加控制器实例,确保交换机启动时能直接关联ONOS,让ONOS可以通过OpenFlow协议管理这些虚拟交换机。
  • Docker容器配置:
    • privileged=True:赋予容器足够权限,使其能正常处理网络接口配置。
    • Ubuntu容器指定cmd='/bin/bash':避免容器启动后立即退出,保持运行状态以便交互。
    • Postgres容器设置environment参数:提供镜像要求的必要环境变量,确保数据库容器能正常启动并运行。
  • 网络验证:启动后可以通过pingall命令测试所有容器之间的连通性,也可以进入Ubuntu容器内部,用psql -h <postgres容器IP> -U admin testdb测试数据库连接。

内容的提问来源于stack exchange,提问作者Luis Guerra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:08:13