Liman işçisi kapları, Ubuntu 14.04 Desktop Host'ta DNS'i çözemez


48

Ubuntu 14.04 LTS'deki Docker konteynerlerimle ilgili bir sorunla karşılaşıyorum. Docker iki gün boyunca iyi çalıştı ve sonra birdenbire konteynerlerimdeki tüm ağ bağlantısını kaybettim. Aşağıdaki hata çıktısı, başlangıçta apt-get'in DNS'yi IPv6 aracılığıyla çözmeye çalıştığı için inanmamı sağladı.

Ana makinemde IPv6'yı devre dışı bıraktım ve hala tüm görüntüleri kaldırdım, taban ubuntunu çektim ve hala sorunla karşılaştım.

/Etc/resolve.conf nameservers'ımı yerel DNS sunucumdan Google'ın genel DNS sunucularına değiştirdim (8.8.8.8 ve 8.8.4.4) ve hala şansım olmadı. DNS’i / etc / default / docker ve yeniden başlatılan docker’ın DOCKER_OPTS’inde de Google’a ayarlıyorum.

Ayrıca coreos çekmeyi denedim ve yum DNS'yi de çözemedi.

Garip çünkü DNS çalışmazken, apt-get 'in çözemediği aynı güncelleme sunucularına ping işlemi yaparken hala bir yanıt alıyorum.

Proxy'nin arkasında değilim, çok standart bir yerel ağdayım ve Ubuntu'nun bu sürümü güncel ve yeni (docker'a daha yakın olmak için iki gün önce yükledim).

Bunu stackoverflow ve github konularındaki diğer yayınlar aracılığıyla iyice araştırdım, ancak herhangi bir çözüm bulamadım. Bu sorunun nasıl çözüleceğine dair fikirlerim dışında, biri yardımcı olabilir mi?

Hata mesajı

➜  arthouse git:(docker) ✗ docker build --no-cache .
Sending build context to Docker daemon 51.03 MB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> 5506de2b643b
Step 1 : RUN apt-get update
 ---> Running in 845ae6abd1e0
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease   
Err http://archive.ubuntu.com trusty-proposed InRelease  
Err http://archive.ubuntu.com trusty Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.

Konteyner IFCONFIG / PING

➜  code  docker run -it ubuntu /bin/bash
root@7bc182bf87bb:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:04  
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:738 (738.0 B)  TX bytes:648 (648.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:65536  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)

root@7bc182bf87bb:/# ping google.com
PING google.com (74.125.226.0) 56(84) bytes of data.
64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 ms
root@7bc182bf87bb:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=21.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms

Ayrıca, IPv4'ü zorladığımda apt-get update başarısız oluyor:

root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=true
Err http://archive.ubuntu.com trusty InRelease

Err http://archive.ubuntu.com trusty-updates InRelease

Err http://archive.ubuntu.com trusty-security InRelease

Err http://archive.ubuntu.com trusty-proposed InRelease

Err http://archive.ubuntu.com trusty Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  

Benim için, yeniden başlattıktan sonra çalıştı.
ssi-anik

Yanıtlar:


63

Woo, sorunumu çözen bir github yazısı buldum.

Steve K. bunun aslında bir DNS sorunu olmadığını ve bir bağlantı sorunu olduğunu belirttikten sonra, bu sorunu nasıl çözeceğimi açıklayan bir github yazısı bulabildim .

Görünüşe göre docker0 ağ köprüsü kapatıldı. Bridge-utils kurulumu ve aşağıdakilerin çalıştırılması Docker'ımı çalışır durumda tutuyor:

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart

1
resimlerinizi yeniden asılmanıza gerek yok. resolv.conf, her yeni konteyner çalıştırdığınızda üretilir. bu yüzden eski kabı çıkarmanız ve bir başkasını başlatmanız gerekir. Dün bu problemden korktum. Ayrıca, şirket intranetindeyseniz --dns-search = your.company.domain öğesini, --dns --dns bayraklarının yanındaki DOCKER_OPTS env değişkenindeki / etc / default / docker içindeki docker daemon'a geçirebilirsiniz.
Alexander.Iljushkin

Bu, liman işçisi sorunlarımı da düzeltti.
BobMcGee

3
Linux linux ip link set down docker0yerine ifconfig docker0 downve systemctl restart dockeryerine gerekli service docker start. Tüm görüntüleri silmek için yaptımdocker rmi $(docker images -q)
meshy

Bu benim için ilk kez çalıştı. Sonra yeniden başlattım ve sorun yeniden ortaya çıktı: bu adımları tekrarlamak sorunu tekrar çözmedi. Bunun ne olduğu hakkında hiçbir fikrim yok.
user626921

1
Sadece docker0 arayüzümün kapalı olduğunu gördüm, idam /etc/init.d/docker restartettim ve işe geri döndüm
lolesque

14

Bir DNS çözümleyici sorunu ise, çözüm şu:

Kontrol etmek ilk şey çalıştırılır cat /etc/resolv.confiçinde liman işçisi kap . Bunun gibi geçersiz bir DNS sunucusuna nameserver 127.0.x.xsahipse, kapsayıcı etki alanı adlarını ip adreslerine çözemez ve bu nedenle ping google.combaşarısız olur.

Kontrol etmek İkinci şey çalıştırılır cat /etc/resolv.confüzerinde ana makinede . Docker, /etc/resolv.confbir konteyner başlatıldığında her zaman ana makinenin kabına kopyalar . Eğer ana bilgisayar /etc/resolv.confyanlışsa, o zaman liman işçisi konteyner olacaktır.

Ana bilgisayarın /etc/resolv.confyanlış olduğunu tespit ettiyseniz, 2 seçeneğiniz vardır:

  1. DNS sunucusunu daemon.json'da kodlayın. DNS sunucusunun değişmesini düşünüyorsanız, bu kolaydır, ancak ideal değildir.

  2. Ana bilgisayarları düzelt /etc/resolv.conf. Bu biraz daha zor, ancak dinamik olarak üretiliyor ve DNS sunucusunu kodlamıyorsunuz.


1. Docker daemon.json'da Hardcode DNS sunucusu

  • Düzenle /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Bu değişikliklerin etkili olması için liman işçisi arka planını yeniden başlatın:
    sudo systemctl restart docker

  • Şimdi bir kabı çalıştırdığınızda / başlattığınızda, liman işçisi /etc/resolv.confdeğerleri ile doldurur daemon.json.


2. Ana bilgisayarları düzeltin /etc/resolv.conf

A. Ubuntu 16.04 ve öncesi

  • Ubuntu 16.04 ve önceki sürümler için, /etc/resolv.confdinamik olarak NetworkManager tarafından üretildi.

  • Çizgiyi yorumlayın dns=dnsmasq(a ile #) içinde /etc/NetworkManager/NetworkManager.conf

  • Yenilemek için NetworkManager'ı yeniden başlatın /etc/resolv.conf:
    sudo systemctl restart network-manager

  • Ana bilgisayarda doğrulayın: cat /etc/resolv.conf

B. Ubuntu 18.04 ve üstü

  • Ubuntu 18.04 systemd-resolvedüretmek/etc/resolv.conf için kullanmak üzere değiştirildi . Şimdi varsayılan olarak yerel bir DNS önbelleği 127.0.0.53 kullanır. Bu bir kapsayıcı içinde çalışmaz, bu nedenle Docker varsayılan olarak Google'ın 8.8.8.8 DNS sunucusuna döner; bu da güvenlik duvarının arkasındaki insanlar için kırılabilir.

  • /etc/resolv.confaslında Ubuntu 18.04'te varsayılan ls -l /etc/resolv.confolarak /run/systemd/resolve/stub-resolv.conf(127.0.0.53) işaret eden bir sembolik link ( ) 'dir .

  • Sadece /run/systemd/resolve/resolv.confgerçek DNS sunucularını listeleyen işaretini işaretleyin.
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Ana bilgisayarda doğrulayın: cat /etc/resolv.conf

Şimdi /etc/resolv.confana makinede docker'ın kaplara kopyalaması için geçerli bir sürümün olması gerekir .


Bunun için teşekkürler, liman işçisi konteynırları ile neler olup bittiğini ve bir VPN'de IP’lerin 18.04 çözülmesini anlamaya çalışırken aklımı kaybediyordum. 18.04 için /etc/resolv.conf düzeltmesi benim için çalıştı!
George Papas

B seçeneği benim için çalıştı ..
codeSetter

Tabii ki 2B systemdpaketin bir güncellemesinden kurtulacak ...
Auspex

13

Aynı zamanda yaşadığım bir konuya değer katmak için; alternatif bir cevapla:

Ağım ofisle ilgiliydi ve Google DNS ayarları engellendi, böylece konteyner IP adreslerine ping atabildi, ancak etki alanı adları yoktu.

Ev sahibim /etc/resolv.confaslında benziyordu;

#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search companyDomain.co.za

Bunun nedeni, Ağ Yöneticisi'nin bir tür DNS sunucusu ayrıntılarını maskelemesidir.

Maalesef liman işçisi kılavuzlarına göre liman işçisi konteynerin resolv.conf dosyasını oluştururken yerel ana bilgisayar IP adreslerini filtreleyecek ve bunları Google'ın DNS IP'leriyle değiştirecektir. Benim durumumda bu alan adlarının sınırsız olmasına neden oldu.

Yapmak zorundaydım:

  • Beni /etc/default/dockervarsayılana sıfırla , böylece kapsayıcılar ana bilgisayarımın resolv.conf içeriğini kullanır.
  • Düzenleyin /etc/NetworkManager/NetworManager.confve satırı dışında Açıklama dns=dnsmasq. Böylece NM, 127.0.0.1 yerine gerçek DNS IP adreslerini belirleyebilir.
  • NM ile yeniden başlatın sudo service network-manager restart.
  • Liman işçisi hizmetini yeniden başlatın sudo service docker restart.

apt-get update/upgradeÖrneğin bir kabın çalıştırılması örneğin yapmasına izin verir .


3
Bu aslında benim için çalıştı. Ve şirket intranetinin arkasındaydım
Daniel Andrei Mincă

1
Bu çözüm Ubuntu 16.04 ve önceki sürümler için mükemmeldir. Ubuntu 18.04 ve daha yeni sürümler, bkz serverfault.com/a/918568
wisbucky

Teşekkürler! Bu çalıştı, kabul edilen cevap vermedi. :)
Devolus

8

Senin hatan burada:

 Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19).
 connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]

Bu, DNS ile ilgili bir hata değildir, bunun yerine sisteminiz IPv6 ana bilgisayarlarına bağlanmaya çalışıyor ve başarısız oluyor. Muhtemelen, ana makinenize IPv6 erişiminiz olmadığı için. IPv6 adresinin gerçek araması başarılı. (Ubuntu aynası / arşivi hem IPv6'da hem de IPv4'te kullanılabilir. Sisteminizin çalışması gerektiğine inandığı için IPv6'ya çarpacak kadar şanssızdınız.)

Miredo kurarak ya düzeltmeli ya da bir IPv4 aynasına çarpana kadar tekrar denemelisin .

Yine burada gerçekleştirilmesi gereken önemli şey, kendi ping testlerinizle görebileceğiniz gibi, DNS'in suçlamadığıdır.


1
Hızlı cevap ve aslında bir DNS sorunu olmadığını açıklığa kavuşturduğun için teşekkür ederim. Ben miredo kurdum - gitme. Ayrıca apt-get update komutunu çalıştırdığımda -o Acquire :: ForceIPv4 = true apt-get update komutunun hala başarısız olduğunu, orijinal yazımı bu yanıtla güncellediğimi fark etmemde fayda var. UFW’yi düşünerek etkisizleştirmeyi denedim, belki de durum buydu ve hala şansım olmadı.
Thomas V.

Garip - ping'in başarılı olması nedeniyle IPv4 bağlantınız olduğunu görebilirsiniz. Ancak aynaya bağlanamazsınız, bazı tuhaf yönlendirme / ağ sorunlarınız varsa (burada neden yayınlıyorsunuzdur sanırım!)

8

Docker resmi dokümanı , Docker tarafından kullanılmak üzere bir DNS sunucusu yapılandırmak için araçlar sunar

  1. /etc/default/dockerDüzenlemek için dosyayı açın :

    sudo nano /etc/default/docker
    
  2. Docker için bir ayar ekleyin:

    DOCKER_OPTS="--dns 8.8.8.8"
    
  3. 8.8.8.8Yerel bir DNS sunucusuyla değiştirin 192.168.1.1. Ayrıca birden fazla DNS sunucusu da belirleyebilirsiniz. Bunları boşluklarla ayırın, örneğin:

    --dns 8.8.8.8 --dns 192.168.1.1
    

    Uyarı: Bunu, çeşitli ağlara bağlanan bir dizüstü bilgisayarda yapıyorsanız, ortak bir DNS sunucusu seçtiğinizden emin olun.

    PS: nm-toolyerel ana DNS sunucusunu kontrol etmek için kullanılabilir

  4. Dosyayı kaydedin ve kapatın.

  5. Docker cini yeniden başlatın.

    sudo service docker restart
    

Bunun Docker Upstart ve SysVinit için eski config dosyasının olduğuna dikkat edin. Systemd için geçerli yol (Ubuntu 16.04'ten beri), dns gibi /etc/docker/daemon.jsondocker daemon ayarları için kullanmaktır .
WISBucky

0

Boot2docker'ı kullanırken buraya gelen diğer okuyucular için, işte bunu nasıl düzelttim. Aslında, yukarıdaki cevap beni doğru yöne işaret etti.

Temel olarak, bazı nedenlerden dolayı boot2docker içindeki kaplar ana bilgisayar adlarını çözemedi.

Bu yüzden boot2docker'ı yeniden başlattım ve kapları başlattım. Artık ana bilgisayar adları tekrar doğru şekilde çözülebilir.

Sanırım ana bilgisayardaki ağ bağlıyken boot2docker'ı başlatıyor ve bu da boot2docker'ın çalışmaya başlamasına neden oluyordu.


0

Aynı sorunu Windows'ta da yaşadım. Bu komut benim için çalışmasını sağladı:docker-machine restart


0

Debian9'da Docker cini yeniden başlatın

service docker restart

ve bağlantılar ve ağlar iyi çalışıyor


-1

Benzer bir sorun vardı, ama aynı zamanda Kullanıcı tanımlı bir ağ içindeki kaplar arasında çözüm yapan bir isim de lapa lapa gibi görünüyordu. Bazıları senin gibi hiçbir şeyi çözemedi.

Sorun bir / var / lib / docker'dı. Uzay nedenlerinden dolayı nfs ile monte edildi. Yerel bir dosya sistemi eklemek ve dosyaları oraya taşımak sorunu çözer.


Bir sorunun benzer bir soruya cevap tarafından cevaplanabileceğini düşünüyorsanız, lütfen bu sorunun bir kopyası olarak işaretleyin. Bunu yapamıyorsanız, ayrı bir cevap yapmak yerine yorum bırakmalısınız.
Jenny D,
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.