在没有特权模式的Docker环境中操纵Docker中容器之间的网络流量?

时间:2016-05-20 15:54:24

标签: python macos networking docker dockerpy

在Docker容器在其他docker容器内运行的环境中(通过挂载docker socket,而不是以特权运行),有没有办法操纵网络来执行以下操作:

  • 介绍延迟
  • 丢弃百分比数据包
  • 带宽上限

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

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

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

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

我无法控制系统配置。我在另一个容器中运行这些容器,而不是以特权模式启动。如果我可以改变它,那将是直截了当的,因为我可以使用上面列出的任何一个实用程序。

所有容器都附加到仅由docker network create foobar创建的网络。

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

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

1 个答案:

答案 0 :(得分:1)

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

您可以使用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