Answers:
的iflink
容器的相同的ifindex
的veth#
。
您可以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
iflink
值可能会不同步。系统可能会iflink
为两个容器分配两个连续的值,而不是在容器和系统之间交替。
iflink
排列良好。停止了几个容器并创建了一些新的容器,确认iflink
仍然可以很好地对齐。我有115个容器在运行,最高iflink
为244。如何达到4216?
iflink
值与主机veth
接口的ifindex值进行匹配来发现这一点”。我的脚本同时使用iflink
。也许为“ veth”尝试“ ifindex”?
搜索容器中的所有接口。
#!/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
我正在使用另一种方法,它似乎工作得很好:
[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