Nie mogę wykonać żadnego polecenia wymagającego połączenia z Internetem w dowolnym kontenerze Docker.
Pracuje:
docker run ubuntu /bin/echo 'Hello world'
Nie działa:
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'
Podobnie z pip
i ping
.
Korzystam z systemu Ubuntu 16.04 i nie używam zapory ani korporacyjnego serwera proxy i próbowałem ponownie uruchomić Docker.
Aktualizacja:
Aktualizacja w trybie interaktywnym kończy się niepowodzeniem w ten sam sposób.
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
działa z powodzeniem na hoście, tj. na moim komputerze poza dokerem.
Aktualizacja Docker w wersji 1.12.1, kompilacja 23cf638
networking
ubuntu
docker
Sashko Lykhenko
źródło
źródło
apt-get update
w trybie interaktywnym z dokerem?Odpowiedzi:
Jak sugeruje creack w numerze GitHub nr 866 dla Dockera :
„Zmusi to dokera do odtworzenia mostu i ponownego uruchomienia wszystkich reguł sieciowych”
źródło
-d
Flaga nie wyjść.Podobny problem występuje na StackOverflow, gdzie inne rozwiązanie rozwiązuje ten problem w Docker 17.09 na Ubuntu 16.04:
Sprawdź zawartość
resolv.conf
:Jeśli zawiera taką linię
nameserver 127.0.1.1
, oznacza to, że kontenery uzyskują niepoprawny serwer nazw. Aby naprawić tę edycję,NetworkManager.conf
plik:I skomentuj linię za pomocą
dns=dnsmasq
; plik powinien wyglądać następująco:Na koniec zrestartuj menedżera sieci:
Sprawdź ponownie pojemnik:
źródło
Pierwszą rzeczą do sprawdzenia jest uruchomienie
cat /etc/resolv.conf
w kontenerze dokera . Jeśli ma niepoprawny serwer DNS, na przykładnameserver 127.0.x.x
, kontener nie będzie mógł rozpoznać nazw domen na adresy IP, więcping google.com
się nie powiedzie.Drugą rzeczą do sprawdzenia jest uruchomienie
cat /etc/resolv.conf
na komputerze hosta . Docker w zasadzie kopiuje hosta/etc/resolv.conf
do kontenera przy każdym uruchomieniu kontenera. Jeśli więc host nie/etc/resolv.conf
ma racji, kontener dokera również.Jeśli stwierdzisz, że host nie
/etc/resolv.conf
jest prawidłowy, masz 2 opcje:Zakoduj serwer DNS w daemon.json. Jest to łatwe, ale nie idealne, jeśli spodziewasz się zmiany serwera DNS.
Napraw hosty
/etc/resolv.conf
. Jest to trochę trudniejsze, ale jest generowane dynamicznie i nie kodujesz na stałe serwera DNS.1. Serwer DNS z kodem stałym w oknie dokowanym daemon.json
Edytować
/etc/docker/daemon.json
Zrestartuj demona dokera, aby zmiany odniosły skutek:
sudo systemctl restart docker
Teraz, gdy uruchomisz / uruchomisz kontener,
/etc/resolv.conf
okno dokowane zapełni się wartościami zdaemon.json
.2. Napraw hosty
/etc/resolv.conf
A. Ubuntu 16.04 i wcześniejsze
Dla systemu Ubuntu 16.04 i wcześniejszych
/etc/resolv.conf
został dynamicznie wygenerowany przez NetworkManager.Skomentuj wiersz
dns=dnsmasq
(za#
) w/etc/NetworkManager/NetworkManager.conf
Zrestartuj NetworkManager, aby zregenerować
/etc/resolv.conf
:sudo systemctl restart network-manager
Sprawdź na hoście:
cat /etc/resolv.conf
B. Ubuntu 18.04 i nowsze
Ubuntu 18.04 zmieniono
systemd-resolved
na generowanie/etc/resolv.conf
. Teraz domyślnie używa lokalnej pamięci podręcznej DNS 127.0.0.53. To nie będzie działać w kontenerze, więc Docker przejdzie do serwera DNS Google 8.8.8.8, co 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.Wystarczy zmienić dowiązanie symboliczne, aby wskazywało
/run/systemd/resolve/resolv.conf
na rzeczywiste serwery DNS:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Sprawdź na hoście:
cat /etc/resolv.conf
Teraz powinieneś mieć poprawne
/etc/resolv.conf
na hoście, aby doker mógł skopiować do kontenerów.źródło