Eu gostaria de introduzir a variabilidade de rede nos contêineres do Docker. Especificamente, gostaria de poder executar comandos como:
sudo tc qdisc add dev vethecb732a root netem delay 500ms 400ms distribution normal
e outros comandos de configuração de rede relacionados no ambiente do docker-machine.
O Docker parece criar e nomear um adaptador de rede para cada contêiner que está sendo executado no computador do docker. No entanto, não tenho certeza de como associar as informações disponíveis para o contêiner ao nome real do adaptador de rede gerado aleatoriamente, para executar comandos como os acima corretamente.
Quando obtenho as informações de ip addr
no docker-machine para este contêiner:
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
E estas são as configurações de rede do contêiner:
"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"
}
}
}
Verifiquei que minha configuração tc qdisc
funciona, quando executada manualmente. Não estou certo de como associar o dispositivo correto ao contêiner docker e permitir regras tc
programáticas.
Da melhor maneira que posso ver, não há nada simples de associar o contêiner ao adaptador docker-machine.
Estou executando uma imagem básica do Ubuntu para testes.
Uma opção é criar uma lista de nomes de rede para contêineres quando eu iniciá-los (assumindo que o índice mais alto é o mais novo) e depois armazená-los e usá-los, mas ele é bastante frágil e será destruído se vários processos estão usando o mesmo docker-machine e contêineres iniciais (ou usando o docker-compose).
Tags networking docker ip