Miałem to dobrze, ale teraz przestało. Bezskutecznie wypróbowałem następujące polecenia:
docker run -dns 8.8.8.8 base ping google.com
docker run base ping google.com
sysctl -w net.ipv4.ip_forward=1
- zarówno na hoście, jak i na kontenerze
Wszystko co dostaję to unknown host google.com
. Docker w wersji 0.7.0
Jakieś pomysły?
PS również ufw
wyłączony
sysctl -w net.ipv4.ip_forward=1
(nasysctl -w net.ipv4.ip_forward=1
/etc/resolv.conf
na komputerze hostasysctl -w net.ipv4.ip_forward=1
jak musiałem biecsudo service docker restart
.Odpowiedzi:
Pierwszą rzeczą do sprawdzenia jest uruchomienie
cat /etc/resolv.conf
w kontenerze docker . Jeśli ma nieprawidłowy serwer DNS, na przykładnameserver 127.0.x.x
, kontener nie będzie w stanie przekształcić nazw domen w adresy IP, więcping google.com
zakończy się niepowodzeniem.Drugą rzeczą do sprawdzenia jest uruchomienie
cat /etc/resolv.conf
na komputerze głównym . Docker w zasadzie kopiuje hosta/etc/resolv.conf
do kontenera za każdym razem, gdy kontener jest uruchamiany. Więc jeśli host/etc/resolv.conf
jest zły, to samo będzie w kontenerze docker.Jeśli zauważyłeś, że host
/etc/resolv.conf
jest zły, masz 2 opcje:Zakoduj serwer DNS na stałe w daemon.json. Jest to łatwe, ale nie idealne, jeśli spodziewasz się zmiany serwera DNS.
Napraw plik gospodarzy
/etc/resolv.conf
. Jest to trochę trudniejsze, ale jest generowane dynamicznie i nie kodujesz na stałe serwera DNS.1. Serwer DNS z twardym kodem w docker daemon.json
Edytować
/etc/docker/daemon.json
Zrestartuj demona Dockera, aby zmiany odniosły skutek:
sudo systemctl restart docker
Teraz, gdy uruchomisz / uruchomisz kontener, docker zapełni
/etc/resolv.conf
wartości zdaemon.json
.2. Napraw pliki hostów
/etc/resolv.conf
A. Ubuntu 16.04 i wcześniejsze
Dla Ubuntu 16.04 i wcześniejszych
/etc/resolv.conf
był dynamicznie generowany przez NetworkManager.Skomentuj linię
dns=dnsmasq
(z a#
) w/etc/NetworkManager/NetworkManager.conf
Uruchom ponownie NetworkManager, aby zregenerować
/etc/resolv.conf
:sudo systemctl restart network-manager
Zweryfikuj na hoście:
cat /etc/resolv.conf
B. Ubuntu 18.04 i nowsze
Ubuntu 18.04 zmieniono na używanie
systemd-resolved
do generowania/etc/resolv.conf
. Teraz domyślnie używa lokalnej pamięci podręcznej DNS 127.0.0.53. To nie zadziała w kontenerze, więc Docker domyślnie użyje serwera DNS Google 8.8.8.8, który może się zepsuć dla osób za zaporą ogniową./etc/resolv.conf
jest właściwie dowiązaniem symbolicznym (ls -l /etc/resolv.conf
), które/run/systemd/resolve/stub-resolv.conf
domyślnie wskazuje na (127.0.0.53) w Ubuntu 18.04.Po prostu zmień łącze symboliczne, na które wskazuje
/run/systemd/resolve/resolv.conf
, które zawiera listę prawdziwych serwerów DNS:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Zweryfikuj na hoście:
cat /etc/resolv.conf
Teraz powinieneś mieć ważny
/etc/resolv.conf
na hoście, aby docker mógł skopiować do kontenerów.źródło
systemctl
(Ubuntu 14.04), spróbuj Jak zrestartować usługę sieciową? i / lub uruchom ponownie komputer./etc/resolv.conf
do kontenera podczas budowy, musiałem ręcznie skopiować plik do kontenera.Naprawiono postępując zgodnie z tą radą:
https://github.com/dotcloud/docker/issues/866#issuecomment-19218300
Wygląda na to, że interfejs został jakoś „powieszony”.
Aktualizacja dla nowszych wersji Dockera:
Powyższa odpowiedź może nadal wykonać zadanie za Ciebie, ale minęło sporo czasu, odkąd ta odpowiedź została opublikowana, a docker jest teraz bardziej dopracowany, więc upewnij się, że wypróbujesz je najpierw, zanim przejdziesz do zniekształcenia
iptables
.sudo service docker restart
lub (jeśli jesteś w dystrybucji Linuksa, która nie używa Upstart)sudo systemctl restart docker
źródło
docker -d
zawodzi. Nie ma-d
flagi.ip link del docker0
docker -d
nie istnieje w nowszych wersjach. Zamiast:service docker stop
, a następniedockerd
, po czymservice docker start
Zamierzonym sposobem ponownego uruchomienia dockera nie jest zrobienie tego ręcznie, ale użycie polecenia
service
or init:źródło
systemctl enable docker
)Aktualizacja tego pytania z odpowiedzią dla OSX (przy użyciu Docker Machine)
Jeśli używasz Dockera na OSX przy użyciu Docker Machine, wtedy zadziałało:
Wtedy (przynajmniej z mojego doświadczenia), jeśli pingujesz google.com z kontenera, wszystko będzie dobrze.
źródło
Nie wiem, co robię, ale to zadziałało:
źródło
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
. Możesz sprawdzić, czy masz tę zasadęiptables -t nat -L POSTROUTING
Używałem
DOCKER_OPTS="--dns 8.8.8.8"
i później odkryłem, że mój kontener nie miał bezpośredniego dostępu do Internetu, ale mógł uzyskać dostęp do mojego firmowego intranetu. ZmieniłemDOCKER_OPTS
na następujące:Zastąpienie
internal_corporate_dns_address
adresem IP lub FQDN naszego DNS i zrestartowałem docker przy użyciua następnie stworzyłem mój kontener i sprawdziłem, czy ma dostęp do internetu.
źródło
Byłem zaskoczony, gdy stało się to dla mnie losowo dla jednego z moich pojemników, podczas gdy inne pojemniki były w porządku. Kontener został dołączony do co najmniej jednej sieci innej niż wewnętrzna , więc
Compose
definicja nie zawierała żadnych błędów . Ponowne uruchomienie demona VM / Docker nie pomogło. Nie był to również problem z DNS, ponieważ kontener nie mógł nawetping
mieć zewnętrznego adresu IP. Rozwiązaniem dla mnie było odtworzenie sieci (sieci) dockera. W moim przypadkudocker-compose down && docker-compose up
zadziałało.Komponować
Wymusza to odtworzenie wszystkich sieci wszystkich kontenerów:
docker-compose down
&&docker-compose up
Tryb roju
Przypuszczam, że wystarczy usunąć i odtworzyć usługę, która odtwarza sieci usługi:
docker service rm some-service
docker service create ...
Jeśli sieci kontenera są zewnętrzne
Po prostu usuń i utwórz ponownie zewnętrzne sieci tej usługi:
docker network rm some-external-network
docker network create some-external-network
źródło
Dla mnie był to firewall hosta. Musiałem zezwolić na DNS na zaporze hosta. Po zmianie ustawienia zapory hosta musiałem również ponownie uruchomić docker.
źródło
sudo service iptables stop
isudo chkconfig iptables off
(na CentOS / RHEL).Brak dostępu do Internetu może być również spowodowany brakiem ustawień proxy . W takim przypadku
--network host
może też nie działać. Serwer proxy można skonfigurować, ustawiając zmienne środowiskowehttp_proxy
ihttps_proxy
:Nie zapomnij również ustawić no_proxy, w przeciwnym razie wszystkie żądania (w tym kierowane do localhost) będą przechodzić przez proxy.
Więcej informacji: Ustawienia proxy na Archlinux Wiki.
źródło
Dla mnie była to reguła przekierowania iptables. Z jakiegoś powodu poniższa reguła, w połączeniu z regułami iptables platformy docker, spowodowała trafienie całego ruchu wychodzącego z kontenerów
localhost:8080
:źródło
Miałem problem na Ubuntu 18.04. Jednak problem był z DNS. Byłem w sieci firmowej, która ma własny serwer DNS i blokuje inne serwery DNS. Ma to na celu zablokowanie niektórych stron internetowych (pornografia, torrenty itp.)
Aby rozwiązać problem
użyj --dns your_dns zgodnie z sugestią @jobin
docker run --dns your_dns -it --name cowsay --hostname cowsay debian bash
źródło
W systemie Windows (8.1) zabiłem interfejs virtualbox (przez taskmgr) i rozwiązałem problem.
źródło
Być może uruchomiłeś swój docker z opcjami dns
--dns 172.x.x.x
Miałem ten sam błąd i usunąłem opcje z
/etc/default/docker
Linie:
źródło
W przypadku Ubuntu 19.04 używającego openconnect 8.3 dla VPN, musiałem dowiązać symboliczne /etc/resolve.conf do tego w systemd (przeciwieństwo odpowiedzi wisbucky'ego)
sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf
Kroki do debugowania
Wersja platformy Docker: wersja Dockera 19.03.0-rc2, kompilacja f97efcc
źródło
Jeśli korzystasz z systemu OSX, może być konieczne ponowne uruchomienie komputera po zainstalowaniu platformy Docker. Czasami był to problem.
źródło
Początkowo mój kontener docker był w stanie dotrzeć do zewnętrznego internetu (jest to usługa / kontener docker działający na Amazon EC2).
Ponieważ moja aplikacja jest interfejsem API, kontynuowałem tworzenie mojego kontenera (udało mi się pobrać wszystkie potrzebne pakiety), aktualizując moje tabele IP, aby kierować cały ruch z portu 80 do portu, na którym znajdował się mój interfejs API (działający w Docker) nasłuchiwać.
Później, gdy próbowałem odbudować kontener, nie udało się. Po wielu zmaganiach odkryłem, że mój poprzedni krok (ustawienie reguły przekierowania portów IPTable) zepsuł możliwości zewnętrznej sieci dokera.
Rozwiązanie: Zatrzymaj usługę IPTable:
sudo service iptables stop
Uruchom ponownie demona platformy Docker:
sudo service docker restart
Następnie spróbuj odbudować kontener. Mam nadzieję że to pomoże.
Zagryźć
Całkowicie przeoczyłem, że nie musiałem majstrować przy tabelach IP, aby przekazywać ruch przychodzący do 80 do portu, na którym działało API działające w dockerze. Zamiast tego utworzyłem alias portu 80 do portu, na którym działał interfejs API w dockerze:
docker run -d -p 80:<api_port> <image>:<tag> <command to start api>
źródło
Dodanie tego tutaj na wypadek, gdyby ktoś napotkał ten problem w kontenerze virtualbox z uruchomionym dockerem. Skonfigurowałem sieć virtualbox na mostkowanie zamiast nat i problem zniknął.
źródło
dla mnie mój problem polegał na tym, że iptables-services nie zostało zainstalowane, to zadziałało dla mnie (CentOS):
źródło
Na centos 8 moim problemem było to, że nie zainstalowałem i nie uruchomiłem iptables przed uruchomieniem usługi docker. Upewnij się, że usługa iptables jest uruchomiona przed uruchomieniem usługi Docker.
źródło
Napotkałem też taki problem podczas próby skonfigurowania projektu za pomocą Docker-Compose na Ubuntu.
Docker nie miał w ogóle dostępu do internetu, kiedy próbowałem pingować dowolny adres IP lub nslookować jakiś URL - cały czas się nie udawało.
Bezskutecznie wypróbowałem wszystkie możliwe rozwiązania z opisaną powyżej rozdzielczością DNS.
Spędziłem cały dzień próbując dowiedzieć się, co się dzieje, aż w końcu dowiedziałem się, że przyczyną wszystkich problemów był program antywirusowy, w szczególności jego firewall, który z jakiegoś powodu zablokował Dockerowi uzyskanie adresu IP i portu.
Kiedy go wyłączyłem - wszystko działało dobrze.
Jeśli więc masz zainstalowany program antywirusowy i nic nie pomaga rozwiązać problemu - problemem może być zapora ogniowa programu antywirusowego.
źródło
Od kilku dni mam podobny problem. Dla mnie przyczyną była kombinacja systemd, docker i mojego dostawcy hostingu. Korzystam z aktualnego CentOS (7.7.1908).
Mój dostawca hostingu automatycznie generuje plik konfiguracyjny dla systemd-networkd. Począwszy od systemd 219, który jest aktualną wersją CentOS 7, systemd-networkd przejął kontrolę nad parametrami sysctl związanymi z siecią. Docker wydaje się być niekompatybilny z tą wersją i zresetuje flagi przekazywania IP za każdym razem, gdy kontener zostanie uruchomiony.
Moim rozwiązaniem było dodanie
IPForward=true
w sekcji[Network]
mojego pliku konfiguracyjnego wygenerowanego przez dostawcę. Ten plik może znajdować się w kilku miejscach, najprawdopodobniej w/etc/systemd/network
.Proces jest również opisany w oficjalnych dokumentach docker: https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems
źródło
/usr/lib/sysctl.d/50-default.conf
ale składnia jest inna./etc/systemd/network/10-mainif.network
dla mnie. Inne miejsca, które możesz sprawdzić, to/usr/local/lib/systemd/
i/usr/lib/systemd/
zgodnie ze stroną podręcznika systemowego.dla mnie, używając centos 7.4, nie było to kwestia /etc/resolve.conf, iptables, reguł iptables nat ani samego dockera. Problem polega na tym, że na hoście brakuje pakietu bridge-utils, którego docker wymaga do zbudowania mostu za pomocą polecenia brctl. yum install -y bridge-utils i zrestartuj docker, rozwiąż problem.
źródło