डॉकर + पुल + डीएचसीपी


13

मेरे पास बहुत सारे डॉकटर कंटेनर हैं जो मुझे उसी मेज पर उनके मेजबानों के समान पते योग्य चाहिए। अब तक, मैं एक पुल की स्थापना और मैन्युअल रूप से उन्हें आईपी असाइन करने , और स्वयं आईपी का प्रबंधन करके इसे प्राप्त कर रहा हूं। एक उदाहरण स्टार्टअप ऐसा होगा:

docker run \
--net="none" \ \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.ipv4 = 192.168.1.3/24" \
--lxc-conf="lxc.network.ipv4.gateway = 192.168.1.254" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.name = eth0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]

इस /etc/network/interfacesतरह से (ubuntu) में परिभाषित पुल के मेजबान के साथ :

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        gateway 192.168.1.254
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

जब से मैंने सर्फ़ की खोज की है , मैं कंटेनरों के भीतर स्वचालित खोज का उपयोग करने के लिए आगे बढ़ने की कोशिश कर रहा हूं, ताकि डीएचसीपी आईपी पर नज़र रख सके और उन्हें कंटेनरों को सौंप सके। मैंने तब से स्टार्टअप कमांड को बदल दिया है:

docker run \
--net="none" \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]
/bin/bash

और पुल:

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

यह कंटेनर शुरू हुआ, लेकिन आईपी नहीं था। मैंने तब एक ऑनलाइन पोस्ट से सलाह ली जो फोन करके फेडोरा के साथ काम करने में कामयाब रहा dhclient। दुर्भाग्य से यह ubuntu आधारित कंटेनरों के भीतर मेरे लिए काम नहीं कर रहा है।

नीचे विभिन्न परिस्थितियों में मुझे मिलने वाले निम्न त्रुटि संदेश हैं:

  • कंटेनर को शुरू करने में dhclientसक्षम --privilegedहोने पर चलना :

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • sudo dhclient eth0जब अंदर नहीं चल रहा है--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • रनिंग sudo dhclientया dhclient(कोई इंटरफ़ेस निर्दिष्ट नहीं)।

    तुरंत लौटता है और अभी भी कोई आईपी या नेटवर्क कनेक्टिविटी नहीं है।

मैं अपने होस्ट के रूप में एक ही सबनेट से डायनेमिक आईपी हड़पने के लिए डॉकटर कंटेनर कैसे प्राप्त कर सकता हूं, जैसे कि मैं आईपी को ट्रैक किए बिना कई मेजबानों पर कंटेनर को तैनात कर सकता हूं?

अधिक जानकारी

  • में चल रहा DOCKER_OPTS="-e lxc"है/etc/default/docker
  • होस्ट उबंटू 14.04 है
  • from ubuntu:14.04Dockerfile का उपयोग करके Docker कंटेनरों का निर्माण किया जाता है।

जवाबों:


3

ऐसा प्रतीत होता है कि यह एक खुला मुद्दा है और यह उबंटू कंटेनरों और एपरमोर के लिए विशिष्ट है।

वहाँ एक वर्कफ्रंट bprodoehl से पोस्ट किया गया था:

  • कंटेनर को विशेषाधिकार के रूप में शुरू करें --privileged
  • निम्नलिखित पंक्ति को dockerfile में जोड़ें: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • भागो dhclient eth0और आप अभी भी त्रुटि संदेश देखेंगे: mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busyलेकिन अब आपके पास एक आईपी होगा और आप नेटवर्क का उपयोग कर सकते हैं।

यह मेरे मामले के लिए एक आकर्षण की तरह काम करता है, लेकिन उस mv की आवश्यकता क्यों है? क्या आप कृपया समझा सकते हैं?
फेडेरिको बोनेली

यही वह समाधान था जो उस आदमी ने पोस्ट किया था (जिसे मैंने लिंक किया था) और यह काम करने के लिए प्रकट होता है। शायद कोई और समझा सकता है।
प्रोग्रामर

1
@ फ़ेडरिको बोनेली: एपार्मर उन अनुप्रयोगों के लिए सुरक्षा प्रतिबंध लागू करता है जो इसे प्रबंधित करता है। यह केवल उन्हीं अनुप्रयोगों का प्रबंधन करता है जिनकी इसके लिए नीति परिभाषाएँ हैं। ये नीतियां उनके पथ के आधार पर अनुप्रयोगों से मेल खाती हैं। जब आप के लिए कदम dhclientसे /sbinकरने के लिए /usr/sbinकि AppArmor पॉलिसी परिभाषा अब से मेल नहीं खाएगी और AppArmor इस "अज्ञात" आवेदन करने के लिए किसी भी सुरक्षा प्रतिबंध लागू नहीं होगा।
पेपरिका

मुझे "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient" का सहारा लेना पड़ा क्योंकि वर्कअराउंड नहीं किया गया था, यह एक ubuntu 14.04 कंटेनर फी थी। हालाँकि ऊपर त्रुटि संदेश देखा गया था और फिर एक आईपी पता सौंपा गया था।
नील मैकगिल

1

मुझे एक स्क्रिप्ट मिली है

https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md

यह वही है जो आप चाहते हैं (प्रोग्रामर द्वारा उल्लिखित वर्कअराउंड)।

Mv कमांड की आवश्यकता है, क्योंकि जब आप विशेषाधिकार वाले मोड में docker कंटेनर चलाते हैं, तो docker कंटेनर के लिए AppArmor प्रोफ़ाइल को परिभाषित नहीं करते हैं। इसलिए मशीन-डिफॉल्ट AppArmor प्रोफाइल का उपयोग किया जाता है, और यह आपको डिफ़ॉल्ट पथ पर चलने से रोकता है।


1

यदि आप एक ubuntu docker कंटेनर पर dhcp एड्रेस प्राप्त करने का प्रयास कर रहे हैं, तो बस निम्नलिखित करें:

  1. आप के लिए डीएनएस डेमॉन कमांड पर डीएनएस विकल्प सेट करें ( --dns <my_dns_ip>)
  2. /etc/dhcp/dhclient.confउस लाइन को खोलें और संपादित करें जिसमें request subnet-mask, broadcast-address...शब्द हैं और हटा देंdomain-name, domain-name-servers
  3. फिर आवेदन करने के बाद service networking restartआपको त्रुटि संदेशों के बिना एक नया dhcp पता मिलेगा

-2

दूसरी संभावना "पाइपवर्क" का उपयोग करना है। आपको इसे अपने कंटेनर के बाहर चलाने की आवश्यकता है। https://github.com/jpetazzo/pipework


5
नमस्ते और साइट पर आपका स्वागत है। हम यहां उत्तर को थोड़ा और व्यापक होना पसंद करते हैं। क्या आप इसे संपादित और समझा सकते हैं कि क्या pipeworkहै, जहां कोई इसे पा सकता है, इसे कैसे स्थापित किया जा सकता है, शायद इसके उपयोग का उदाहरण दें? जैसा कि यह खड़ा है, आपका उत्तर एक टिप्पणी है और उत्तर नहीं है।
terdon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.