Scoprire l'interfaccia veth # di un contenitore docker


11

Ho centinaia di container in vari switch virtuali software. Vorrei sapere se è possibile scoprire quale vnet # appartiene a quale contenitore docker. In questo momento, lo sto rilevando guardando syslog mentre ogni contenitore viene creato. In KVM, c'è un comando "virsh domiflist", che è esattamente quello che sto cercando.

Risposte:


15

Il iflinkcontenitore è uguale ifindexal veth#.

È possibile ottenere iflinkil contenitore come segue:

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

Dì, che risulta 12, quindi grepper quello:

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

Ciò darà un risultato unico, sul mio sistema:

/sys/class/net/veth11d4238/ifindex

Combina questo in uno 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

La sceneggiatura è stata scritta per essere facile da seguire.

Esecuzione di esempio:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

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

Riferimento: https://forums.docker.com/t/relationship-between-interface-vethxxxxx-and-container/12872/20


Grazie, ma per qualche motivo non sempre funziona. Ho 50 contenitori e lo script sopra restituirebbe 1 o 2 spazi vuoti. Quando guardo il valore iflink per entrambi i contenitori, non sono +1 dal valore ottenuto dall'interno del contenitore.
user2066671

Questa è un'ipotesi: potrebbe essere un problema di temporizzazione. Se i contenitori vengono creati uno dopo l'altro troppo rapidamente, l'assegnazione dei iflinkvalori potrebbe non essere sincronizzata. Il sistema potrebbe assegnare due iflinkvalori consecutivi a due contenitori, invece di alternare tra il contenitore e il sistema.
NZD

Questo è interessante, creo ed eseguo i contenitori in un ciclo for, l'ultimo contenitore iflink è sempre molto diverso. Ad esempio, iflink da / sys / class / net / veth ### / iflink restituisce 4205, ma il contenitore / sys / class / eth0 / iflink mostra 4216
user2066671

Mi batte. Ho provato alcune cose: avviare un gruppo di contenitori, verificato che si iflinkallinea perfettamente. Arrestato alcuni container e creato alcuni nuovi, verificato che iflinksi allinea ancora bene. Ho eseguito 115 container e il mio massimo è iflinkstato 244. Come si arriva a 4216?
NZD

Ho anche controllato il post da cui ho ricevuto le informazioni. Afferma: "Questo può essere scoperto abbinando il iflinkvalore di vethun'interfaccia del contenitore con il valore ifindex di un'interfaccia host ". Il mio script utilizza iflinkper entrambi. Forse prova "ifindex" per "veth"?
NZD

3

cerca tutte le interfacce nei container.

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

Sto usando un metodo diverso, che sembra funzionare bene:

[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

Ho creato uno strumento che esegue automaticamente i passaggi precedenti. Puoi scaricare il binario linux x86_64 da qui
mhristache
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.