在 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
