找出Docker容器的veth#接口


11

我在各种软件虚拟交换机中有数百个容器。我想知道是否有可能找出哪个vnet#属于哪个docker容器。现在,我通过在创建每个容器时观看syslog来检测到这一点。在KVM中,有一个命令“ virsh domiflist”,这正是我要寻找的。

Answers:


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

这是一个猜测:这可能是时间问题。如果创建容器彼此之间的速度过快,则分配iflink值可能会不同步。系统可能会iflink为两个容器分配两个连续的值,而不是在容器和系统之间交替。
NZD

这很有趣,我在for循环中创建并运行容器,最后一个容器iflink总是非常不同。例如,来自/ sys / class / net / veth ### / iflink的iflink返回4205,但是容器的/ sys / class / eth0 / iflink显示4216
user2066671

难倒我了。我尝试了几件事:启动一堆容器,验证是否iflink排列良好。停止了几个容器并创建了一些新的容器,确认iflink仍然可以很好地对齐。我有115个容器在运行,最高iflink为244。如何达到4216?
NZD

我还检查了从中获取信息的帖子。它指出:“可以通过将容器接口的iflink值与主机veth接口的ifindex值进行匹配来发现这一点”。我的脚本同时使用iflink。也许为“ veth”尝试“ ifindex”?
NZD

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 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.