Skip to main content
 首页 » 编程设计

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

2024年10月24日31webabcd

在 docker 容器在其他 docker 容器内运行的环境中(通过安装 docker 套接字,而不是以特权运行),是否有任何方法可以操纵网络来执行以下操作:

  • 引入延迟
  • 丢弃 % 的数据包
  • 带宽上限

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

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

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

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

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

所有容器都连接到一个由 docker network create foobar 创建的网络。

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

  • 是否有任何方法可以操纵 docker 网络到 docker 网络特性以引入延迟、丢包等?

请您参考如下方法:

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

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

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