2

我想对 docker 容器的出口流量应用 NetEm 延迟。通常,我运行:

# /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 规则应用于这些接口之一。那是对的吗?

4

1 回答 1

4

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

但是,默认情况下(使用桥接接口)来自和发送到容器 virt 接口的请求将通过默认的桥接网络接口docker0

您可以在那里设置 NetEm 规则,但它也会减慢所有其他容器的速度。如果这是一个选项,那么在单独的网络上运行您的容器(使用 创建docker network create)将是一种更简洁的方式来执行此操作以进行实验/测试。

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
于 2017-01-27T17:52:25.933 回答