도커 컨테이너의 veth # 인터페이스 찾기


11

다양한 소프트웨어 가상 스위치에 수백 개의 컨테이너가 있습니다. 어떤 vnet #이 어떤 도커 컨테이너에 속하는지 알아낼 수 있는지 알고 싶습니다. 현재 각 컨테이너가 생성 될 때 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

이것은 추측입니다. 타이밍 문제 일 수 있습니다. 컨테이너가 서로 너무 빨리 생성되면 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.