3

在 docker 容器在其他 docker 容器中运行的环境中(通过安装 docker 套接字,而不是以特权身份运行),有没有办法操纵网络来执行以下操作:

  • 引入延迟
  • 丢弃数据包的百分比
  • 带宽上限

对来自容器的 docker-to-docker 流量感兴趣,我开始使用 docker-py(在环境中)。我不关心操纵其他流量,例如 docker 到 localhost 或 docker 到 Internet。在许多方面,只操纵 docker-docker 网络流量是理想的。

即使在 docker 容器中,当它在以下情况之一下运行时,也有很多方法可以做到这一点:

  • 特权模式
  • 传递--cap-add=NET_ADMIN标志运行时

一些实用程序(iptables、tc 和使用它们实现的各种库)允许这样做。但是所有这些都需要比我的环境更高的权限,因为“主机”容器不是以特权模式启动的。

我无法控制系统配置。我必须在另一个容器中运行这些容器,而不是在特权模式下启动。如果我可以更改它会很简单,因为我可以使用上面列出的任何实用程序。

所有容器都连接到由docker network create foobar.

我的应用程序是用 Python3.4 编写的,在 OSX 上使用 docker-py。

  • 有没有办法操纵 docker 到 docker 的网络特性来引入延迟、丢包等?
4

1 回答 1

4

我知道这已经很晚了,但是我发现这就是为什么我要寻找自己问题的答案...(但是它确实需要特权,但认为它可能仍然有用)

您可以使用 tc 命令在容器之间引入延迟。例如,如果 ping 时间为 5ms,则运行以下命令:

tc qdisc add dev eth0 root netem delay 1000ms

ping 现在约为。1005 毫秒。

要消除延迟,请运行以下命令:

tc qdisc del dev eth0 root netem

使用 iptables 命令可以模拟网络的完全故障,因此以下命令将阻止到 IP 地址 192.168.1.202 的所有流量:

iptables -A INPUT -s 192.168.1.202/255.255.255.255 -j DROP

并再次取消阻止它使用:

iptables -D INPUT -s 192.168.1.202/255.255.255.255 -j DROP
于 2018-03-19T13:05:04.610 回答