在 docker 容器接口上应用 NetEM WAN 延迟
Apply NetEM WAN delay on a docker container interface
我想对 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
,我看到有几个 虚拟以太网接口 存在(因为其他容器是 运行ning),但我不知道哪个连接到我感兴趣的容器:
# 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 路线似乎不太直截了当,但我认为基于 this answer。
它可能是可行的
但是,默认情况下(使用网桥接口)来自和发送到容器 virt 接口的请求将通过默认网桥网络接口 docker0
。
您可以在那里设置 NetEm 规则,但它也会减慢您所有其他容器的速度。如果这是一个选项,运行 您在单独网络上的容器(使用 docker network create
创建)将是为 experimentation/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
我想对 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
,我看到有几个 虚拟以太网接口 存在(因为其他容器是 运行ning),但我不知道哪个连接到我感兴趣的容器:
# 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 路线似乎不太直截了当,但我认为基于 this answer。
它可能是可行的但是,默认情况下(使用网桥接口)来自和发送到容器 virt 接口的请求将通过默认网桥网络接口 docker0
。
您可以在那里设置 NetEm 规则,但它也会减慢您所有其他容器的速度。如果这是一个选项,运行 您在单独网络上的容器(使用 docker network create
创建)将是为 experimentation/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