查找 docker 容器的 veth# 接口

查找 docker 容器的 veth# 接口

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

答案1

容器的 与的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

答案2

搜索容器中的所有接口。

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

答案3

我正在使用一种不同的方法,它似乎工作得很好:

[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

答案4

请看这里:https://stackoverflow.com/questions/37860936/find-out-which-network-interface-belongs-to-docker-container

有一些示例说明如何在没有 root 访问权限的情况下获取用于运行 docker 容器的 veth 名称。

您可以在此处找到示例 shell 脚本:https://github.com/dicho-usp/dockerveth

#!/bin/bash

NAME=$1
PID=$(docker inspect $NAME --format "{{.State.Pid}}")
while read iface id; do
    [[ "$iface" == lo ]] && continue
    veth=$(ip -br addr | sed -nre "s/(veth.*)@if$id.*/\1/p")
    echo -e "$NAME\t$iface\t$veth"
done < <(</proc/$PID/net/igmp awk '/^[0-9]+/{print $2 " " $1;}')

相关内容