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.
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
iflink
valores poderá ficar fora de sincronia. O sistema pode atribuir doisiflink
valores consecutivos a dois contêineres, em vez de alternar entre o contêiner e o sistema.iflink
linhas estão bem. Parou alguns contêineres e criou alguns novos, verificou queiflink
ainda está bem alinhado. Eu tenho 115 contêineres rodando e o máximoiflink
foi 244. Como você chega a 4216?iflink
valor de umaveth
interface de contêiner com o valor ifindex de uma interface de host". Meu script usaiflink
para ambos. Talvez tente 'ifindex' para 'veth'?procura por todas as interfaces em contêineres.
fonte
Estou usando um método diferente, que parece funcionar muito bem:
fonte