Docker konteynerinim internet yok


139

Tamamen çalışmasını sağladım ama şimdi durdu. Ben boşuna aşağıdaki komutları denedim:

docker run -dns 8.8.8.8 base ping google.com

docker run base ping google.com

sysctl -w net.ipv4.ip_forward=1 - hem ana bilgisayarda hem de kapta

Tek aldığım şey unknown host google.com. Docker sürüm 0.7.0

Herhangi bir fikir?

PS de ufwdevre dışı


9
Sorunuz sorunumu çözdü: sysctl -w net.ipv4.ip_forward=1(Centos 6'da) çalıştırmak zorunda kaldı
qwertzguy

Docker dns routing ile ilgili sorununuz olabileceğinden, bu benzer çözümü kontrol edin stackoverflow.com/questions/35515203/…
Aditya Kresna Permana

Burada aynı, /etc/resolv.conf'u ana bilgisayar kutusuna sabitledikten sonra, onsuz çalışmayacaksysctl -w net.ipv4.ip_forward=1
Reeebuuk

Ayrıca sizin için doğru değerler olduğunu kontrol /etc/resolv.confüzerinde konak makinesine
Hanxue

sysctl -w net.ipv4.ip_forward=1kaçmak zorunda kaldıktan sonra benim için sudo service docker restart.
Asif Ali

Yanıtlar:


101

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 karmaşıktır, ancak dinamik olarak üretilir ve DNS sunucusunu zor kodlamazsınız.


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 kap ç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.


1
Bu, Docker 17.09 ile Ubuntu 16.04'teki sorunu çözdü.
Luís de Sousa

2
Bu sorunumu çözdü (OP, Ubuntu 14.04 / Docker 18.01.0-ce ile aynı). Bu bağlantı, docker görüntünüzde ping komutu yoksa, ping olmadan yararlı bir test internet bağlantısı olabilir . Ana makineniz yoksa systemctl(Ubuntu 14.04) Ağ hizmetini nasıl yeniden başlatırsınız ? ve / veya bilgisayarınızı yeniden başlatın.
Benjamin

Bir cazibe gibi çalıştı!
Homewrecker

1
Bu Ubuntu 18.04 (seçenek B) üzerinde çalışır. Ancak docker şu anda /etc/resolv.confinşaattaki konteynere transfer etmedi , dosyayı konteynere manuel olarak kopyalamak zorunda kaldım.
glaux

1
Makinemde (RedHat 7.4) ana bilgisayarın yapılandırma dosyası doğru, ancak kaplar dosyası hala 172.0.0.11'i gösteriyor. Peki şimdi ne yapmalı?
Martin Majewski

90

Bu tavsiyeye uyarak giderildi:

[...] her şeyi sıfırlamayı deneyebilir misiniz?

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 zorlar

https://github.com/dotcloud/docker/issues/866#issuecomment-19218300

Arayüz bir şekilde 'asıldı' gibi görünüyor.

Docker'ın daha yeni sürümleri için güncelleme:

Yukarıdaki cevap yine de işi sizin için halledebilir, ancak bu cevap gönderildiğinden ve docker şimdi daha cilalı olduğundan uzun bir zaman oldu, bu yüzden iptablesve her şeyle uğraşmadan önce bunları ilk önce denediğinizden emin olun .

sudo service docker restart veya (uptart kullanmayan bir linux dağıtımındaysanız) sudo systemctl restart docker


31
docker -dbaşarısız olur. -dBayrak yok .
Luís de Sousa

1
Hâlâ sorunu olanlar için, Moby'nin github'unda
Nepoxx

1
@Pawan:ip link del docker0
drewrockshard

1
veya köprü-utils yükleyin
cjdcordeiro

5
docker -dyeni sürümlerde mevcut değil. Bunun yerine:, service docker stopsonra dockerd, o zamanservice docker start
Telmo Marques

64

Bağlantı istasyonunu yeniden başlatmanın amaçlanan yolu, manuel olarak yapmak değil serviceveya veya init komutunu kullanmaktır:

service docker restart

5
upstart kullanmayan bir linux dağıtımında iseniz, sudo systemctl restart docker benim için çalıştı
jeffrey

yeniden başlatmak iyi çalıştı. Ben "otomatik başlangıç" ( systemctl enable docker)
Lucas Pottersky

OP'nin sorusuyla alakalı görünmüyor.
Kevin Buchs

Bu tür, çünkü OP'nin tanımladığı durumda, liman işçisini sıfırlamak ağ arabirimlerini yeniden başlatır, böylece internet erişimini yeniden etkinleştirir. Bunun bazen neden kırıldığına değinmediği, ancak soruna bir çözüm sağladığı doğrudur.
bitmask

Ancak üretim ortamında docker'ı yeniden başlatmak imkansızdır. Bu davadaki problem nasıl çözülür?
Suyanhanx

22

Bu soruyu OSX için bir yanıtla güncelleme (Docker Machine kullanarak)

Docker Machine kullanarak OSX'te Docker çalıştırıyorsanız, aşağıdakiler benim için çalıştı:

docker-machine restart

<...wait for it to restart, which takes up to a minute...>

docker-machine env
eval $(docker-machine env)

Sonra (en azından benim deneyimime göre), bir konteynerden google.com'a ping yaparsanız hepsi iyi olacaktır.


Ağ erişiminin tekrar çalışması için pencerelerde de çalıştı.
Mikael Lepistö

1
Bu benim için çalıştı. Üst menü çubuğunda bir docker simgesi var, menüde "yeniden başlat" seçeneğim vardı. Bundan sonra, ağ tekrar iyiydi
olidem

8

Ne yaptığımı bilmiyorum ama bu benim için çalıştı:

OTHER_BRIDGE=br-xxxxx # this is the other random docker bridge (`ip addr` to find)    
service docker stop

ip link set dev $OTHER_BRIDGE down
ip link set dev docker0 down
ip link delete $OTHER_BRIDGE type bridge
ip link delete docker0 type bridge
service docker start && service docker stop

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.18.0.0/16 -j MASQUERADE

service docker start

2
güzel koli bandı!
dctremblay

1
Cevap benzer sorunu çözmenize yardımcı oldu. Bunun için saatler geçirdim! Eksik Kubespray kurulumundan sonra, Docker kapsayıcıları, herhangi bir genel ana bilgisayara veya IP'ye ping işlemi yapmaya çalışırken "Geçici hata çözme" mesajıyla interneti kaybetti. Yani zorunlu olan bu kurala sahip değildim iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE. Bu kurala sahip olup olmadığınızı kontrol edebilirsiniziptables -t nat -L POSTROUTING
laimison

6

Kullanıyordum DOCKER_OPTS="--dns 8.8.8.8"ve daha sonra keşfettim ve konteynerin internete doğrudan erişimi yoktu, ancak kurumsal intranetime erişebiliyordum. DOCKER_OPTSAşağıdakilere geçtim :

DOCKER_OPTS="--dns <internal_corporate_dns_address"

DNS'imizin internal_corporate_dns_addressIP adresi veya FQDN'siyle değiştirme ve

sudo service docker restart

ve sonra benim konteyner yumurtladı ve internet erişimi olduğunu kontrol etti.


5

Benim kaplarımdan biri için bu benim için rastgele gerçekleştiğinde, diğer kaplar iyiyken çok şaşırmıştım. Kapsayıcı en az bir dahili olmayan ağa bağlandı , bu nedenle Composetanımda yanlış bir şey yoktu . VM / docker arka plan programının yeniden başlatılması yardımcı olmadı. Kapsayıcı pingharici bir IP bile sağlayamadığından bu bir DNS sorunu değildi . Benim için çözen, liman işçisini (ağlarını) yeniden oluşturmaktı. Benim durumumda docker-compose down && docker-compose upçalıştı.

Oluştur

Bu, tüm kapların tüm ağlarının yeniden oluşturulmasını zorlar:

docker-compose down && docker-compose up

Sürü modu

Hizmet ağlarını yeniden yaratan hizmeti kaldırdığınızı ve yeniden oluşturduğunuzu varsayalım:

docker service rm some-service

docker service create ...

Kabın ağları harici ise

Bu hizmetin harici ağlarını kaldırın ve yeniden oluşturun:

docker network rm some-external-network

docker network create some-external-network


4

Benim için ev sahibinin güvenlik duvarıydı. Ana bilgisayarın güvenlik duvarında DNS'ye izin vermek zorunda kaldım. Ayrıca, ana bilgisayar güvenlik duvarı ayarını değiştirdikten sonra docker'ı yeniden başlatmak zorunda kaldı.


Veya iptables'ı sudo service iptables stopve sudo chkconfig iptables off(CentOS / RHEL'de) ile devre dışı bırakabilirsiniz .
MichaelZ

4

Proxy ayarlarının eksik olması internet erişimine de neden olamaz . Bu durumda --network hostda çalışmayabilir. Proxy, ortam değişkenleri ayarlanarak yapılandırılabilir http_proxyve https_proxy:

docker run -e "http_proxy=YOUR-PROXY" \
           -e "https_proxy=YOUR-PROXY"\
           -e "no_proxy=localhost,127.0.0.1" ... 

Ayrıca no_proxy ayarlamayı da unutmayın, aksi takdirde tüm istekler (localhost'a olanlar dahil) proxy üzerinden geçer.

Daha fazla bilgi: Archlinux Wiki'deki Proxy Ayarları .


1
Benim için çözüm buydu. Yine de dikkat edin: Proxy ayarlarını yok sayıyor gibi görünen bir wget meşgul kutusu uygulaması olan alp kullanıyordum, bu yüzden ortam değişkenleri ayarlanmış olmanın faydasını görmüyordum.
pelson

Meşgul kutusu ile ilgili ipucu için teşekkürler; Henüz bilmiyordum!
Simon A. Eugster

1
bazı işletim sisteminin belge bağlantısındaki gibi büyük harflere ihtiyacı olduğunu unutmayın .
Flo

3

Benim için bir iptables yönlendirme kuralıydı. Bazı nedenlerden dolayı, aşağıdaki kural, liman işçisinin iptables kuralları ile birleştiğinde, konteynerlerden gelen tüm trafiğin çarpmasına neden oldu localhost:8080:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

3
Peki ... çözüm ne? :) İlk kurala sahibim ve gelen trafiği 80 ila 8080 arasında yönlendirmesi gerekiyor. Giden trafiği etkilememek için bunu nasıl değiştirebilirim?
mrooney

3

Sorun Ubuntu 18.04'te vardı. Ancak sorun DNS ile ilgiliydi. Kendi DNS sunucusuna sahip olan ve diğer DNS sunucularını engelleyen bir şirket ağındaydım. Bu, bazı web sitelerini (porno, torrentler, ... vb.) Engellemek içindir.

Sorununuzu çözmek için

  1. ana makinede DNS'inizi bulun
  2. @jobin tarafından önerilen şekilde --dns your_dns kullanın

    docker run --dns your_dns -it --name cowsay - anasistem adı cowsay debian bash


2

Windows'ta (8.1) sanal kutu arayüzünü (taskmgr aracılığıyla) öldürdüm ve sorunu çözdüm.


2

Dock'unuzu dns seçenekleriyle başlatmış olabilirsiniz --dns 172.x.x.x

Aynı hatayla karşılaştım ve seçenekleri /etc/default/docker

Çizgiler:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.x.x.x"

2

VPN için openconnect 8.3 kullanan Ubuntu 19.04 için, systemd'dekine /etc/resolve.conf symlink zorunda kaldım (answerby wisbucky'nin tersi)

sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf

Hata ayıklama adımları

  1. Şirket VPN'sine Bağlanma
  2. /Etc/resolv.conf veya /run/systemd/resolve/resolv.conf içinde doğru VPN ayarlarını bulun
  3. Hangisi doğru DNS ayarlarına sahip olursa olsun, bunu diğer dosyaya bağlayacağız (İpucu: Atamanın soluna doğru ayarlarla bir tane yerleştirin)

Docker sürümü: Docker sürümü 19.03.0-rc2, f97efcc derlemesi


2
Teşekkür ederim. Ubuntu 18.04 ile, şirket VPN'sine bağlandıktan sonra sadece /etc/resolve.conf DHCP tarafından güncelleniyordu ve / run / systemd / resol / resol / conf sabit / statik olarak kaldı. Bu çözüm yardımcı oldu. Şimdi, yerel makinedeki kaplar
VPN'deki

1

OSX kullanıyorsanız, Docker'ı yükledikten sonra makinenizi yeniden başlatmanız gerekebilir. Bu bazen bir sorun olmuştur.


1

Başlangıçta docker konteynırım harici internete ulaşabildi (Bu bir Amazon EC2 üzerinde çalışan bir docker servisi / konteyneri).

Uygulamam bir API olduğundan, 80 numaralı bağlantı noktasından API'mın (docker üzerinde çalışan) olduğu bağlantı noktasına tüm trafiği yönlendirmek için IP Tablolarımı güncelleyerek konteynerin oluşturulmasını (ihtiyaç duyduğu tüm paketleri çekmeyi başardı) izledim dinliyor.

Daha sonra, kabı yeniden oluşturmayı denediğimde başarısız oldu. Çok uğraştıktan sonra, önceki adımımın (IPTable bağlantı noktası yönlendirme kuralını belirleme) liman işçisinin harici ağ oluşturma yeteneğini bozduğunu keşfettim.

Çözüm: IPTable hizmetinizi durdurun:

sudo service iptables stop

Docker Daemon'u yeniden başlatın:

sudo service docker restart

Ardından, kapsayıcınızı yeniden oluşturmayı deneyin. Bu yardımcı olur umarım.


Takip et

Ben tamamen gelen docker üzerinde çalışan API üzerinde çalıştığı bağlantı noktasına gelen trafiği 80 iletmek için IP Tabloları ile uğraşmak zorunda olmadığını gözardı. Bunun yerine, sadece port 80'i docker'daki API'nin çalıştığı bağlantı noktasına taktım:

docker run -d -p 80:<api_port> <image>:<tag> <command to start api>


1

Docker çalıştıran bir sanal kutu kapsayıcısında birisinin bu sorunla karşılaşması durumunda bunu buraya eklemeniz yeterlidir. Virtualbox ağını nat yerine köprülenecek şekilde yeniden yapılandırdım ve sorun ortadan kalktı.


1

benim için sorunum iptables-services yüklü olmadığı için, bu benim için çalıştı (CentOS):

sudo yum install iptables-services
sudo service docker restart

iptable hizmetlerini de başlatmayı ve etkinleştirmeyi unutmayın
Jay

1

Centos 8'de Sorunum, docker hizmetine başlamadan önce iptables yüklemediğim ve başlayamadığım oldu. Liman hizmetine başlamadan önce iptables servisinin çalışır durumda olduğundan emin olun.


0

Ubuntu'da Docker-Compose kullanarak bir proje kurmaya çalışırken de böyle bir sorunla karşılaştım.

Docker'ın internete erişimi yoktu, herhangi bir IP adresine ping atmaya çalıştığımda veya bir URL'yi nslookup yapmaya çalıştığımda - her zaman başarısız oldu.

Yukarıda açıklanan DNS çözümlemesi ile olası tüm çözümleri denemedim.

Bütün gün haltın neler olduğunu bulmaya çalışarak geçirdim ve sonunda tüm sorunun nedeninin antivirüs olduğunu öğrendim, özellikle de bir nedenden dolayı Docker'ın IP adresini ve bağlantı noktasını almasını engelleyen güvenlik duvarı.

Ben devre dışı bıraktığımda - her şey iyi çalıştı.

Bu nedenle, yüklü bir virüsten koruma yazılımınız varsa ve hiçbir şey sorunu gidermenize yardımcı olmazsa, sorun antivirüsün güvenlik duvarı olabilir.


0

Son birkaç gündür benzer bir sorun yaşadım. Benim için neden systemd, docker ve hosting sağlayıcımın bir kombinasyonuydu. Güncel CentOS (7.7.1908) kullanıyorum.

Barındırma sağlayıcım otomatik olarak systemd-networkd için bir yapılandırma dosyası oluşturur. CentOS 7'nin geçerli sürümü olan systemd 219 ile başlayarak, systemd-networkd ağla ilgili sysctl parametrelerinin kontrolünü ele geçirdi. Docker, bu sürümle uyumsuz görünüyor ve her konteyner başlatıldığında IP Yönlendirme bayraklarını sıfırlayacaktır.

Benim çözümüm eklemek oldu IPForward=trueyılında[Network] benim sağlayıcısı tarafından oluşturulan yapılandırma dosyasının -bölümü. Bu dosya birkaç yerde olabilir, büyük olasılıkla /etc/systemd/network.

Süreç ayrıca resmi liman işçiliği belgelerinde de açıklanmaktadır: https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems


Lütfen bu parametreyi ayarladığınız yeri tam olarak belirtebilir misiniz? Sizinle tam olarak aynı konuma sahibim, Google Cloud Platform'da bir VM çalıştırıyorum ve sunucuda * .network dosyası bulamadım. Sadece açık /usr/lib/sysctl.d/50-default.confancak sözdizimi farklıdır.
el.severo

Kümem kendi kendini yönetiyor ve sağlayıcım yalnızca kurulumda temel önyükleme yapıyor. Ağ yapılandırması /etc/systemd/network/10-mainif.networkbenim için yapıldı. Kontrol edebileceğiniz diğer yerler /usr/local/lib/systemd/ve sistem /usr/lib/systemd/kılavuzuna göre.
BlackCetha

0

benim için, centos 7.4 kullanarak, /etc/resolve.conf, iptables, iptables nat kuralları veya docker'ın kendisi değildi. Sorun, ana bilgisayar, docker'ın brctl komutunu kullanarak köprüyü oluşturmak için ihtiyaç duyduğu bridge-utils paketini kaçırmasıdır. yum install -y bridge-utils ve docker'ı yeniden başlatın, sorunu çözün.

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.