Dockerコンテナーのveth#インターフェイスを見つける


11

さまざまなソフトウェア仮想スイッチに何百ものコンテナがあります。どのvnet#がどのdockerコンテナーに属しているかを確認できるかどうかを知りたいのですが。現在、各コンテナーが作成されるときにsyslogを監視することでそれを検出しています。KVMには、コマンド「virsh domiflist」があります。これはまさに私が探しているものです。

回答:


15

iflinkコンテナのは同じであるifindexveth#

iflink次のようにしてコンテナのを取得できます。

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

たとえば、結果は12になりgrepます。

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

それは私のシステムでユニークな結果をもたらします:

/sys/class/net/veth11d4238/ifindex

それをスクリプトで組み合わせます。

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

スクリプトは、わかりやすいように作成されました。

サンプルの実行:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

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

リファレンス:https : //forums.docker.com/t/relationship-between-interface-vethxxxxx-and-container/12872/20


ありがとうございましたが、何らかの理由で常に機能するとは限りません。コンテナが50個あり、上記のスクリプトでは1つまたは2つの空白が返されます。両方のコンテナーのiflink値を見ると、コンテナー内から取得した値から+1ではありません。
user2066671 2017年

これは推測です:タイミングの問題である可能性があります。コンテナの作成が速すぎると、iflink値の割り当てが同期しなくなる可能性があります。システムはiflink、コンテナーとシステムを交互に切り替えるのではなく、2つのコンテナーに2 つの連続した値を割り当てる場合があります。
NZD

これは興味深いです。コンテナーをforループで作成して実行します。最後のコンテナーiflinkは常に非常に異なります。たとえば、/ sys / class / net / veth ### / iflinkからのiflinkは4205を返しますが、コンテナの/ sys / class / eth0 / iflinkは4216を示しています
user2066671

私を殴る。私はいくつかのことを試しました:たくさんのコンテナーを開始し、iflinkうまく整列していることを確認しました。いくつかのコンテナーを停止し、いくつかの新しいコンテナーを作成しましたが、iflinkまだうまく整列していることを確認しました。115のコンテナーを実行していて、最高iflinkは244でした。どうすれば4216に到達できますか?
NZD 2017年

情報を入手した投稿も確認しました。「これは、コンテナインターフェースのiflink値をホストvethインターフェースのifindex値と照合することで確認できます。」私のスクリプトはiflink両方に使用します。多分 'veth'のために 'ifindex'を試してみませんか
NZD 2017年

3

コンテナ内のすべてのインターフェースを検索します。

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

私はうまく機能しているように見える別の方法を使用しています:

[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 '29年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.