能否在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
相关产品推荐
相关产品推荐

