Tìm ra giao diện veth # của một container docker


11

Tôi có hàng trăm container trong các phần mềm chuyển đổi ảo khác nhau. Tôi muốn biết nếu có thể tìm ra vnet # thuộc về container docker nào. Ngay bây giờ, tôi đang phát hiện ra rằng bằng cách xem syslog khi mỗi container được tạo. Trong KVM, có một lệnh "virsh domiflist", đó chính xác là những gì tôi đang tìm kiếm.

Câu trả lời:


15

Các iflinkcontainer giống như ifindexcủa veth#.

Bạn có thể lấy iflinkcontainer như sau:

docker exec -it <container-name> bash -c 'cat /sys/class/net/eth0/iflink'

Nói rằng, kết quả là 12, sau đó grepcho rằng:

grep -l 12 /sys/class/net/veth*/ifindex

Điều đó sẽ cho một kết quả duy nhất, trên hệ thống của tôi:

/sys/class/net/veth11d4238/ifindex

Kết hợp điều đó trong một kịch bản:

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

Kịch bản được viết để dễ theo dõi.

Chạy mẫu:

$ docker ps -q
c4d8096eff43
34ac6e9f1e6e
d5a2aa5f3de3

$ sudo ./vethfinder
c4d8096eff43:veth11d4238
34ac6e9f1e6e:veth7d52cd1
d5a2aa5f3de3:vethe46073d

Tham khảo: https://forums.docker.com/t/relationship-b between-interface-vethxxxxx-and-content / 12872/20


Cảm ơn bạn, nhưng vì một số lý do không phải lúc nào cũng hoạt động. Tôi có 50 container và đoạn script trên sẽ trả về 1 hoặc 2 khoảng trống. Khi tôi nhìn vào giá trị iflink cho cả hai container, chúng không +1 từ giá trị thu được từ bên trong container.
dùng2066671

Đây là một phỏng đoán: Nó có thể là một vấn đề thời gian. Nếu các thùng chứa được tạo quá nhanh sau đó, thì việc gán các iflinkgiá trị có thể không đồng bộ. Hệ thống có thể gán hai iflinkgiá trị liên tiếp cho hai container, thay vì xen kẽ giữa container và hệ thống.
NZD

Điều này thật thú vị, tôi tạo và chạy các container trong một vòng lặp for, iflink container cuối cùng luôn rất khác nhau. Ví dụ: iflink từ / sys / class / net / veth ### / iflink trả về 4205, nhưng hàm chứa / sys / class / eth0 / iflink hiển thị 4216
user2066671

Đánh bại tôi Tôi đã thử một vài điều: bắt đầu một loạt các container, xác minh rằng xếp iflinkhàng độc đáo. Dừng một vài container và tạo một vài cái mới, xác minh rằng iflinkvẫn xếp hàng độc đáo. Tôi có 115 container đang chạy và mức cao nhất của tôi iflinklà 244. Làm thế nào để bạn có được 4216?
NZD

Tôi cũng đã kiểm tra bài tôi nhận được thông tin từ. Nó tuyên bố: "Điều này có thể được tìm ra bằng cách khớp iflinkgiá trị của giao diện container với vethgiá trị ifindex của giao diện máy chủ ". Kịch bản của tôi sử dụng iflinkcho cả hai. Có thể thử 'ifindex' cho 'veth'?
NZD

3

tìm kiếm cho tất cả các giao diện trong container.

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

Tôi đang sử dụng một phương pháp khác, có vẻ như chỉ hoạt động tốt:

[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

Tôi đã tạo ra một công cụ thực hiện các bước trên một cách tự động. Bạn có thể tải xuống tệp nhị phân linux x86_64 từ đây
mhristache
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.