如何使用Docker(或Linux容器)进行networking仿真?

编辑:截至2015年5月,SocketPlane(请参阅网站和回购 )已joinDocker团队,他们正在将其OVS解决scheme集成到Docker核心中。 看起来他们将成为各种Dockernetworking解决scheme的赢家。


所以我一直在用Mininet在我的networking软件上运行testing。 它似乎已经达到了极限,尽pipeMininet容器基本上是只有一个networking栈的linux容器。 我希望每个容器都有自己的networking堆栈,文件系统和一组进程 – 基本上我希望容器尽可能靠近虚拟机。 据我所知,Docker与Mininet相反,它的容器有一个文件系统和自己的进程,但是没有自己的networking栈。 我倾向于Docker,因为它有一个很好的API来分发容器,只使用diff的磁盘空间。 我的问题是,是否有可能使用以下容器布局+networking接口设置创build一组linux容器(带有Docker或类似的)?

在这里输入图像说明

你可以使用Pipework来达到这个目的。 这是它实现的场景之一(除了标准的Dockernetworking之外,容器之间的专用networking)。

我知道两个使用linux容器的开源networking模拟器:

COREnetworking仿真器使用容器,每个容器都有其自己的文件系统(或者是部分文件系统,因为它只为每个节点上运行的服务所需的目录创build了挂载名称空间)。

VNXnetworking模拟器是另一种select。 它使用KVM或LXC来创build虚拟节点(但我还没有尝试过LXC选项)。

核心networking模拟器确实有一个我贡献的Docker服务,并写了一篇文章 。 4.8版本的初始版本大部分已经破解,但我已经修复并改进了它。 拉请求在GitHub上 。

该服务允许您使用“核心”标记Docker Images,然后将它们作为服务设置中的一个选项显示。 您必须select在容器中启动泊坞窗服务的Docker镜像。 然后select要在该节点中运行的一个或多个容器。 它的尺度非常好,我的16Gb机器上有超过2000个节点。

你也提到了OVS。 这还没有内置到CORE中,但可以手动使用。 我刚刚在CORE邮件列表上回答了一个问题。 它简要概述了使用OVS切换标准CORE交换机(网桥)。 如果有用的话,请在下面复制文本:

之前没有真正使用过openvswitch,只是简单的看了一下。

我通过我的软件包pipe理器(Ubuntu 15.04)安装了openvswitch:

sudo apt-get安装openvswitch-switch

然后,我在CORE 4.8中构build了一个非常简单的networking。 连接到交换机的2台PC。 我开始在CORE中进行仿真。 然后在主机上,我看着已经build立的桥梁:

sudo brctl show bridge name bridge id STP enabled interfaces b.3.76 8000.42c789ce95e9 no veth1.0.76 veth2.0.76 docker0 8000.56847afe9799 no lxcbr0 8000.000000000000 no 

我可以看到代表这个交换机的网桥叫做b.3.76,并且连接了veth1.0.76和veth2.0.76的接口。 我删除了桥:

 sudo ip link set b.3.76 down sudo brctl delbr b.3.76 

然后我build立了openvswitch桥:

 sudo ovs-vsctl add-br b.3.76 sudo ovs-vsctl add-port b.3.76 veth1.0.76 sudo ovs-vsctl add-port b.3.76 veth2.0.76 

我现在可以在节点之间ping,所以交换机似乎正在工作。 我还没有尝试过进行openvswitch的进一步configuration。

当你停止CORE模拟时,它不会明显地删除openvswitch桥或端口,所以你必须手工完成:

 sudo ovs-vsctl del-port veth2.0.76 sudo ovs-vsctl del-port veth1.0.76 sudo ovs-vsctl del-br b.3.76 

这将是相对简单的自动化脚本或一点点的工作可以集成到docker。

希望这可以帮助

@jpillora IMUNESnetworking仿真器为其L3(PC,路由器,主机)使用Docker,为L2(集线器,交换机)节点使用Open vSwitch。 例如,路由器节点实际上是一个Docker容器,带有Debian Jessie系统,运行Quagga自动configuration,因此您只需在GUI中绘制节点。 然后,您可以通过双击这些容器来访问这些容器,并在Linux系统上执行任何您将要执行的操作。 它使用了一个名为“imunes / vroot”的Hub上可用的“特殊”Docker镜像,它使用了一个虚拟的init进程,因此不会终止。 从技术上讲,稍微调整一下,你可以用任何你想要的来代替它。 它的源代码在Github上可用。 我认为这适合你的使用情况。

我尝试了核心和其他一些,但发现他们很难设置和运行(特别是在AWS或Mac上)。 他们可能是强大的,但如果你只是想模拟简单的networking矫枉过正。

所以我写了YANS (又一个networking模拟器)。 YANS基于Docker。 即使我自己也很惊讶地看到它运行得有多快。 试一试!