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.