Выяснение veth # интерфейса Docker-контейнера


11

У меня есть сотни контейнеров в различных программных виртуальных коммутаторах. Я хотел бы знать, возможно ли выяснить, какой vnet # принадлежит какому контейнеру Docker. Прямо сейчас я обнаруживаю это, наблюдая за системным журналом, когда создается каждый контейнер. В KVM есть команда "virsh domiflist", которая именно то, что я ищу.

Ответы:


15

iflinkКонтейнера является такой же , как ifindexиз veth#.

Вы можете получить iflinkконтейнер следующим образом:

docker exec -it <container-name> bash -c 'cat /sys/class/net/eth0/iflink'

Скажем, что в результате 12, то grepдля этого:

grep -l 12 /sys/class/net/veth*/ifindex

Это даст уникальный результат в моей системе:

/sys/class/net/veth11d4238/ifindex

Объедините это в сценарии:

#!/bin/bash

for container in $(docker ps -q); do
    iflink=`docker exec -it $container bash -c 'cat /sys/class/net/eth0/iflink'`
    iflink=`echo $iflink|tr -d '\r'`
    veth=`grep -l $iflink /sys/class/net/veth*/ifindex`
    veth=`echo $veth|sed -e 's;^.*net/\(.*\)/ifindex$;\1;'`
    echo $container:$veth
done

Сценарий был написан, чтобы было легко следовать.

Образец прогона:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

$ sudo ./vethfinder
c4d8096eff43:veth11d4238
34ac6e9f1e6e:veth7d52cd1
d5a2aa5f3de3:vethe46073d

Ссылка: https://forums.docker.com/t/relationship-between-interface-vethxxxxx-and-container/12872/20


Спасибо, но по некоторым причинам это не всегда работает. У меня есть 50 контейнеров, и скрипт, приведенный выше, вернет 1 или 2 пробела. Когда я смотрю на значение iflink для обоих контейнеров, они не равны +1 от значения, полученного из контейнера.
user2066671

Это предположение: это может быть проблема времени. Если контейнеры создаются слишком быстро друг за другом, назначение iflinkзначений может быть не синхронизировано. Система может назначить два последовательных iflinkзначения двум контейнерам вместо чередования между контейнером и системой.
NZD

Это интересно, я создаю и запускаю контейнеры в цикле for, последний контейнер iflink всегда сильно отличается. Например, ссылка iflink из / sys / class / net / veth ### / iflink возвращает 4205, но ссылка контейнера / sys / class / eth0 / iflink показывает 4216
user2066671

Бьет меня Я попробовал несколько вещей: запустив кучу контейнеров, проверил, что iflinkвсе хорошо. Остановил несколько контейнеров и создал несколько новых, проверил, что iflinkвсе еще хорошо выстраивается. У меня работает 115 контейнеров, а мой самый высокий iflink- 244. Как добраться до 4216?
NZD

Я также проверил пост, из которого я получил информацию. В нем говорится: «Это можно выяснить, сопоставив значение интерфейса контейнера со iflinkзначением vethifindex интерфейса хоста». Мой сценарий использует iflinkдля обоих. Может быть, попробовать 'ifindex' для 'veth'?
NZD

3

ищет все интерфейсы в контейнерах.

#!/bin/bash

for container in $(docker ps --format '{{.Names}}'); do
    iflink=`docker exec -it $container bash -c 'cat /sys/class/net/eth*/iflink'`
    for net in $iflink;do
        net=`echo $net|tr -d '\r'`
        veth=`grep -l $net /sys/class/net/veth*/ifindex`
        veth=`echo $veth|sed -e 's;^.*net/\(.*\)/ifindex$;\1;'`
        echo $container:$veth
    done
done

1

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

[root@kh1 ~]# docker inspect 6d48e279c5b8 --format '{{.State.Pid}}'                                                                                                                                                                                                              
56316
[root@kh1 ~]# 
[root@kh1 ~]# ip netns identify 56316
ns-56316
[root@kh1 ~]# 
[root@kh1 ~]# ip netns list | grep ns-56316
ns-56316 (id: 6)
[root@kh1 ~]# 
[root@kh1 ~]# ip link show | grep -B1 "link-netnsid 6"
330: veth1ce76e2b@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master cni0 state UP mode DEFAULT group default 
    link/ether de:f8:ce:a2:85:f9 brd ff:ff:ff:ff:ff:ff link-netnsid 6

Я создал инструмент, который выполняет описанные выше шаги автоматически. Вы можете скачать бинарный файл Linux x86_64 отсюда
mhristache
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.