Docker konteynerinin veth # arayüzünü bulma


11

Çeşitli yazılım sanal anahtarlarında yüzlerce kapsayıcı var. Hangi vnet # hangi docker konteyner ait olduğunu bulmak mümkün olup olmadığını bilmek istiyorum. Şu anda, her kap oluşturuldukça syslog izleyerek bunu tespit ediyorum. KVM'de, tam olarak aradığım şey olan "virsh domiflist" komutu var.

Yanıtlar:


15

iflinkKabın aynıdır ifindexarasında veth#.

iflinkKonteyneri aşağıdaki gibi alabilirsiniz :

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

Söylesene, sonuçları 12, daha sonra grepbunun için:

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

Bu benim sistemimde benzersiz bir sonuç verecektir:

/sys/class/net/veth11d4238/ifindex

Bunu bir komut dosyasında birleştirin:

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

Senaryoyu takip etmesi kolay yazılmıştır.

Örnek çalışma:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

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

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


Teşekkür ederim, ama bir nedenden dolayı her zaman işe yaramıyor. 50 kapsayıcı var ve yukarıdaki komut dosyası 1 veya 2 boşluk döndürür. Her iki kapsayıcı için iflink değerine baktığımda, bunlar kabın içinden elde edilen değerden +1 değil.
user2066671

Bu bir tahmin: Bir zamanlama sorunu olabilir. Kaplar birbiri ardına çok hızlı oluşturulursa, iflinkdeğerlerin atanması senkronize olmayabilir. Sistem iflink, kap ve sistem arasında geçiş yapmak yerine iki kapsayıcıya art arda iki değer atayabilir .
NZD

Bu ilginç, ben bir for döngüsü, son kap iflink her zaman çok farklıdır oluşturmak ve çalıştırmak. Örneğin, / sys / class / net / veth ### / iflink'teki iflink 4205 değerini döndürür, ancak kabın / sys / class / eth0 / iflink, 0
27'de

Beni aşar. Birkaç şey denedim: bir grup konteynere başlamak, bu iflinkçizgilerin güzelce doğrulandığını doğruladı . Birkaç kapsayıcıyı durdurdu ve birkaç yeni kutu oluşturdu, iflinkyine de güzel bir şekilde sıralandığını doğruladı . 115 konteynırım var ve en yüksek iflinkdeğerim 244'dü. 4216'ya nasıl ulaşırsınız?
NZD

Ayrıca bilgiyi aldığım yazıyı da kontrol ettim. Şunu belirtir: "Bu, bir kapsayıcı arabiriminin iflinkdeğerini bir anasistem vetharabiriminin ifindex değeri ile eşleştirerek bulunabilir ". Betiğim iflinkher ikisi için de kullanıyor . Belki 'veth' için 'ifindex'i deneyin?
NZD

3

kaplardaki tüm arabirimleri arar.

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

İyi çalışıyor gibi görünüyor farklı bir yöntem kullanıyorum:

[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

Yukarıdaki adımları otomatik olarak yapan bir araç oluşturdum . Linux x86_64 ikili dosyasını buradan
indirebilirsiniz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.