首页 > 解决方案 > 可以在 linux (docker, openvswitch) 中的两个网络接口之间建立桥梁

问题描述

首先,我不擅长网络编程和英语。

我想创建新网桥来替代 docker 默认网桥以限制输出带宽。

我尝试使用 tc 来控制容器的出口带宽。

经过几次尝试,我认为要限制容器出站带宽,tc 必须在容器中运行。但在我的环境中,这是不允许的。

所以我考虑使用openvswitch(ovs)。

但是创建 ovs 网桥,因为 docker 默认网桥不起作用。

所以我使用选项 --net=none 创建了 docker 容器,并将 ovs veth peer 附加到容器。它可以工作,但是某些功能受到限制,例如在 docker stats 中看不到网络 I/O。

主要问题如下。

我想使用 docker 默认网桥“docker0”和 ovs 来限制容器的出口带宽。

在此处输入图像描述

我的想法是创建 ovs 桥并位于 eth0 和 docker0 之间。但是我没有任何知识来判断这个想法是否可以实施。

这个想法有可能实现吗?

如果是,请让我知道我应该学习什么才能工作。

如果 tc 也可以用于限制容器出口带宽,请教我。

标签: linuxdockernetwork-programmingopenvswitch

解决方案


可以在 Linux 中创建任何时髦的桥链:

诀窍是如何将桥梁连接在一起。有两种选择: 1) 在 OVS 中使用所谓的“补丁”链接类型(仅在两个 OVS 网桥之间工作)。(在互联网上找到的第一篇关于此的文章:https ://blog.scottlowe.org/2012/11/27/connecting-ovs-bridges-with-patch-ports/ )

2)连接任何两个桥的通用方法(甚至是带有 br-tools 的 OVS,或任何其他类似桥的东西):使用 veth。

Veth 是一个虚拟以太网接口:当您创建它时,它会同时创建两个接口(feveth0veth1)。所有进出veth0的流量veth1,所有进出veth1的流量veth0。您可以将 veth0 插入您的docker0网桥和veth1您选择的网桥(比如说mybrige)。

执行此操作的命令:

ip link add type veth  # check out ip link list command to see new interfaces
ip link set up dev veth0 # names may be different
ip link set up dev veth1
ovs-vsctl add-br mybridge
ovs-vsctl add-port mybridge veth0
ovs-vsctl add-port mybrige eth0
brctl addif docker0 veth1 # I'm not sure what kind of bridge docker uses, may be it's ovs-vsctl add-port docker0 veth1

额外的事实:veth 是一个适当的 linux eth 接口,可以根据需要对其进行整形/过滤。


推荐阅读