Descubrir la interfaz veth # de un contenedor acoplable

11

Tengo cientos de contenedores en varios conmutadores virtuales de software. Me gustaría saber si es posible averiguar qué vnet # pertenece a qué contenedor de docker. En este momento, lo estoy detectando viendo syslog a medida que se crea cada contenedor. En KVM, hay un comando "virsh domiflist", que es exactamente lo que estoy buscando.

usuario2066671
fuente

Respuestas:

15

El iflinkdel contenedor es el mismo que el ifindexdel veth#.

Puede obtener iflinkel contenedor de la siguiente manera:

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

Digamos que eso resulta 12, entonces greppara eso:

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

Eso dará un resultado único, en mi sistema:

/sys/class/net/veth11d4238/ifindex

Combina eso en 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

El guión fue escrito para ser fácil de seguir.

Ejecución de muestra:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

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

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

NZD
fuente
Gracias, pero por alguna razón no siempre funciona. Tengo 50 contenedores, y el script anterior devolvería 1 o 2 espacios en blanco. Cuando miro el valor de iflink para ambos contenedores, no son +1 del valor obtenido desde el interior del contenedor.
user2066671
Esto es una suposición: podría ser un problema de tiempo. Si los contenedores se crean demasiado rápido uno después del otro, la asignación de los iflinkvalores podría no estar sincronizada. El sistema puede asignar dos iflinkvalores consecutivos a dos contenedores, en lugar de alternar entre el contenedor y el sistema.
NZD
Esto es interesante, creo y ejecuto los contenedores en un bucle for, el último contenedor iflink siempre es muy diferente. Por ejemplo, el enlace if / sys / class / net / veth ### / iflink devuelve 4205, pero el contenedor / sys / class / eth0 / iflink muestra 4216
user2066671
Me gana Intenté algunas cosas: comenzar un montón de contenedores, verifiqué que se iflinkalinea bien. Detuve algunos contenedores y creé algunos nuevos, verifiqué que iflinktodavía se alinea bien. Tengo 115 contenedores funcionando y el más alto iflinkfue 244. ¿Cómo llegas al 4216?
NZD
También revisé la publicación de donde obtuve la información. Dice: "Esto se puede encontrar haciendo coincidir el iflinkvalor de la interfaz de un contenedor con el valor vethde índice de la interfaz del host". Mi script usa iflinkpara ambos. Tal vez intente 'ifindex' para 'veth'?
NZD
3

busca todas las interfaces en contenedores.

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

Estoy usando un método diferente, que parece funcionar bien:

[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
fuente
He creado una herramienta que realiza los pasos anteriores automáticamente. Puede descargar el binario linux x86_64 desde aquí
mhristache