Descobrindo a interface veth # de um contêiner de docker

11

Eu tenho centenas de contêineres em vários switches virtuais de software. Gostaria de saber se é possível descobrir qual vnet # pertence a qual contêiner do docker. No momento, estou detectando isso assistindo o syslog à medida que cada contêiner é criado. No KVM, existe um comando "virsh domiflist", que é exatamente o que estou procurando.

user2066671
fonte

Respostas:

15

O iflinkdo contêiner é o mesmo que o ifindexdo veth#.

Você pode obter iflinko contêiner da seguinte maneira:

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

Digamos que isso resulta 12, e então grep:

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

Isso dará um resultado único, no meu sistema:

/sys/class/net/veth11d4238/ifindex

Combine isso em um 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

O script foi escrito para ser fácil de seguir.

Exemplo de execução:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

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

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

NZD
fonte
Obrigado, mas por algum motivo nem sempre funciona. Eu tenho 50 contêineres, e o script acima retornaria 1 ou 2 espaços em branco. Quando olho para o valor do iflink para os dois contêineres, eles não são +1 do valor obtido de dentro do contêiner.
user2066671
Isso é um palpite: pode ser um problema de tempo. Se os contêineres forem criados muito rapidamente um após o outro, a atribuição dos iflinkvalores poderá ficar fora de sincronia. O sistema pode atribuir dois iflinkvalores consecutivos a dois contêineres, em vez de alternar entre o contêiner e o sistema.
NZD
Isso é interessante, eu crio e executo os contêineres em um loop for, o último iflink do contêiner é sempre muito diferente. Por exemplo, o iflink de / sys / class / net / veth ### / iflink retorna 4205, mas o contêiner / sys / class / eth0 / iflink mostra 4216
user2066671
Me bate. Tentei algumas coisas: começar um monte de contêineres, verifiquei se as iflinklinhas estão bem. Parou alguns contêineres e criou alguns novos, verificou que iflinkainda está bem alinhado. Eu tenho 115 contêineres rodando e o máximo iflinkfoi 244. Como você chega a 4216?
NZD
Também verifiquei o post de onde obtive as informações. Ele afirma: "Isso pode ser encontrado combinando o iflinkvalor de uma vethinterface de contêiner com o valor ifindex de uma interface de host". Meu script usa iflinkpara ambos. Talvez tente 'ifindex' para 'veth'?
NZD em NZD
3

procura por todas as interfaces em contêineres.

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

Estou usando um método diferente, que parece funcionar muito bem:

[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
fonte
Eu criei uma ferramenta que executa as etapas acima automaticamente. Você pode baixar o binário linux x86_64 a partir daqui
mhristache