डॉकटर कंटेनर के वेथ # इंटरफ़ेस का पता लगाना


11

मेरे पास विभिन्न सॉफ्टवेयर वर्चुअल स्विच में सैकड़ों कंटेनर हैं। मैं यह जानना चाहूंगा कि क्या इसका पता लगाना संभव है कि कौन सा vnet # किस डॉकटर कंटेनर से संबंधित है। अभी, मैं इस बात का पता लगा रहा हूं कि प्रत्येक कंटेनर के निर्माण के दौरान सिसलॉग देखने से। KVM में, एक कमांड "virsh domiflist" है, जो वास्तव में मैं देख रहा हूँ।

जवाबों:


15

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


धन्यवाद, लेकिन यह किसी कारण से हमेशा काम नहीं करता है। मेरे पास 50 कंटेनर हैं, और ऊपर की स्क्रिप्ट 1 या 2 रिक्त स्थान देगी। जब मैं दोनों कंटेनरों के लिए iflink मूल्य को देखता हूं, तो वे कंटेनर के अंदर से प्राप्त मूल्य से +1 नहीं होते हैं।
user2066671

यह एक अनुमान है: यह एक समय मुद्दा हो सकता है। यदि कंटेनरों को एक-दूसरे के बाद बहुत जल्दी बनाया जाता है, तो iflinkमान असाइन करना सिंक से बाहर हो सकता है। सिस्टम iflinkकंटेनर और सिस्टम के बीच बारी-बारी के बजाय दो लगातार मान दो कंटेनरों को सौंप सकता है।
NZD

यह दिलचस्प है, मैं कंटेनरों को लूप के लिए बनाता हूं और चलाता हूं, आखिरी कंटेनर इफ्लिन हमेशा बहुत अलग होता है। उदाहरण के लिए, / sys / class / net / veth ### / iflink से iflink 4205 लौटाता है, लेकिन कंटेनर का / sys / class / eth0 / iflink 4216 दिखाता है
user2066671

मुझे पता नहीं। मैंने कुछ चीजों की कोशिश की: कंटेनरों का एक गुच्छा शुरू करना, सत्यापित किया कि iflinkअच्छी तरह से लाइनें। कुछ कंटेनरों को रोका और कुछ नए बनाए, सत्यापित किया कि iflinkअभी भी अच्छी तरह से लाइनें हैं। मुझे ११५ कंटेनर मिले और मेरा उच्चतम iflink२४४ था। आपको ४२१६ कैसे मिले?
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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.