З'ясування veth # інтерфейсу докерного контейнера


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 від значення, отриманого всередині контейнера.
користувач2066671

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