我想将网络可变性引入 Docker 容器。具体来说,我希望能够运行以下命令:
sudo tc qdisc add dev vethecb732a root netem delay 500ms 400ms distribution normal
以及docker-machine环境内的其他相关网络配置命令。
Docker 似乎为在 docker-machine 中运行的每个容器创建并命名一个网络适配器。但是,我不确定如何将我掌握的容器信息与实际随机生成的网络适配器名称关联起来,以便正确执行上述命令。
ip addr
当我从docker-machine 获取该容器的信息时:
22: veth5009782@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 4a:f8:d0:05:b6:90 brd ff:ff:ff:ff:ff:ff
inet6 fe80::48f8:d0ff:fe05:b690/64 scope link
valid_lft forever preferred_lft forever
这些是容器的网络设置:
"NetworkSettings": {
"Bridge": "",
"SandboxID": "3092a7a4d0c09b7461ec2683653f315ed872710e9f74656b6292ada8d2c45931",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/3092a7a4d0c0",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "9fa9f74c3e412264055b3976acd0c740997390625a45e8f6c4fe862acd9e8db8",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "10bb8d5490be0addeacc073534df9517e7fd81f5c607b99cf859a6f4218e9251",
"EndpointID": "9fa9f74c3e412264055b3976acd0c740997390625a45e8f6c4fe862acd9e8db8",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}
我已经验证了我的tc qdisc
配置在手动执行时有效。我只是不确定如何将正确的设备与docker容器关联并允许编程tc
规则。
据我所知,没有什么可以直接将容器与docker-machine适配器关联起来。
我正在运行一个基本的 ubuntu-trusty 图像进行测试。
一种选择是在启动容器时构建容器的网络名称列表(假设最高索引是最新容器),然后存储并使用它,但是感觉相当脆弱,如果多个进程使用相同的docker-machine并启动容器(或使用docker-compose),它将被破坏。