docker.io DNS काम नहीं करता है, यह 8.8.8.8 का उपयोग करने की कोशिश कर रहा है


33

मेरे पास एक नया उबंटू 14.04 स्थापित है, और मेरे पुराने सामान को चलाने के लिए डॉकर का उपयोग करना चाहता हूं जिसे 12.04 की आवश्यकता है। Docker के अंदर DNS काम नहीं करता है।

मेरे लैपटॉप का resolv.conf दिखता है:

nameserver 127.0.0.1

जो डॉकर के साथ काम नहीं करता है, जाहिरा तौर पर। इसलिए यह नेमवेर्सर्स को 8.8.8.8 और 8.8.4.4 पर सेट करने की कोशिश करता है; जब मैं करता हूं

$ sudo docker run -i -t ubuntu /bin/bash

इसे कहते हैं:

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

और यकीन है कि पर्याप्त, डॉकर उदाहरण के अंदर, resolv.conf जैसा दिखता है:

nameserver 8.8.8.8
nameserver 8.8.4.4

मैं उन दोनों को सफलतापूर्वक डॉकर उदाहरण के भीतर से पिंग कर सकता हूं। हालाँकि, कोई DNS (जैसे, ping google.comविफल) है।

डॉकर के अंदर ifconfig आउटपुट:

eth0      Link encap:Ethernet  HWaddr aa:e9:9f:83:9d:92  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:648 (648.0 B)  TX bytes:738 (738.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

अब क्या?

जवाबों:


23

जब उबंटू डोकर पैकेज सिस्टमड का उपयोग करके अद्यतन किया गया /etc/default/docker, तो उसने कॉन्फिग फाइल के लिए समर्थन को गिरा दिया , इसलिए रॉकेटमैन 10404 द्वारा सुझाया गया प्रारंभिक समाधान अब काम नहीं करेगा (अक्षम dnsmasqकरना फिर भी काम करेगा, लेकिन इसमें उबंटू को DNS सर्वर को स्वचालित रूप से अपडेट करने से रोकने का नकारात्मक पहलू है) ।

नई daemon.jsonकॉन्फ़िगरेशन फ़ाइल में फिक्सिंग

अपने नेटवर्क का DNS सर्वर खोजें:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

यदि यह मौजूद नहीं है, तो खोलें या बनाएं, /etc/docker/daemon.jsonऔर DNS सेटिंग्स को ExecStartलाइन में जोड़ें :

# /etc/docker/daemon.json
{
    "dns": ["10.0.0.2", "8.8.8.8"]
}

डॉकटर डेमॉन को फिर से शुरू करें:

$ sudo service docker restart

यदि आप अधिक जानकारी चाहते हैं, तो मैंने एक गहन ब्लॉग पोस्ट लिखी और इस मुद्दे के बारे में एक बग भी दर्ज किया

(मूल रूप से मैंने इसे /lib/systemd/system/docker.service को खोलकर हल किया और DNS सेटिंग्स को ExecStart लाइन में जोड़ा , लेकिन यह बुरा है - हमें सीधे systemd फ़ाइलों को संपादित नहीं करना चाहिए ।)


आपके समाधान के लिए धन्यवाद - यह मेरे समाधान के लिए ली गई सड़क पर मददगार था - जो मुझे लगता है कि मेरी अपनी परिस्थितियों के लिए थोड़ा और अधिक सुंदर मैच है और उबंटू पर डॉकर चलाने की ख़ासियत (या अन्य डेस्कटॉप डिस्ट्रोस जो NetworkManager + snsmasq का उपयोग करते हैं)।
एड्रियन

16

मैं अपने आप को docker का उपयोग नहीं करता, इसलिए मैं सामान्य रूप से docker प्रश्न पर यहाँ बट नहीं सकता, लेकिन मैं अभी इसके बारे में पढ़ रहा था और कुछ docker प्रलेखन पर ठोकर खाई, जो इस सटीक समस्या का समाधान करता प्रतीत होता है । सारांश में...

प्रलेखन कुछ वर्कअराउंड का सुझाव देता है। निम्नलिखित लाइन को जोड़कर कंटेनरों के लिए डीओके डीमन द्वारा उपयोग किए जाने वाले DNS सर्वर को निर्दिष्ट करना पहला है /etc/default/docker:

docker_OPTS="--dns 8.8.8.8"

जहाँ डीएनएस प्रदान किया जाता है वह 192.168.1.1 (गेटवे) जैसे स्थानीय डीएनएस सर्वर हो सकता है। फिर, के साथ पुनरारंभ करें

sudo restart docker

वैकल्पिक समाधान में NetworkManager में dnsmasq को अक्षम करना शामिल है /etc/NetworkManager/NetworkManager.confताकि कॉन्फ़िगरेशन को इस तरह से टिप्पणी कर सके:

#dns=dnsmasq

फिर, दोनों को पुनरारंभ करें

sudo restart network-manager
sudo restart docker

3
मेरे लिए काम करना निष्क्रिय करना।
bennyl

2
यह उत्तरार्द्ध दृष्टिकोण निश्चित रूप से होगा नेटवर्क प्रबंधक dnsmasq को नियंत्रित नहीं कर सकता है, उदाहरण के लिए जिसका अर्थ है कि यह आपके डीएनएस सर्वर को नहीं बदल सकता है जब आप नेटवर्क बदलते हैं, जिसमें वीपीएन पर स्विच करना शामिल है। पूर्व दृष्टिकोण मुझे बेहतर लगता है, लेकिन मैं चाहूंगा कि dnsmasq भी docker IP (172.17.0.1) पर सुने ताकि मैं उस पर docker host को इंगित कर सकूं।
mc0e

1
चूंकि उबंटू ने सीकरम के साथ डॉकर को स्थापित करने के लिए स्विच किया, इसलिए /etc/default/dockerअब कोई प्रभाव नहीं है। इस के बाद समाधान के लिए मेरा समाधान देखें init.d / upstart दुनिया।
रोबिन विंसलो

/etc/NetworkManager/NetworkManager.confउबंटू 18.04 एलटीएस पर मौजूद नहीं है। : /
XtraSimplicity

ध्यान दें कि कुछ उबंटू 18.04 सेटअपों के साथ (जैसे अमेज़ॅन पर न्यूनतम छवि) systemd-resolvedडिफ़ॉल्ट रूप से कैशिंग DNS सर्वर के रूप में कार्य कर रहा है और WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.समस्या को भड़काएगा (Ubuntu 16.04 setups डिफ़ॉल्ट रूप से इसे सक्षम करने के लिए प्रकट नहीं होते हैं)। मुख्य उत्तर में बताए अनुसार कंटेनर शुरू करते समय वैकल्पिक हल systemd-resolvedया तो अक्षम या --dnsविकल्प का उपयोग करना है ।
अननोन

9

मैं अपनी स्थिति में इसमें भाग गया जो विशेष रूप से है

  • मेरे स्थानीय विकास मशीन पर डॉकटर कंटेनर चलाना
  • जो एक वीपीएन से जुड़ा है
  • हमारे कुछ कंटेनर बिल्ड स्क्रिप्ट वीपीएन परnpm install कस्टम रिपॉजिटरी से चलने वाली चीजें करते हैं कि कंटेनर के अंदर ।
    • यह CI पाइपलाइन से काम करता है, लेकिन हमारे डेवलपर मशीनों से नहीं, क्योंकि npmएक सफल DNS लुकअप नहीं कर सकता है
    • हमें उन कंटेनरों के साथ भी समस्या थी जिन्हें बाहरी REST API को कॉल करने के लिए लुकअप करने की आवश्यकता थी

dnsmasqडीएनएस अनुरोधों को कैश करने के लिए उबंटू डिफ़ॉल्ट रूप से उबंटू का उपयोग शुरू करता है, और /etc/resolv.confइस उदाहरण को इंगित करने के लिए कॉन्फ़िगर करता है127.0.1.1

  • जिस वीपीएन क्लाइंट का हम उपयोग कर रहे हैं वह NetworkManager संगत नहीं है और यह स्वयं का है /etc/resolv.confजो NetworkManager कॉन्फिगर को अधिलेखित करता है
  • यह वीपीएन के लिए डीएनएस सर्वर को कॉन्फ़िगर करता है
  • डोकर /etc/resolv.confडिफ़ॉल्ट रूप से आपके कंटेनर पर छाया देता है
    • आमतौर पर उबंटू पर, यह Google DNS सर्वर को कंटेनर में भेजता है (क्योंकि यह dnsmasqस्थिति के बारे में जानता है।
    • लेकिन कंटेनर में वीपीएन डीएनएस सर्वर कॉन्फ़िगरेशन को पास करने में खुशी होती है
    • docker0वीपीएन tap0एडेप्टर पर DNS सर्वरों के लिए नेटवर्क ब्रिज पर कंटेनर से कोई मार्ग नहीं है ।
  • एर्गो, कंटेनर में सभी डीएनएस लुकअप विफल हो जाते हैं क्योंकि यह केवल उसी डीएनएस सर्वर तक नहीं पहुंच सकता है जिसके साथ आपूर्ति की गई है
  • इसके अतिरिक्त, कुछ नेटवर्क Google DNS सर्वरों के अनुरोधों को रोकते हैं क्योंकि वे आपके सभी DNS लुकअप को स्नूप करने में सक्षम होना चाहते हैं

समाधान :

यह NetworkManager का उपयोग करने के लिए अधिक सुरुचिपूर्ण प्रतीत होता है और यह dnsmasqउस तरह से कैप्टिव उदाहरण है जिस तरह से इसे डिज़ाइन किया गया था।

  1. डॉकर को dnsmasqडीएनएस के लिए अपने उदाहरण का उपयोग करने के लिए कहें

    • /etc/docker/daemon.jsonडीओके को docker0डीएनएस के लिए पुल एडेप्टर का उपयोग करने के लिए बताने के लिए फ़ाइल जोड़ें या संपादित करें

      {
        "dns": ["172.17.0.1"]
      }
      
  2. dnsmasqडॉक पुलों को भी सुनने के लिए NM उदाहरण को कॉन्फ़िगर करें , क्योंकि डिफ़ॉल्ट रूप से यह केवल 127.0.1.1 तक सुनता है - फ़ाइल/etc/NetworkManager/dnsmasq.d/docker-bridge.conf

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. मुझे उस वीपीएन क्लाइंट का अशिष्ट व्यवहार पसंद नहीं है और मैं केवल वीपीएन छोरों के लिए वीपीएन छोर पर डीएनएस का उपयोग करता हूं (यदि आपके पास विनम्र वीपीएन क्लाइंट है जो नेटवर्क मैनजर को सही तरीके से कॉन्फ़िगर करता है, तो आपको ऐसा करने की आवश्यकता नहीं होगी। )

    • वीपीएन क्लाइंट में डीएनएस सुविधा बंद करें (यह resolv.confकनेक्ट पर ओवरराइटिंग बंद कर देता है और अब सभी डीएनएस dnsmasqफिर से गुजरता है )
    • dnsmasqअपने डोमेन के लिए प्रत्यक्ष DNS अनुरोधों को उचित रूप से बताने के लिए एक कॉन्फ़िगर फ़ाइल जोड़ें - फ़ाइल जोड़ें `/etc/NetworkManager/dnsmasq.d/vpn-dns.conf

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • वैकल्पिक रूप से, अपने डोमेन के लिए एक खोज डोमेन जोड़ें ताकि आप छोटे नामों का उपयोग कर सकें

      • मैंने अभी अपने डिफ़ॉल्ट नेटवर्क कनेक्शन में खोज सूची में अपना स्थानीय डोमेन जोड़ा है
  4. NetworkManager और Docker को पुनरारंभ करें

    sudo service network-manager restart
    sudo service docker restart
    

इस समय आपके डॉकटर कंटेनर nslookupआपके वीपीएन के अंदर और बाहर दोनों ही डोमेन के लिए वीपीएन पर होने वाले मुद्दों के बिना करने में सक्षम होने चाहिए ।


1
एक छोटा सा ट्वीक जिसमें docker0 ब्रिज IP को हार्ड-कोडिंग शामिल नहीं है, श्रवण-पता निर्देश के बजाय इंटरफ़ेस का उपयोग करना है: इंटरफ़ेस = docker0
siwyd

बहुत बढ़िया स्पष्टीकरण और निर्देश। एक +1 अच्छी तरह से योग्य है।
ेरेऑन

चीयर्स @simonwydooghe - मैंने आपके सुझाव को शामिल किया है - आप उस क्षेत्र में वाइल्डकार्ड का उपयोग भी कर सकते हैं, इसलिए मैंने गैर-डिफ़ॉल्ट नेटवर्क द्वारा उपयोग किए जाने वाले सभी पुल नामों के लिए एक पैटर्न जोड़ा है (कम से कम, जैसा कि docker-compose द्वारा उपयोग किया जाता है)।
एड्रियन

1
ऐसा लगता है कि daemon.json में dns मान एक सरणी है, अन्यथा मुझे एक त्रुटि मिलती है: cannot unmarshal string into Go value of type []stringजब docker सेवा को पुनरारंभ करते हैं।
स्लावेन रेज़िक

बायोनिक के लिए अपडेट: 18.04 अब DNS के लिए NetworkManager द्वारा प्रबंधित dnsmasq के कैप्टिव उदाहरण का उपयोग नहीं करता है और इसके बजाय सिस्टमड-सॉल्यूशन का उपयोग करता है; जो खुद की समस्याओं को लाता है, क्योंकि docker0 पुल को सुनने के लिए इसे कॉन्फ़िगर नहीं किया जा सकता है। मैंने इसे अक्षम करने का सहारा लिया है, और NetworkManager dnsmasq को फिर से स्थापित कर रहा है और इसे सही ढंग से कॉन्फ़िगर कर रहा है।
एड्रियन

2

यहाँ है कि कैसे मैं अपने Ubuntu 14.04 सर्वर पर हेडर चला रहा हूँ।

मैं निम्न सर्वर स्थापित संस्करण के साथ Ubuntu सर्वर 14.04 चला रहा हूं।

#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

फ़ाइल /etc/init/docker.io.conf और स्क्रिप्ट में निम्न पंक्ति है:

# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=

ऊपर दिए गए उत्तर ने मुझे ऊपर फ़ाइल खोजने में मदद की।

मैंने /etc/default/docker.io में निम्नलिखित को अक्षम कर दिया और अपना स्थानीय DNS सर्वर जोड़ा:

# Use DOCKER_OPTS to modify the daemon startup options.  
DOCKER_OPTS="--dns 192.168.X.X"

के साथ सेवा को फिर से शुरू किया:

sudo service docker.io restart

दौड़ा docker run <image> /bin/bash

कंटेनर शुरू करते समय कोई संदेश नहीं।

एक नया कंटेनर शुरू किया, dnsutils स्थापित किया।

रैन डिग और सर्वर संदेश सही स्थानीय डीएनएस सर्वर है।


0

मेरे पास एक समान मुद्दा था, इसे स्टैकऑवरफ्लो को सूचना दी । ऐसा प्रतीत होता है कि मैं 8.8.8.8डोकर के डिफ़ॉल्ट उबंटू स्थापना में निर्दिष्ट नामवर को क्वेरी नहीं कर सका ; हालाँकि, मैं इसे पिंग कर सकता था। इस स्थिति में, एक DNS सर्वर का उपयोग करें जिसे आप वास्तव में क्वेरी कर सकते हैं। के साथ टेस्ट करें

nslookup - dns.server.name

और कंटेनर शुरू करें

docker run --dns=ip.addr.of.dns

मुझे अभी तक https://askubuntu.com/q/607172/30266 के लिए एक स्वचालित समाधान प्राप्त करने का रास्ता नहीं मिला है ।


मेरा उत्तर आपके लिए काफी दुखद हो सकता है ...
एड्रियन

0

यदि आप dnsmasqएक उपयोगकर्ता परिभाषित नेटवर्क पर हैं, तो आप अपने डॉकर कंटेनरों से होस्ट के स्थानीय DNS रिज़ॉल्वर (जैसे ) का उपयोग कर सकते हैं । उस स्थिति में एक कंटेनर /etc/resolv.confमें नेमसर्वर 127.0.0.11(उर्फ डॉकर का एम्बेडेड डीएनएस सर्वर ) होगा, जो होस्ट के लूपबैक पते पर DNS अनुरोधों को ठीक से अग्रेषित कर सकता है।

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

यदि आप उपयोग करते हैं docker-compose, तो यह स्वचालित रूप से आपके कंटेनरों के लिए एक कस्टम नेटवर्क स्थापित करेगा (एक फ़ाइल प्रारूप v2 + के साथ )। हालाँकि, ध्यान दें कि docker-composeउपयोगकर्ता-परिभाषित नेटवर्क में कंटेनर चलाते समय , यह अभी भी उन्हें डिफ़ॉल्ट नेटवर्क में बनाता है । बिल्ड नेटवर्क के लिए कस्टम नेटवर्क का उपयोग करने के लिए आप बिल्ड कॉन्फ़िगरेशनnetwork में पैरामीटर निर्दिष्ट कर सकते हैं (फ़ाइल स्वरूप v3.4 + की आवश्यकता होती है )।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.