Назад | Перейти на главную страницу

Как я могу найти имя сетевого адаптера докер-машины для док-контейнера?

Я хотел бы внести вариативность сети в контейнеры докеров. В частности, я хотел бы иметь возможность запускать такие команды, как:

sudo tc qdisc add dev vethecb732a root netem delay 500ms 400ms distribution normal

и другие связанные команды настройки сети в среде 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 конфигурация работает, когда выполняется вручную. Я просто не уверен, как связать правильное устройство с контейнером докеров и разрешить программную tc правила.

Насколько я могу судить, нет ничего простого в том, чтобы связать контейнер с адаптером докер-машины.

Я использую базовый образ, доверяющий Ubuntu, для тестов.

Один из вариантов - создать список сетевых имен для контейнеров по мере их запуска (при условии, что самый высокий индекс - это новейший контейнер), а затем сохранить его и использовать, но он выглядит довольно хрупким и будет уничтожен, если несколько процессов используют тот же docker-machine и запускающие контейнеры (или с использованием docker-compose).