Finden der veth # -Schnittstelle eines Docker-Containers


11

Ich habe Hunderte von Containern in verschiedenen virtuellen Software-Switches. Ich würde gerne wissen, ob es möglich ist herauszufinden, welche vnet # zu welchem ​​Docker-Container gehört. Im Moment erkenne ich das, indem ich Syslog beobachte, während jeder Container erstellt wird. In KVM gibt es einen Befehl "virsh domiflist", genau das, wonach ich suche.

Antworten:


15

Das iflinkdes Containers ist das gleiche wie das ifindexdes veth#.

Sie können iflinkden Container wie folgt erhalten:

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

Sagen wir, das führt 12dann dazu grep:

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

Das ergibt auf meinem System ein einzigartiges Ergebnis:

/sys/class/net/veth11d4238/ifindex

Kombinieren Sie das in einem Skript:

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

Das Skript wurde so geschrieben, dass es leicht zu befolgen ist.

Probelauf:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

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

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


Danke, aber es funktioniert aus irgendeinem Grund nicht immer. Ich habe 50 Container und das obige Skript würde 1 oder 2 Leerzeichen zurückgeben. Wenn ich mir den iflink-Wert für beide Container ansehe, sind sie nicht +1 von dem Wert, der aus dem Inneren des Containers erhalten wird.
user2066671

Dies ist eine Vermutung: Es könnte ein Zeitproblem sein. Wenn Container zu schnell nacheinander erstellt werden, ist die Zuweisung der iflinkWerte möglicherweise nicht mehr synchron. Das System kann iflinkzwei Containern zwei aufeinanderfolgende Werte zuweisen , anstatt zwischen dem Container und dem System zu wechseln.
NZD

Das ist interessant, ich erstelle und führe die Container in einer for-Schleife aus, der letzte Container iflink ist immer sehr unterschiedlich. Beispielsweise gibt der iflink von / sys / class / net / veth ### / iflink 4205 zurück, aber der / sys / class / eth0 / iflink des Containers zeigt 4216
user2066671

Schlägt mich. Ich habe ein paar Dinge ausprobiert: ein paar Container starten und überprüfen, ob iflinksie gut zusammenpassen. Habe ein paar Container angehalten und ein paar neue erstellt, verifiziert, dass sie iflinkimmer noch gut ausgerichtet sind. Ich habe 115 Container in Betrieb und mein höchster iflinkwar 244. Wie kommst du zu 4216?
NZD

Ich habe auch den Beitrag überprüft, von dem ich die Informationen erhalten habe. Darin heißt es: "Dies kann herausgefunden werden, indem der iflinkWert einer Containerschnittstelle mit vethdem ifindex-Wert einer Hostschnittstelle abgeglichen wird." Mein Skript verwendet iflinkfür beide. Vielleicht versuchen Sie 'ifindex' für 'veth'?
NZD

3

sucht nach allen Schnittstellen in Containern.

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

Ich verwende eine andere Methode, die anscheinend gut funktioniert:

[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

Ich habe ein Tool erstellt , das die obigen Schritte automatisch ausführt. Sie können die Linux x86_64-Binärdatei von hier
mhristache
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.