docker.io DNS çalışmıyor, 8.8.8.8 kullanmaya çalışıyor


33

Yeni bir Ubuntu 14.04 kurulumum var ve 12.04 gerektiren eski eşyalarımı çalıştırmak için Docker'ı kullanmak istiyorum. Docker içindeki DNS çalışmıyor.

Dizüstü bilgisayarımın resolv.conf dosyası şuna benzer:

nameserver 127.0.0.1

Bu görünüşe göre Docker ile çalışmıyor. Bu nedenle, isim sunucularını 8.8.8.8 ve 8.8.4.4 olarak ayarlamaya çalışır; ben yaparken

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

Diyor ki:

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]

Ve tabii ki, Docker örneğinin içinde resolv.conf şöyle görünür:

nameserver 8.8.8.8
nameserver 8.8.4.4

İkisini de Docker örneğinin içinden başarıyla pingleyebiliyorum. Ancak, DNS yok (örn ping google.com. Başarısız).

Docker'ın içindeki ifconfig çıkışı:

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)

Şimdi ne olacak?

Yanıtlar:


23

Ubuntu Docker paketi systemd kullanarak güncellendiğinde, /etc/default/dockerconfig dosyası için destek bıraktı , bu yüzden rocketman10404 tarafından önerilen ilk çözüm artık işe yaramayacak (devre dışı bırakma dnsmasqhala işe yarayacak, ancak Ubuntu'nun DNS sunucusunu otomatik olarak güncellemesini önlemenin dezavantajı var) .

Yeni daemon.jsonyapılandırma dosyasında düzeltme

Ağınızın DNS sunucusunu bulun:

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

Varsa, açın veya oluşturun /etc/docker/daemon.jsonve ExecStartsatıra DNS ayarları ekleyin :

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

Liman işçisi arka plan programı yeniden başlatın:

$ sudo service docker restart

Ayrıntılı bir blog yazısı yazdım ve daha fazla ayrıntı istiyorsanız, bu konuda bir hata bildirdim .

(Başlangıçta / lib/systemd/system/docker.service dosyasını açıp ExecStart satırına DNS ayarları ekleyerek çözdüm , ama bu kötü - systemd dosyalarını doğrudan düzenlememeliyiz .)


Çözümünüz için teşekkürler - benim çözümüme aldığım yolda yardımcı oldu - bu benim kendi koşullarım ve Docker'ı Ubuntu'da (veya NetworkManager + dnsmasq kullanan diğer masaüstü dağıtımları) çalıştırmanın özellikleri için biraz daha zarif bir eşleşme olduğunu düşünüyorum.
Adrian

16

Docker'ı kendim kullanmıyorum, bu yüzden normalde burada bir docker sorusu ile uğraşmazdım, ama ben sadece bu konuyu okuyordum ve bu sorunu çözecek gibi görünen bazı docker belgelerine rastladım . Sonuç olarak...

Belgeler birkaç geçici çözüm önerir. Bunlardan ilki, aşağıdaki satırı ekleyerek konteynerler için liman işçisi arka planında kullanılacak DNS sunucusunu belirlemektir /etc/default/docker:

docker_OPTS="--dns 8.8.8.8"

Sağlanan DNS, 192.168.1.1 (ağ geçidi) gibi yerel bir DNS sunucusu olabilir. Ardından, ile yeniden başlatın

sudo restart docker

Alternatif bir çözüm, ağ yapılandırmasında dnsmasq öğesinin devre dışı bırakılmasını içerir /etc/NetworkManager/NetworkManager.conf:

#dns=dnsmasq

sonra ikisini de yeniden başlatın

sudo restart network-manager
sudo restart docker

3
dnsmasq'ı devre dışı bırakmak benim için çalıştı.
bennyl

2
Bu ikinci yaklaşım elbette ağ yöneticisinin dnsmasq'ı kontrol edemeyeceği anlamına gelir, yani örneğin bir VPN'ye geçiş de dahil olmak üzere ağ değiştirdiğinizde dns sunucunuzu değiştiremeyeceği anlamına gelir. Eski yaklaşım benim için daha iyi görünüyor, ancak dock IP’yi (172.17.0.1) dinleyen dnsmasq’ın da dinlemesini istiyorum, böylece docker ana bilgisayarlarını o noktaya varabilirim.
mc0e

1
Ubuntu Docker'ı sytemd ile kurmaya geçtiğinden, /etc/default/dockerartık bir etkisi kalmadı. Bkz benim çözüm sonrası init.d / sonradan görme dünyada bu çözmek için nasıl.
Robin Winslow

/etc/NetworkManager/NetworkManager.confUbuntu 18.04 LTS'de mevcut değil. : /
XtraSimplicity

Bazı Ubuntu 18.04 kurulumlarında (örn. Amazon'daki en az görüntü) systemd-resolvedvarsayılan olarak önbellekleme yapan bir DNS sunucusu olarak davrandığını ve WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.sorunu tetikleyeceğini unutmayın (Ubuntu 16.04 kurulumları varsayılan olarak etkin görünmüyor). Çözüm, ana cevapta belirtildiği gibi kabı başlatırken seçeneği devre dışı bırakmak systemd-resolvedveya kullanmaktır --dns.
Anon

9

Özel olarak benim durumumda bu koştum

  • Yerel geliştirme makinemde Docker konteynerlerini çalıştırma
  • VPN'e bağlı olan
  • Bizim konteyner yapı komut bazıları vadede gibi şeyler npm installözel deposundan VPN üzerinde konteynerin içinde.
    • Bu, bir CI boru hattından çalışır ancak geliştirici makinelerimizden npmçalışmaz , çünkü başarılı bir DNS araması yapamazsınız
    • Ayrıca, harici REST API'lerini çağırmak için arama yapmanız gereken kaplarda da sorun yaşadık.

Varsayılan olarak Ubuntu, dnsmasqDNS isteklerini önbelleğe almak için NetworkManager tarafından başlatılır ve /etc/resolv.confbu örneğe işaret edecek şekilde yapılandırılır .127.0.1.1

  • Kullandığımız VPN istemcisi NetworkManager uyumlu değil /etc/resolv.confve NetworkManager yapılandırmasının üzerine yazması gereken
  • Bu VPN için DNS sunucularını yapılandırır.
  • Docker /etc/resolv.confvarsayılan olarak kabınıza gölge
    • Genellikle Ubuntu'da, Google DNS sunucularını kaba aktarır (çünkü dnsmasqdurumu biliyordur) .
    • Ancak VPN DNS sunucusu yapılandırmasını kaba aktarmak mutludur
    • docker0Ağ köprüsündeki kaptan VPN tap0bağdaştırıcısı üzerinden DNS sunucularına giden bir yol yoktur .
  • Ergo, kaptaki tüm DNS aramaları başarısız oluyor çünkü sağladığı tek DNS sunucularına ulaşamıyor
  • Ayrıca, bazı ağlar tüm DNS aramalarınızı sorgulayabilmek istediklerinden Google DNS sunucularına gelen istekleri engeller.

Çözüm :

NetworkManager'ı kullanmak daha zarif gibi görünüyor ve esası eskisi dnsmasqgibi tasarlandı.

  1. Docker'a dnsmasqörneğinizi DNS için kullanmasını söyleyin

    • /etc/docker/daemon.jsonDocker'a docker0DNS için köprü adaptörünü kullanmasını söylemek için dosya ekleyin veya düzenleyin

      {
        "dns": ["172.17.0.1"]
      }
      
  2. NM dnsmasqörneğini Docker köprülerini de dinleyecek şekilde yapılandırın , çünkü varsayılan olarak yalnızca 127.0.1.1 - dosya oluşturur/etc/NetworkManager/dnsmasq.d/docker-bridge.conf

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. Bu VPN istemcisinin kaba davranışlarından hoşlanmıyorum ve yalnızca VPN aramaları için VPN ucundaki DNS'yi kullanmayı tercih ederim (eğer doğru şekilde yapılandırılmış NetworkManager kullanan kibar bir VPN istemciniz varsa) )

    • VPN istemcisindeki DNS özelliğini kapatın ( resolv.confbağlandığında üzerine yazma işlemini durdurur ve şimdi tüm DNS'ler dnsmasqtekrar geçer )
    • dnsmasqEtki alanınız için DNS isteklerini uygun şekilde yönlendirmek için bir yapılandırma dosyası ekleyin - `/etc/NetworkManager/dnsmasq.d/vpn-dns.conf dosyasını ekleyin.

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • İsteğe bağlı olarak, kısa adlar kullanabilmeniz için alanınız için bir arama alanı ekleyin

      • Yerel etki alanımızı, varsayılan ağ bağlantımdaki arama listesine ekledim.
  4. NetworkManager ve Docker'ı yeniden başlatın

    sudo service network-manager restart
    sudo service docker restart
    

Bu noktada, Docker konteynerlerinizin nslookupVPN'de iken, VPN'inizin içindeki ve dışındaki alanlar için sorunsuzca yapması gerekir .


1
Docker0 köprüsünün IP kodunu zorlamayan küçük bir ayar, dinleme adresi yönergesi yerine arabirim kullanmaktır: interface = docker0
siwyd

Müthiş açıklamalar ve talimatlar. Hak ettiği bir + 1.
17'de

Cheers @simonwydooghe - Önerinizi ekledim - bu alanda joker karakterler de kullanabilirsiniz, böylece varsayılan olmayan ağlar tarafından kullanılan köprü adları için bir kalıp ekledim (en azından docker-compose tarafından kullanıldığı gibi).
Adrian

1
Görünüşe göre daemon.json içindeki dns değeri bir dizi olmalı, yoksa bir hata alıyorum: cannot unmarshal string into Go value of type []stringliman işçisi hizmetini yeniden başlatırken.
Slaven Rezic

Bionic Güncellemesi: 18.04, artık DNS için NetworkManager tarafından yönetilen tutulan bir dnsmasq örneği kullanmıyor ve bunun yerine systemd-resolved kullanıyor; Bu da kendi sorunlarını getiriyor çünkü docker0 köprüsünü dinlemek için yapılandırılamaz. Devre dışı bırakmak ve NetworkManager dnsmasq'ı yeniden kurmak ve doğru şekilde yapılandırmak için başvurdum.
Adrian,

2

Başsız çalışan Ubuntu 14.04 sunucumda docker'ı nasıl ayarlayacağım.

Ubuntu sunucusu 14.04'ü aşağıdaki docker sürümü yüklüyken çalıştırıyorum.

#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 dosyası ve script aşağıdaki satırı içerir:

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

Yukarıdaki cevap yukarıdaki dosyayı bulmama yardım etti.

Aşağıdakileri /etc/default/docker.io adresinde yayınladım ve yerel DNS sunucumu ekledim:

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

Hizmeti şu şekilde yeniden başlattınız:

sudo service docker.io restart

Ran docker run <image> /bin/bash

Konteyneri başlatırken dns mesajı yok.

Yeni bir kap başlatıldı, dnsutils kuruldu.

Kazmak ve sunucu mesajı doğru yerel DNS sunucusudur.


0

Benzer bir sorun yaşadım, StackOverflow'a bildirdim . 8.8.8.8Docker'ın varsayılan Ubuntu kurulumunda belirtilen ad sunucusunu sorgulayamadığım anlaşılıyor; ancak ping yapabildim. Bu durumda, sorgulayabileceğiniz bir DNS sunucusu kullanın. İle test et

nslookup - dns.server.name

ve kabı,

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

Otomajik bir çözüm elde etmek için https://askubuntu.com/q/607172/30266 adresine bir yol bulamadım .


Cevabım sizin için yeterince otomatik olabilir ...
Adrian

0

Kullanıcı tanımlıdnsmasq bir ağdaysa , ana makinenin yerel DNS çözümleyicisini (örneğin ) Docker kapsayıcınızdan kullanabilirsiniz . Bu durumda, bir kapsayıcı , DNS isteklerini, sunucunun geridöngü adresine doğru bir şekilde iletebilen ad sunucusuna (diğer bir deyişle Docker'in yerleşik DNS sunucusu ) sahip olacaktır./etc/resolv.conf127.0.0.11

$ 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    

Kullanırsanız docker-compose, kaplarınız için otomatik olarak özel bir ağ kurar ( v2 + dosya biçiminde ). Ancak, docker-composekullanıcı tanımlı bir ağda kaplar çalıştırırken, bunları varsayılan ağda oluşturduğunu unutmayın . Yapılar için özel bir ağ kullanmak için network, yapı yapılandırmasında parametreyi belirleyebilirsiniz ( v3.4 + dosya formatını gerektirir ).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.