Połączenia sieciowe kończą się niepowodzeniem podczas tworzenia obrazu w sieci firmowej

81

Mam problem z budowaniem obrazów Dockera w mojej sieci firmowej. Właśnie zaczynam pracę z Dockerem, więc mam następujący plik Dockerfile dla aplikacji typu hello-world:

# DOCKER-VERSION 0.3.4
FROM    centos:6.4
# Enable EPEL for Node.js
RUN     rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# Install Node.js and npm
RUN     yum install -y npm
# Bundle app source
ADD . /src
# Install app dependencies
RUN cd /src; npm install
EXPOSE  8080
CMD ["node", "/src/index.js"]

Działa to dobrze, gdy buduję go na moim laptopie w domu, w mojej własnej sieci bezprzewodowej. Ściąga wymagane zależności i poprawnie buduje obraz.

Jednak kiedy jestem w mojej sieci firmowej w pracy, ta sama kompilacja dockera kończy się niepowodzeniem podczas próby ściągnięcia RPM z download.fedoraproject.org, z tym komunikatem o błędzie:

Krok 2: URUCHOM rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> Uruchomiony w e0c26afe9ed5 curl: (5) Couldn ' t rozwiązać błąd proxy „some.proxy.address”: pomijanie http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - przesyłanie nie powiodło się

W mojej sieci firmowej mogę uzyskać dostęp do tego adresu URL z laptopa. Ale gdy Docker próbuje zbudować kontener, nagle nie może go w ogóle rozwiązać. To zachowanie jest takie samo w przypadku wielu różnych zasobów zewnętrznych (apt-get itp.): Wszystkie mogą być poprawnie rozwiązane na moim laptopie w sieci firmowej, ale Docker nie może ich rozwiązać.

Nie mam znajomości sieci, aby dowiedzieć się, co się tutaj dzieje. Czy ktoś wie, dlaczego to dziwne zachowanie miałoby się pojawiać podczas budowania kontenerów Dockera?

dsw88
źródło
zajrzyj na stackoverflow.com/questions/19210563/ ... może to również rozwiązać twój problem
Thomasleveil.
pojawił się ten sam problem. Zapomniałem biec apt-get update.
matthiasbe
Mogą to być objawy „Docker nie pobiera informacji DNS z Cisco AnyConnect” forums.docker.com/t/ ...
Jason

Odpowiedzi:

93

Udało mi się rozwiązać problem. W systemie Ubuntu Docker ustawia serwery DNS kontenera na serwery Google na 8.8.8.x. Jak rozumiem, jest to obejście w systemie Ubuntu, ponieważ Ubuntu ustawia /etc/resolv.conf na 127.0.0.1.

Te serwery Google nie były dostępne zza naszej zapory, dlatego nie mogliśmy rozwiązać żadnych adresów URL.

Rozwiązaniem jest poinformowanie platformy Docker, których serwerów DNS ma używać. Ta poprawka zależy od sposobu zainstalowania Dockera:

Pakiet Ubuntu

Jeśli masz zainstalowany pakiet Ubuntu, edytuj / etc / default / docker i dodaj następujący wiersz:

DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"

Możesz dodać dowolną liczbę serwerów DNS do tej konfiguracji. Po edycji tego pliku będziesz chciał ponownie uruchomić usługę Docker:

sudo service docker restart

Pliki binarne

Jeśli zainstalowałeś Dockera za pomocą metody binarnej (tj. Bez pakietu), to ustawiasz serwery DNS po uruchomieniu demona Dockera:

sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &
dsw88
źródło
4
a co z używaniem polecenia „docker build” z Dockfiles ... nie wygląda na to, żeby działało w takich okolicznościach: docker --dns = 209.18.47.61 build. 2> & 1 | tee ./output.txt
Quasaur
2
tak, to powinno działać z kompilacją Dockera. Docker build nie ma flagi --dns w samym poleceniu, ale jeśli ustawisz ją w demonie w ten sposób, będzie ona stosowana podczas korzystania z kompilacji
docker
Dziękuję za to rozwiązanie. Po mojej stronie problem polegał na tym, że docker najwyraźniej potrzebuje IPv4, aby był dostępny i włączony. WTF? Dowiedz się: IPv4 nie działa. Oprogramowanie działające wyłącznie w protokole IPv4 jest poważnie uszkodzone.
Tino
1
Wykonałem już ten krok i ponownie zacząłem otrzymywać błędy. Ponowne uruchomienie usługi rozwiązało problem.
Andrew Grothe,
Mam ten problem z dockerem 1.7, chociaż próbowałem go uruchomić z --dnsopcją lub wrzucając konfigurację/etc/default/docker
Patryk
65

Radzę zmienić ustawienia DNS demona Dockera. Możesz ustawić domyślne opcje demona Dockera, tworząc plik konfiguracyjny demona w /etc/docker/daemon.json . Ustaw serwer DNS zgodnie z maszyną hostującą, np. Mój serwer DNS to 10.0.0.2:

{"dns": ["10.0.0.2", "8.8.8.8"] }

Następnie wystarczy ponownie uruchomić usługę docker:

sudo service docker restart

Wyjaśnienie krok po kroku jest dostępne tutaj. Napraw konfigurację DNS sieci Docker

l.augustyniak
źródło
20

Poniższe kroki działają dla mnie (zarówno dla polecenia docker build, jak i docker run). Moja wersja dla systemu Linux to Ubuntu 14.04.

  • Zidentyfikuj DNS za pomocą następującego polecenia.
    nm-tool | grep DNS

Ten wynik DNS: 192.168.1.1 w moim przypadku

  • Utwórz wpis w /etc/default/docker.io. Mój obecny wpis wygląda tak
DOCKER_OPTS = "- dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1"
  • Uruchom ponownie usługę docker
 Uruchom ponownie usługę sudo docker.io 
Balkrishna
źródło
2
Odpowiednikiem CentOS jest /etc/sysconfig/dockerplik, do którego udało mi się dodać DOCKER_OPTS="--dns 8.8.8.8"linię i rozwiązać mój problem.
MarkHu
OpenSuSE również ma ten /etc/sysconfig/dockerplik.
David Lakatos
11

W przypadku dowolnej dystrybucji Linuksa współpracującej z SystemD (Ubuntu 16, RHEL 7 ...) ścieżka zostanie wyświetlona za pomocą następującego polecenia:

$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2016-06-29 08:10:33 PDT; 2min 34s ago
     Docs: https://docs.docker.com
 Main PID: 1169 (dockerd)
    Tasks: 19
   Memory: 85.0M
      CPU: 1.779s
   CGroup: /system.slice/docker.service
           ├─1169 /usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4 -H fd://
           └─1232 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --met

Ścieżka byłaby /lib/systemd/system/docker.service. Dodaj DOCKER_OPTSwartości, które mogą mieć dowolne z --dns, w wierszu, w którym uruchamiany jest demon.

cat /lib/systemd/system/docker.service | grep dns 
ExecStart=/usr/bin/dockerd --dns 172.18.20.11 --dns 172.20.100.15 --dns 8.8.8.8 --dns 8.8.4.4  -H fd://
Marcello de Sales
źródło
1
Dziękuję Ci! Po edycji docker.servicemusiałem zatrzymać usługę dokowania, sudo service docker stopa potem systemctl daemon-reloadi na koniecsudo service docker start
Kaveh Ghahremani
1
Lepiej jest dodać plik jednostki /etc/systemd/system/docker.service.dze zmodyfikowaną konfiguracją (która pomaga systemowi scalić / nadpisać konfigurację systemu) niż zmieniać wersję systemu. Ta ostatnia zostanie utracona podczas aktualizacji.
Raman
6

Docker (przynajmniej> = 1.13, prawdopodobnie wcześniej) na Mac i Windows pozwala skonfigurować DNS w Preferencjach -> Demon -> Zaawansowane:

Poniższa konfiguracja ustawia dwa firmowe serwery DNS (użyj tutaj własnych wartości) z możliwością powrotu do publicznych serwerów DNS Google.

Konfiguracja Docker Daemon Adv

Jason
źródło
5

Określ swój DNS do demona Docker.

Przede wszystkim uzyskaj swój adres DNS

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

Sprawdź, czy problem naprawdę dotyczy DNS, uruchamiając kontener docker wymuszający ten nowy DNS

$ docker run --dns 10.0.0.2 <image_name> <command_name>

Jeśli to rozwiąże problem, możesz zastosować tę poprawkę dla wszystkich demonów Dockera w następujący sposób

Edytuj lub utwórz plik /etc/docker/daemon.json

Dodaj następujący wiersz do tego pliku

{
"dns": ["10.0.0.2", "8.8.8.8"]
}

Uruchom ponownie okno dokowane

$ sudo service docker restart

Bardzo fajny przewodnik dotyczący wykonywania WSZYSTKICH tego procesu można znaleźć tutaj.

https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

alsora
źródło
To jest odpowiedź z pogranicza tylko linków . Powinieneś rozszerzyć swoją odpowiedź, tak aby zawierała jak najwięcej informacji, i użyj łącza tylko w celach informacyjnych.
Goodbye StackExchange
jeśli zainstalowałeś przez snap, daemon.jsonbędzie to/var/snap/docker/<id>/config/daemon.json
sjt003,
3

Rozwiązanie bez ponownego uruchamiania usługi Docker

Istnieje możliwość zmodyfikowania ustawień DNS dla pojedynczego obrazu platformy Docker bez wpływu na inne docker buildwywołania (i bez ponownego uruchamiania usługi Docker), zastępując resolv.confw czasie kompilacji:

FROM ubuntu:18.04

RUN echo "nameserver 123.123.123.123" > /etc/resolv.conf && apt update

Zastąp adres IP 123.123.123.123tym, który jest używany w Twojej sieci firmowej (użyj, nmcli dev show | grep 'IP4.DNS'aby uzyskać aktualnie używany serwer DNS).

Wady:

  • Nie ma to wpływu na żadną inną linię z pliku Dockerfile. Dlatego musisz poprzedzić każdą linię poprawką, jeśli zależy to od rozdzielczości DNS
Murmel
źródło
1

Na moim komputerze z systemem Ubuntu 16.04 czasami DNS Google nie działa przy tworzeniu obrazów Dockera.

cat /etc/docker/daemon.json
{"dns": [""8.8.8.8"] }

Muszę ręcznie znaleźć DNS mojego dostawcy usług za pomocą następującego polecenia

nmcli device show <interfacename> | grep IP4.DNS

125.22.47.102

i dodaj go do mojego, daemon.jsonjak pokazano poniżej

cat /etc/docker/daemon.json 

{"dns": ["125.22.47.102","8.8.8.8"] }

 restart docker

sudo service docker restart

(PS nm-tool jest przestarzałe od Ubuntu 15.04)

Thomas Lee Sebastian
źródło