Brak połączenia internetowego w kontenerach Docker

24

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 pipi 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

Sashko Lykhenko
źródło
Czy możesz pingować domenę z hosta? Czy możesz uruchomić apt-get updatew trybie interaktywnym z dokerem?
adampski
dane wyjściowe pokazują błąd: Tymczasowe niepowodzenie usuwania „archive.ubuntu.com” ... spróbuj ... ping www.google.com .. sprawdź, czy otrzymujesz tę samą odpowiedź .. następnie spróbuj ... ping 8.8.8.8 .. . jeśli IP działa, a nazwa hosta nie działa, wtedy twój DNS jest uszkodzony (więcej /etc/resolv.conf, aby zobaczyć, który serwer DNS jest używany)
TG2
@adampski, zaktualizowałem pytanie na podstawie twoich sugestii.
Sashko Lykhenko
@ TG2, zaktualizowałem pytanie również na podstawie twoich sugestii.
Sashko Lykhenko
Jaką wersję silnika dokera używasz?
adampski

Odpowiedzi:

14

Jak sugeruje creack w numerze GitHub nr 866 dla Dockera :

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

„Zmusi to dokera do odtworzenia mostu i ponownego uruchomienia wszystkich reguł sieciowych”

adampski
źródło
1
Próbowałem, a to zabija sieć na całym moim komputerze.
petersohn
Jest to pomocne i rozwiązało problem. Dziękuję Ci.
Rao
10
-dFlaga nie wyjść.
Luís de Sousa,
2
Cześć @ LuísdeSousa. Szkoda, że ​​głosowałeś na to, ale rozważ możliwość, że niektóre przełączniki zostaną usunięte lub zmienione w nowszych wersjach. Zwłaszcza, że ​​było to ponad rok temu.
adampski,
3
zamiast tylko skopiować / pominąć polecenie, możesz wyjaśnić, co one oznaczają :)
Adelin
12

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:

$ cat /etc/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.confplik:

$ sudo pico /etc/NetworkManager/NetworkManager.conf

I skomentuj linię za pomocą dns=dnsmasq; plik powinien wyglądać następująco:

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

[ifupdown]
managed=false

Na koniec zrestartuj menedżera sieci:

$ sudo systemctl restart network-manager

Sprawdź ponownie pojemnik:

$ 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]
Luís de Sousa
źródło
Moja instalacja pasowała do opisu, a powyższe podejście rozwiązało problem.
krcools
zaktualizowana odpowiedź na Ubuntu 18.04: superuser.com/a/1335054
wisbucky
7

Pierwszą rzeczą do sprawdzenia jest uruchomienie cat /etc/resolv.confw kontenerze dokera . Jeśli ma niepoprawny serwer DNS, na przykład nameserver 127.0.x.x, kontener nie będzie mógł rozpoznać nazw domen na adresy IP, więc ping google.comsię nie powiedzie.

Drugą rzeczą do sprawdzenia jest uruchomienie cat /etc/resolv.confna komputerze hosta . Docker w zasadzie kopiuje hosta /etc/resolv.confdo kontenera przy każdym uruchomieniu kontenera. Jeśli więc host nie /etc/resolv.confma racji, kontener dokera również.

Jeśli stwierdzisz, że host nie /etc/resolv.confjest prawidłowy, masz 2 opcje:

  1. Zakoduj serwer DNS w daemon.json. Jest to łatwe, ale nie idealne, jeśli spodziewasz się zmiany serwera DNS.

  2. 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

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Zrestartuj demona dokera, aby zmiany odniosły skutek:
    sudo systemctl restart docker

  • Teraz, gdy uruchomisz / uruchomisz kontener, /etc/resolv.confokno dokowane zapełni się wartościami z daemon.json.


2. Napraw hosty /etc/resolv.conf

A. Ubuntu 16.04 i wcześniejsze

  • Dla systemu Ubuntu 16.04 i wcześniejszych /etc/resolv.confzostał 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-resolvedna 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.confjest właściwie dowiązaniem symbolicznym ( ls -l /etc/resolv.conf), które /run/systemd/resolve/stub-resolv.confdomyślnie wskazuje na (127.0.0.53) w Ubuntu 18.04.

  • Wystarczy zmienić dowiązanie symboliczne, aby wskazywało /run/systemd/resolve/resolv.confna 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.confna hoście, aby doker mógł skopiować do kontenerów.

wisbucky
źródło