다양한 소프트웨어 가상 스위치에 수백 개의 컨테이너가 있습니다. 어떤 vnet #이 어떤 도커 컨테이너에 속하는지 알아낼 수 있는지 알고 싶습니다. 현재 각 컨테이너가 생성 될 때 syslog를 보면서 감지하고 있습니다. KVM에는 "virsh domiflist"라는 명령이 있는데, 이것이 바로 내가 찾는 것입니다.
다양한 소프트웨어 가상 스위치에 수백 개의 컨테이너가 있습니다. 어떤 vnet #이 어떤 도커 컨테이너에 속하는지 알아낼 수 있는지 알고 싶습니다. 현재 각 컨테이너가 생성 될 때 syslog를 보면서 감지하고 있습니다. KVM에는 "virsh domiflist"라는 명령이 있는데, 이것이 바로 내가 찾는 것입니다.
답변:
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