Connaître l'interface veth # d'un conteneur docker

11

J'ai des centaines de conteneurs dans divers commutateurs virtuels logiciels. Je voudrais savoir s'il est possible de savoir quel vnet # appartient à quel conteneur docker. En ce moment, je le détecte en regardant syslog à mesure que chaque conteneur est créé. Dans KVM, il y a une commande "virsh domiflist", c'est exactement ce que je recherche.

user2066671
la source

Réponses:

15

Le iflinkdu récipient est le même que celui ifindexde la veth#.

Vous pouvez obtenir iflinkle conteneur comme suit:

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

Dites, cela se traduit par 12, alors greppour cela:

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

Cela donnera un résultat unique, sur mon système:

/sys/class/net/veth11d4238/ifindex

Combinez cela dans un script:

#!/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

Le script a été écrit pour être facile à suivre.

Exemple d'exécution:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

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

Référence: https://forums.docker.com/t/relationship-between-interface-vethxxxxx-and-container/12872/20

NZD
la source
Merci, mais pour une raison quelconque, cela ne fonctionne pas toujours. J'ai 50 conteneurs et le script ci-dessus retournerait 1 ou 2 blancs. Quand je regarde la valeur iflink pour les deux conteneurs, ils ne sont pas +1 de la valeur obtenue de l'intérieur du conteneur.
user2066671
C'est une supposition: cela pourrait être un problème de timing. Si les conteneurs sont créés trop rapidement les uns après les autres, l'affectation des iflinkvaleurs peut se désynchroniser. Le système peut affecter deux iflinkvaleurs consécutives à deux conteneurs, au lieu d'alterner entre le conteneur et le système.
NZD
C'est intéressant, je crée et exécute les conteneurs dans une boucle for, le dernier conteneur iflink est toujours très différent. Par exemple, l'iflink de / sys / class / net / veth ### / iflink renvoie 4205, mais le conteneur / sys / class / eth0 / iflink affiche 4216
user2066671
Me bat. J'ai essayé quelques choses: démarrer un tas de conteneurs, vérifié que cela iflinks'accordait bien. Arrêté quelques conteneurs et créé quelques nouveaux, vérifié que iflinktoujours bien aligné. J'ai eu 115 conteneurs en marche et mon plus haut iflinkétait 244. Comment se rendre au 4216?
NZD
J'ai également vérifié le post dont j'ai obtenu les informations. Il indique: "Cela peut être découvert en faisant correspondre la iflinkvaleur d'une vethinterface de conteneur avec la valeur ifindex d'une interface hôte ". Mon script utilise iflinkpour les deux. Essayez peut-être «ifindex» pour «veth»?
NZD
3

recherche toutes les interfaces dans les conteneurs.

#!/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
Alexey Gavrilov
la source
1

J'utilise une méthode différente, qui semble très bien fonctionner:

[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
mhristache
la source
J'ai créé un outil qui effectue automatiquement les étapes ci-dessus. Vous pouvez télécharger le binaire linux x86_64 d' ici
mhristache