2015-07-07 4 views
16

में दिखाई नहीं जब मैं की तरहडोकर नेटवर्किंग नाम स्थान आईपी netns सूची

docker run -it -m 560m --cpuset-cpus=1,2 ubuntu sleep 120 

और उसके नामस्थान जाँच के साथ एक नया डोकर कंटेनर बनाएं, मैं देख सकता हूँ (पीआईडी ​​7047 के लिए उदाहरण) है कि नए नामस्थान बनाए गए हैं।

[email protected]:~# ls /proc/7047/ns -la 
total 0 
dr-x--x--x 2 root root 0 Jul 7 12:17 . 
dr-xr-xr-x 9 root root 0 Jul 7 12:16 .. 
lrwxrwxrwx 1 root root 0 Jul 7 12:17 ipc -> ipc:[4026532465] 
lrwxrwxrwx 1 root root 0 Jul 7 12:17 mnt -> mnt:[4026532463] 
lrwxrwxrwx 1 root root 0 Jul 7 12:17 net -> net:[4026532299] 
lrwxrwxrwx 1 root root 0 Jul 7 12:17 pid -> pid:[4026532466] 
lrwxrwxrwx 1 root root 0 Jul 7 12:17 user -> user:[4026531837] 
lrwxrwxrwx 1 root root 0 Jul 7 12:17 uts -> uts:[4026532464] 
[email protected]:~# ls /proc/self/ns -la 

जब मैं ip netns list के साथ जांच मैं नए शुद्ध नाम स्थान नहीं देख सकता।

[email protected]:~/docker/testroot$ ip netns list 
[email protected]:~/docker/testroot$ 

कोई विचार क्यों?

उत्तर

25

क्योंकि डोकर reqired सिमलिंक बनाने नहीं है यही कारण है कि:

# (as root) 
pid=$(docker inspect -f '{{.State.Pid}}' ${container_id}) 
mkdir -p /var/run/netns/ 
ln -sfT /proc/$pid/ns/net /var/run/netns/$container_id 

फिर, कंटेनर की netns नाम स्थान ip netns ${container_id} साथ जांच की जा सकती है, जैसे:

# e.g. show stats about eth0 inside the container 
ip netns exec "${container_id}" ip -s link show eth0 
22

@jary इंगित करता है, ip netns आदेश केवल /var/run/netns में नेमस्पेस सिम्लिंक के साथ काम करता है। हालांकि, अगर आपके पास nsenter कमांड उपलब्ध है (util-linux पैकेज का हिस्सा), तो आप अपने डॉकर कंटेनर के पीआईडी ​​का उपयोग करके एक ही चीज़ को पूरा कर सकते हैं।

एक डोकर कंटेनर की पीआईडी ​​पाने के लिए आपको चला सकते हैं:

nsenter -t <contanier_pid> -n <command> 

उदाहरण के लिए::

$ docker inspect --format '{{.State.Pid}}' weechat 
4432 
$ sudo nsenter -t 4432 -n ip addr show 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
    inet 127.0.0.1/8 scope host lo 
     valid_lft forever preferred_lft forever 
    inet6 ::1/128 scope host 
     valid_lft forever preferred_lft forever 
75: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:1b brd ff:ff:ff:ff:ff:ff 
    inet 172.17.0.27/16 scope global eth0 
     valid_lft forever preferred_lft forever 
    inet6 fe80::42:acff:fe11:1b/64 scope link 
     valid_lft forever preferred_lft forever 

docker inspect --format '{{.State.Pid}}' <container_name_or_Id> 

एक कंटेनर के नेटवर्क नाम स्थान के अंदर एक आदेश प्राप्त करने के लिए

उपर्युक्त ip netns exec <some_namespace> ip addr show चलाने के बराबर था।

जैसा कि आप यहां देख सकते हैं, आपको रूट विशेषाधिकारों के साथ nsenter चलाने की आवश्यकता होगी।

संबंधित मुद्दे