docker.io DNS কাজ করে না, এটি 8.8.8.8 ব্যবহার করার চেষ্টা করছে


33

আমার একটি নতুন উবুন্টু 14.04 ইনস্টল আছে এবং আমার পুরানো জিনিসগুলি চালানোর জন্য ডকার ব্যবহার করতে চাই যা 12.04 এর দরকার। ডকারের ভিতরে ডিএনএস কাজ করে না।

আমার ল্যাপটপের রেজোলভকনফ দেখতে দেখতে:

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]

এবং নিশ্চিতভাবেই, ডকারের দৃষ্টান্তের মধ্যে রেজোলভ.কনফ এর মত দেখাচ্ছে:

nameserver 8.8.8.8
nameserver 8.8.4.4

আমি উভয় সফলভাবে ডকার উদাহরণের মধ্যে থেকে পিং করতে পারি। তবে কোনও ডিএনএস নেই (যেমন ping google.comব্যর্থ) ails

ডকারের ভিতরে 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এখনও কাজ করবে না , তবে এটি ডিএনএস সার্ভারটি স্বয়ংক্রিয়ভাবে আপডেট করা থেকে উবুন্টুকে আটকাতে পারে) ।

নতুন daemon.jsonকনফিগার ফাইলে ফিক্সিং করা হচ্ছে

আপনার নেটওয়ার্কের ডিএনএস সার্ভারটি সন্ধান করুন:

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

খুলুন বা তৈরি করুন, যদি এটি বিদ্যমান না থাকে /etc/docker/daemon.jsonএবং ExecStartলাইনে DNS সেটিংস যুক্ত করুন :

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

ডকার ডেমন পুনরায় চালু করুন:

$ sudo service docker restart

আমি গভীরতর ব্লগ পোস্ট লিখেছি এবং আপনি আরও বিশদ বিবরণ চাইলে এই সমস্যাটি সম্পর্কে একটি বাগও দায়ের করেছি।

(মূলত আমি এটিকে সমাধান / লিব / সিস্টেমেড / সিস্টেমে / ডকার.সার্ভিস চালু করে এবং এক্সএনস্টার্ট লাইনে ডিএনএস সেটিংস যুক্ত করেছিলাম , তবে এটি খারাপ - আমাদের সরাসরি সিস্টেমড ফাইলগুলি সম্পাদনা করা উচিত নয় ।)


আপনার সমাধানের জন্য ধন্যবাদ - আমি আমার সমাধানে যে রাস্তাটি নিয়েছি তাতে সহায়ক ছিল - যা আমি মনে করি আমার নিজের পরিস্থিতিতে এবং উবুন্টুতে ডকার চালানোর বিশেষত্বের (বা নেটওয়ার্ক ম্যানেজার + ডিএনএসএমএসসি ব্যবহার করা অন্যান্য ডেস্কটপ ডিস্ট্রোস) বিশেষত্বের জন্য কিছুটা মার্জিত মিল।
অ্যাড্রিয়ান

16

আমি নিজে ডকার ব্যবহার করি না, তাই আমি এখানে সাধারণত ডকারের প্রশ্নে বাট-ইন করতাম না, তবে আমি কেবল এটি সম্পর্কে পড়তে গিয়ে কিছু ডক ডকুমেন্টেশনে হোঁচট খেয়েছি যা এই সঠিক সমস্যার সমাধান করে বলে মনে হচ্ছে । যোগফল ...

ডকুমেন্টেশনটি কয়েক কর্মক্ষেত্রের পরামর্শ দেয়। প্রথমটি নিম্নোক্ত লাইনটি এতে যুক্ত করে পাত্রগুলির জন্য ডকার ডিমন দ্বারা ব্যবহৃত ডিএনএস সার্ভারটি নির্দিষ্ট করে /etc/default/docker:

docker_OPTS="--dns 8.8.8.8"

যেখানে সরবরাহ করা ডিএনএস স্থানীয় ডিএনএস সার্ভার হতে পারে, যেমন 192.168.1.1 (গেটওয়ে)। তারপরে, পুনরায় আরম্ভ করুন

sudo restart docker

একটি বিকল্প সমাধান এর মধ্যে কনফিগারেশনকে /etc/NetworkManager/NetworkManager.confমত করে মন্তব্য করে নেটওয়ার্ক ম্যানেজারে dnsmasq অক্ষম করা জড়িত :

#dns=dnsmasq

তারপর, উভয় পুনরায় আরম্ভ করুন

sudo restart network-manager
sudo restart docker

3
dnsmasq অক্ষম করা আমার জন্য কাজ করেছিল worked
বেনিল

2
এই পরবর্তী পদ্ধতির অবশ্যই নেটওয়ার্ক ম্যানেজারটি ডিএনএসএএসকি নিয়ন্ত্রণ করতে পারে না, উদাহরণস্বরূপ আপনি যখন ভিপিএনতে স্যুইচ করা সহ নেটওয়ার্ক পরিবর্তন করেন তখন এটি আপনার ডিএনএস সার্ভারটি পরিবর্তন করতে পারে না। পূর্বের পদ্ধতিটি আমার কাছে আরও ভাল বলে মনে হচ্ছে তবে আমি ডনসম্যাসকে ডকার আইপি (172.17.0.1) শুনতেও সক্ষম হতে চাই যাতে আমি তাতে ডকার হোস্টগুলিকে নির্দেশ করতে পারি।
mc0e

1
উবুন্টু যেহেতু সিটেমড সহ ডকার সেটআপ করতে চলেছে তাই /etc/default/dockerআর কোনও প্রভাব নেই। পোস্ট-init.d / upstart বিশ্বে কীভাবে এটি সমাধান করা যায় তার জন্য আমার সমাধান দেখুন ।
রবিন উইনস্লো

/etc/NetworkManager/NetworkManager.confউবুন্টু 18.04 এলটিএসে নেই। : /
এক্সট্রাস্পিলিকটি

নোট করুন যে কয়েকটি উবুন্টু 18.04 সেটআপের সাথে (যেমন অ্যামাজনের ন্যূনতম চিত্র) systemd-resolvedডিফল্টরূপে ক্যাচিং ডিএনএস সার্ভার হিসাবে কাজ করছে এবং WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.সমস্যাটি উত্সাহিত করবে (উবুন্টু 16.04 সেটআপগুলি এটি ডিফল্টরূপে সক্ষম করার জন্য উপস্থিত হয় না)। মূল উত্তরে উল্লিখিত কন্টেইনারটি শুরু করার সময় কর্মক্ষেত্রটি হয় অক্ষম systemd-resolvedবা --dnsবিকল্পটি ব্যবহার করা ।
আনন

9

আমি আমার পরিস্থিতিতে এটি ছুটেছি যা বিশেষভাবে

  • আমার স্থানীয় বিকাশ মেশিনে ডকার পাত্রে চালানো
  • যা কোনও ভিপিএন-এর সাথে সংযুক্ত
  • আমাদের কিছু ধারক বিল্ড স্ক্রিপ্টগুলি কনটেইনারটির ভিতরে ভিপিএন-তেnpm install একটি কাস্টম সংগ্রহস্থল থেকে চালানোর মতো কাজ করে
    • এটি একটি সিআই পাইপলাইন থেকে কাজ করে তবে আমাদের বিকাশকারী মেশিনগুলি থেকে নয়, কারণ npmএকটি সফল ডিএনএস লুকআপ করতে পারে না
    • বাহ্যিক REST এপিআইগুলিতে কল করার জন্য আমাদের প্রয়োজনীয় ধারকগুলির সাথেও সমস্যা ছিল lookup

ডিফল্টরূপে উবুন্টু dnsmasqডিএনএস অনুরোধগুলি ক্যাশে করার জন্য নেটওয়ার্কম্যানেজার দ্বারা শুরু হয়েছিল এবং /etc/resolv.confএই উদাহরণটিতে নির্দেশ করার জন্য কনফিগার করে127.0.1.1

  • আমরা যে ভিপিএন ক্লায়েন্টটি ব্যবহার করছি তা নেটওয়্যার ম্যানেজারের সাথে সামঞ্জস্যপূর্ণ নয় এবং এটি নিজের নিজস্বকে জোর করে /etc/resolv.confযা নেটওয়ার্ক ম্যানেজার কনফিগারটিকে ওভাররাইট করে
  • এটি ভিপিএন এর জন্য ডিএনএস সার্ভারগুলি কনফিগার করে
  • ডকার /etc/resolv.confডিফল্টরূপে আপনার ধারকটিকে ছায়া দেয়
    • সাধারণত উবুন্টুতে, এটি গুগল ডিএনএস সার্ভারগুলি পাত্রে পাস করে (কারণ এটি dnsmasqপরিস্থিতি সম্পর্কে জানে ।
    • তবে কনটেইনারটিতে ভিপিএন ডিএনএস সার্ভার কনফিগারেশনটি পাস করে খুশি
    • docker0নেটওয়ার্ক ব্রিজের ধারক থেকে ভিপিএন tap0অ্যাডাপ্টারের ডিএনএস সার্ভারের কোনও রুট নেই ।
  • তবে, ধারকটির সমস্ত ডিএনএস লুকআপ ব্যর্থ হয়েছে কারণ এটি সরবরাহ করা একমাত্র ডিএনএস সার্ভারগুলিতে পৌঁছতে পারে না
  • অতিরিক্তভাবে, কিছু নেটওয়ার্ক গুগল ডিএনএস সার্ভারগুলিতে অনুরোধগুলি অবরুদ্ধ করে কারণ তারা আপনার সমস্ত ডিএনএস লুকআপ স্নুপ করতে সক্ষম হতে চায়

সমাধান :

নেটওয়ার্কম্যানেজারটি ব্যবহার করা আরও মার্জিত বলে মনে হচ্ছে এবং এটি যেভাবে dnsmasqনকশাকৃত হয়েছে তাতে এটি বন্দী উদাহরণ।

  1. ডকারকে আপনার dnsmasqউদাহরণটি ডিএনএসের জন্য ব্যবহার করতে বলুন

    • /etc/docker/daemon.jsonডিএনএসের জন্য docker0ব্রিজ অ্যাডাপ্টার ব্যবহার করতে ডকারকে বলতে ফাইল যুক্ত বা সম্পাদনা করুন

      {
        "dns": ["172.17.0.1"]
      }
      
  2. dnsmasqডকার ব্রিজগুলি শুনতেও এনএম উদাহরণটি কনফিগার করুন, কারণ ডিফল্টরূপে এটি কেবল 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আপনার ডোমেনের জন্য যথাযথভাবে ডিএনএস অনুরোধকে নির্দেশ করতে একটি কনফিগার ফাইল যুক্ত করুন - ফাইল যুক্ত করুন et /etc/NetworkManager/dnsmasq.d/vpn-dns.conf

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • Allyচ্ছিকভাবে, আপনার ডোমেনের জন্য একটি অনুসন্ধান ডোমেন যুক্ত করুন যাতে আপনি সংক্ষিপ্ত নাম ব্যবহার করতে পারেন

      • আমি স্রেফ আমার ডিফল্ট নেটওয়ার্ক সংযোগে অনুসন্ধানের তালিকায় আমাদের স্থানীয় ডোমেন যুক্ত করেছি
  4. নেটওয়ার্ক ম্যানেজার এবং ডকার পুনরায় চালু করুন

    sudo service network-manager restart
    sudo service docker restart
    

nslookupআপনার ভিপিএন এর ভিতরে এবং বাইরে উভয় ডোমেনের জন্য এই মুহুর্তে আপনার ডকারের পাত্রে আপনি ভিপিএন থাকাকালীন সমস্যা ছাড়াই সক্ষম হবেন ।


1
একটি ছোট সাম্প্রতিক কৌতুক যা ডকার0 ব্রিজ আইপি-র হার্ড-কোডিংয়ের সাথে জড়িত না হ'ল শ্রোতা-ঠিকানার নির্দেশের পরিবর্তে ইন্টারফেস ব্যবহার করা উচিত: ইন্টারফেস = ডকার0
সিউইড

অসাধারণ ব্যাখ্যা এবং নির্দেশাবলী। A +1 ভালভাবে প্রাপ্য।
14-15

চিয়ার্স @ সিমনউইডুউগে - আমি আপনার পরামর্শটি অন্তর্ভুক্ত করেছি - আপনি সেই ক্ষেত্রে ওয়াইল্ডকার্ডগুলিও ব্যবহার করতে পারেন তাই আমি অ-ডিফল্ট নেটওয়ার্কগুলি দ্বারা ব্যবহৃত সমস্ত সেতুর নামগুলির জন্য একটি প্যাটার্ন যুক্ত করেছি (কমপক্ষে, ডকার-রচনা দ্বারা ব্যবহৃত হিসাবে)।
অ্যাড্রিয়ান

1
দেখে মনে হচ্ছে ডিমন.জসনের ডিএনএস মানটি একটি অ্যারে হতে হবে, অন্যথায় আমি একটি ত্রুটি পেয়েছি: cannot unmarshal string into Go value of type []stringডকার পরিষেবাটি পুনরায় চালু করার সময়।
স্লেভেন রেজিক

বায়োনিকের জন্য আপডেট: 18.04 আর ডিএনএসের জন্য নেটওয়ার্ক ম্যানেজার দ্বারা পরিচালিত ডিএনএসমাস্কের বন্দী দৃষ্টান্ত ব্যবহার করে না এবং এর পরিবর্তে সিস্টেমেড-সলিউড ব্যবহার করে; যা এটি নিজস্ব সমস্যা নিয়ে আসে, কারণ ডকার0 ব্রিজটি শুনতে এটি কনফিগার করা যায় না। আমি এটিকে অক্ষম করার জন্য, এবং নেটওয়ার্কম্যানেজার dnsmasq পুনরায় ইনস্টল করে সঠিকভাবে কনফিগার করেছিলাম।
অ্যাড্রিয়ান

2

আমি এখানে আমার উবুন্টু 14.04 সার্ভারে মাথাবিহীন চলতে কীভাবে ডকার সেট আপ করব।

আমি নিম্নলিখিত ডকার সংস্করণ ইনস্টল করে উবুন্টু সার্ভার 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 এ সংক্ষিপ্ত করে আমার স্থানীয় ডিএনএস সার্ভার যুক্ত করেছি:

# 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

ধারক শুরু করার সময় কোনও ডিএনএস বার্তা নেই।

একটি নতুন ধারক শুরু হয়েছে, ডিএনসটিল ইনস্টল করা হয়েছে।

রান ডিগ এবং সার্ভার বার্তা সঠিক স্থানীয় ডিএনএস সার্ভার।


0

আমার একটি অনুরূপ সমস্যা ছিল, এটি স্ট্যাকওভারফ্লোতে রিপোর্ট করেছে । দেখা যাচ্ছে যে আমি 8.8.8.8ডকারের ডিফল্ট উবুন্টু ইনস্টলেশনটিতে উল্লিখিত নেমসারভারটি জিজ্ঞাসা করতে পারিনি ; তবে, আমি এটি পিং করতে পারে। এই ক্ষেত্রে, একটি ডিএনএস সার্ভার ব্যবহার করুন যা আপনি আসলে জিজ্ঞাসা করতে পারেন। সঙ্গে পরীক্ষা

nslookup - dns.server.name

এবং মাধ্যমে ধারক শুরু করুন

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

একটি স্বয়ংক্রিয় সমাধান সমাধান করার জন্য https://askubuntu.com/q/607172/30266 এর জন্য আমার এখনও কোনও উপায় খুঁজে পাওয়া যায়নি ।


আমার উত্তরটি আপনার পক্ষে যথেষ্ট স্বয়ংক্রিয় হতে পারে ...
অ্যাড্রিয়ান

0

হোস্টের স্থানীয় ডিএনএস রিসলভার (উদাহরণস্বরূপ dnsmasq) আপনার ডকারের পাত্রে যদি তারা কোনও ব্যবহারকারী সংজ্ঞায়িত নেটওয়ার্কে থাকে তবে আপনি এটি ব্যবহার করতে পারেন । যে ক্ষেত্রে একটি ধারক এর /etc/resolv.confনেমসার্ভারটি থাকবে 127.0.0.11(ওরফে Docker এর এমবেডেড DNS সার্ভার ), সঠিকভাবে হোস্টের লুপব্যাক ঠিকানায় 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 + প্রয়োজন )।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.