如何公开 mininet(containernet)主机端口以在本地主机上启动应用程序?

How to expose mininet (containernet) host ports to launch application on localhost?

下面是我尝试使用 mininet(containernet) 创建的拓扑结构,其中有 3 个容器,中间有第 2 层交换机。我想在浏览器的本地主机上访问这些容器(例如 kali linux 容器)。我尝试像文档中所说的那样公开端口,但我仍然无法在浏览器上访问它。 注意-如果我不在本地主机上使用 containernet,我可以访问容器(例如 kali linux conatiner)。 作为参考,第三台主机使用以下 docker 容器- https://hub.docker.com/r/lukaszlach/kali-desktop

#!/usr/bin/python

from mininet.net import Containernet
from mininet.node import Controller
from mininet.cli import CLI
from mininet.link import TCLink
from mininet.log import info, setLogLevel
#VNC_DEFAULT = 5900
#WEB_DEFAULT = 6080
setLogLevel('info')

net = Containernet(controller=Controller)
info('*** Adding controller\n')
net.addController('c0' )
info('*** Adding docker containers\n')
d1 = net.addDocker('d1', ip='10.0.2.16', dimage="virtualmogli_v1_service1", ports=[5000], port_bindings={5000:5000},publish_all_ports=True)
d2 = net.addDocker('d2', ip='10.0.2.15', dimage="virtualmogli_v1_service2", ports=[5001], port_bindings={5001:5001},publish_all_ports=True)
d3 = net.addDocker('d3', ip='10.0.2.17', dimage="virtualmogli_v1_kalicontainer", ports=[5900, 6080], port_bindings={5900: 5900, 6080: 6080}, publish_all_ports=True,)
info('*** Adding switches\n')
s1 = net.addSwitch('s1')
#s2 = net.addSwitch('s2')
info('*** Creating links\n')
net.addLink(d1, s1, cls=TCLink, delay='100ms', bw=1)
#net.addLink(s1, s2, cls=TCLink, delay='100ms', bw=1)
net.addLink(s1, d2, cls=TCLink, delay='100ms', bw=1)
net.addLink(s1, d3, cls=TCLink, delay='100ms', bw=1)
info('*** Starting network\n')
net.start()
info('*** Testing connectivity\n')
net.ping([d1, d2, d3])
info('*** Running CLI\n')
CLI(net)
info('*** Stopping network')
net.stop()

缺少的部分是我们需要将 dcmd="/init" 添加到我们的 containernet 拓扑而不是我们的基础 class。

对于上述问题,下面的代码将起作用- d2 = net.addDocker('d2', ip='10.0.2.15', dimage="lukaszlach/kali-desktop:xfce-top10",ports=[5900,6080],dcmd="/init , port_bindings={5900:5900,6080:6080},publish_all_ports= True, environment={"USER": "kali", "PASSWORD": "kali" , "ROOT_PASSWORD": "root"})