Docker kapsayıcılarının içinde internet bağlantısı yok


25

Herhangi bir Docker kapsayıcısının içinde internet bağlantısı gerektiren herhangi bir komutu yürütemiyorum.

İşler:

docker run ubuntu /bin/echo 'Hello world'

Çalışmıyor:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

İle benzer pipve ping.

Ubuntu 16.04 kullanıyorum ve güvenlik duvarı veya şirket proxy sunucusu kullanmıyorum ve Docker'ı yeniden başlatmayı denedim.

gnc:

Etkileşimli modda güncelleme aynı şekilde başarısız olur.

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update ana bilgisayarda başarıyla çalışır, yani docker dışındaki bilgisayarımda.

Upd Docker sürüm 1.12.1, yapı 23cf638


Ana bilgisayardan bir alana ping atabilir misiniz? apt-get updateDocker ile etkileşimli moddayken koşabilir misiniz ?
adampski

çıktı şu hatayı gösterir: 'archive.ubuntu.com' çözümlenirken geçici hata oluşuyor ... deneyin .. ping www.google.com .. aynı yanıtı alıp almadığınızı görün .. sonra deneyin ... ping 8.8.8.8 .. IP çalışıyorsa ve ana bilgisayar adı
DNS'iniz bozulmazsa

@adampski, önerilerinize göre soruyu güncelledim.
Sashko Lykhenko

@ TG2, sorunuzu önerilerinize göre güncelledim.
Sashko Lykhenko

Docker motorunun hangi sürümünü kullanıyorsunuz?
adampski

Yanıtlar:


15

Docker için 866 numaralı GitHub sayısında creack tarafından önerildiği gibi :

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

"Liman işçisini köprüyü yeniden oluşturmaya ve tüm ağ kurallarını yeniden başlatmaya zorlayacak"


1
Denedim ve bu, tüm bilgisayarımdaki ağı öldürüyor.
petersohn

Bu yardımcı oldu ve sorunu benim için çözdü. Teşekkür ederim.
Rao

10
-dBayrak çıkmamalı.
Luís de Sousa

2
Merhaba @ LuísdeSousa Bu oyu size bir utanç ama yeni sürümlerde belki bazı anahtarların kaldırılması veya değiştirilmesi olasılığını düşünün. Özellikle bu bir yıldan uzun bir süre önceydi.
adampski

3
komutu kopyalamak / geçmek yerine bunların ne anlama geldiğini açıklayabilirsiniz :)
Adelin

12

StackOverflow'da , Ubuntu 16.04'te Docker 17.09 ile farklı bir çözümün bu sorunu çözdüğü benzer bir sorun var :

İçeriğini kontrol edin resolv.conf:

$ cat /etc/resolv.conf

Bunun gibi bir satır içeriyorsa nameserver 127.0.1.1, kaplar yanlış ad sunucusu alıyor demektir. Bunu düzeltmek için NetworkManager.confdosyayı düzenleyin :

$ sudo pico /etc/NetworkManager/NetworkManager.conf

Ve ile satır yorum dns=dnsmasq; dosya şöyle görünmelidir:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

Son olarak, ağ yöneticisini yeniden başlatın:

$ sudo systemctl restart network-manager

Kabı tekrar test edin:

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]

Yüklemem açıklama ile eşleşti ve yukarıdaki yaklaşım benim için sorunu çözdü.
krcools

Ubuntu 18.04 için güncellenmiş cevap: superuser.com/a/1335054
wisbucky

7

Check ilk şey çalıştırılır cat /etc/resolv.confiçinde liman işçisi kap . Geçersiz bir DNS sunucusu varsa, örneğin nameserver 127.0.x.x, kapsayıcı etki alanı adlarını ip adreslerine çözümleyemez, bu nedenle ping google.combaşarısız olur.

Check İkinci şey çalıştırılır cat /etc/resolv.confüzerinde ana makinede . Docker temel olarak /etc/resolv.confbir kap her başlatıldığında ana makineyi kapsayıcıya kopyalar . Yani ana bilgisayarın /etc/resolv.confyanlışsa, docker kapsayıcısı da öyle olacaktır.

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

  1. Daemon.json içinde DNS sunucusunu sabit kodlayın. Bu kolaydır, ancak DNS sunucusunun değişmesini bekliyorsanız ideal değildir.

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


1. docker daemon.json'da sabit kod DNS sunucusu

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

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

  • Artık bir kapsayıcı çalıştırdığınızda / başlattığınızda, docker öğesinin /etc/resolv.confdeğerleriyle doldurulur daemon.json.


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

A. Ubuntu 16.04 ve öncesi

  • Ubuntu 16.04 ve öncesi için /etc/resolv.confNetworkManager tarafından dinamik olarak oluşturuldu.

  • İçindeki satırı dns=dnsmasq(a ile #) yorumlayın /etc/NetworkManager/NetworkManager.conf

  • Yeniden oluşturmak 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 kullanılacak şekilde değiştirildi . Şimdi varsayılan olarak yerel bir DNS önbelleği 127.0.0.53 kullanıyor. Bu bir kapsayıcı içinde çalışmaz, bu nedenle Docker varsayılan olarak Google'ın 8.8.8.8 DNS sunucusunu kullanır ve bu da bir 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) 'e işaret eden bir symlink ( ) yöntemidir.

  • Symlink'i /run/systemd/resolve/resolv.conf, gerçek DNS sunucularını listeleyen şu noktaya çevirmeniz yeterlidir :
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

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

Artık /etc/resolv.conf, docker'ın kapsayıcılara kopyalaması için ana bilgisayarda geçerli bir değeriniz olmalıdır.

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.