在Docker容器接口上应用NetEM WAN延迟

我想将NetEm延迟应用于docker集装箱的出口stream量。 通常我运行:

# /sbin/tc qdisc add dev $INTERFACE root netem delay ${DELAY}ms 

问题是我不知道容器连接到的接口。

例如,我正在运行以下容器:

 docker run --rm -it alpine /bin/sh 

然后我ping 8.8.8.8:

 / # ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=0 ttl=44 time=39.783 ms 64 bytes from 8.8.8.8: seq=1 ttl=44 time=39.694 ms 

我想要做的是从我的主机添加NetEm规则并查看更改的ping时间。

如果我运行ifconfig ,我看到几个虚拟以太网接口 (因为其他容器正在运行),但我不知道哪一个连接到我感兴趣的容器:

 # ifconfig veth09fa1c5 Link encap:Ethernet HWaddr 96:73:c9:15:93:b8 inet6 addr: fe80::9473:c9ff:fe15:93b8/64 Scope:Link ..... vethf05ef93 Link encap:Ethernet HWaddr ca:ea:97:ef:cd:9d inet6 addr: fe80::c8ea:97ff:feef:cd9d/64 Scope:Link ..... 

我相信我必须将NetEm规则应用到这些接口之一。 那是对的吗?

veth路线似乎不那么简单,但我认为这可能是可行的基于这个答案 。

但是,默认情况下(使用网桥接口),来自和去往容器虚拟接口的请求将通过默认网桥接口docker0

你可以在那里设置NetEm规则,但是也会减慢你所有的其他容器。 如果这是一个选项,运行你的容器在一个单独的networking(创build与docker network create )将是一个更干净的方式来做到这一点的实验/testing。

 docker network create slownet docker network inspect slownet [ { "Name": "slownet", "Id": "535e40d880716a27efe1fd3fada62bdc4d9fa13bde09279de650fa53f13f7cdd", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.19.0.0/16", "Gateway": "172.19.0.1/16" } ] }, "Internal": false, "Containers": {}, "Options": {}, "Labels": {} } ] ifconfig .... br-535e40d88071 Link encap:Ethernet HWaddr 02:42:4E:B6:F8:C2 inet addr:172.19.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:4eff:feb6:f8c2%32727/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:180 errors:0 dropped:0 overruns:0 frame:0 TX packets:180 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:14368 (14.0 KiB) TX bytes:16888 (16.4 KiB) .... # so br-535e40d88071 is the interface 

让我们旋转容器并开始ping:

 host> docker run -ti --rm --net=slownet alpine sh container> ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=114 ttl=37 time=0.251 ms 

然后添加NetEm规则:

 host> tc qdisc add dev br-535e40d88071 root netem delay 100ms 

当发生这种情况时,我看到延迟的增加:

 64 bytes from 8.8.8.8: seq=115 ttl=37 time=0.693 ms 64 bytes from 8.8.8.8: seq=116 ttl=37 time=101.086 ms 64 bytes from 8.8.8.8: seq=117 ttl=37 time=104.056 ms