Netzwerkanrufe schlagen während der Imageerstellung im Unternehmensnetzwerk fehl


80

Ich habe ein Problem beim Erstellen von Docker-Images in meinem Unternehmensnetzwerk. Ich fange gerade erst mit Docker an, daher habe ich die folgende Docker-Datei für eine App vom Typ "Hallo Welt":

# 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"]

Dies funktioniert gut, wenn ich es zu Hause auf meinem Laptop in meinem eigenen drahtlosen Netzwerk baue. Es entfernt die erforderlichen Abhängigkeiten und erstellt das Image korrekt.

Wenn ich jedoch in meinem Unternehmensnetzwerk arbeite, schlägt derselbe Docker-Build fehl, wenn versucht wird, das RPM von download.fedoraproject.org mit der folgenden Fehlermeldung abzurufen:

Schritt 2: RUN rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm ---> Laufen in e0c26afe9ed5 curl: (5) Couldn ' t Beheben des Proxy-Fehlers 'some.proxy.address': Überspringen von http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm - Übertragung fehlgeschlagen

In meinem Unternehmensnetzwerk kann ich von meinem Laptop aus problemlos auf diese URL zugreifen. Aber sobald Docker versucht, den Container zu erstellen, kann er plötzlich überhaupt nicht mehr aufgelöst werden. Dieses Verhalten ist für eine Vielzahl externer Ressourcen (apt-get usw.) gleich: Sie können alle auf meinem Laptop im Unternehmensnetzwerk problemlos aufgelöst werden, Docker kann sie jedoch nicht auflösen.

Ich habe nicht das Netzwerk-Know-how, um herauszufinden, was hier los ist. Weiß jemand, warum dieses seltsame Verhalten beim Erstellen von Docker-Containern auftreten würde?


Werfen Sie einen Blick auf stackoverflow.com/questions/19210563/… es könnte auch Ihr Problem lösen
Thomasleveil

Das gleiche Problem trat bei mir auf. Ich hatte vergessen zu rennen apt-get update.
Matthiasbe

Dies können Symptome von "Docker nimmt keine DNS-Informationen von Cisco AnyConnect ab" forums.docker.com/t/…
Jason

Antworten:


91

Ich konnte das Problem herausfinden. Unter Ubuntu setzt Docker die DNS-Server für den Container auf die Server von Google unter 8.8.8.x. Soweit ich weiß, ist dies eine Problemumgehung für Ubuntu, da Ubuntu /etc/resolv.conf auf 127.0.0.1 setzt.

Diese Google-Server waren hinter unserer Firewall nicht zugänglich, weshalb wir keine URLs auflösen konnten.

Das Update besteht darin, Docker mitzuteilen, welche DNS-Server verwendet werden sollen. Dieser Fix hängt davon ab, wie Sie Docker installiert haben:

Ubuntu-Paket

Wenn Sie das Ubuntu-Paket installiert haben, bearbeiten Sie / etc / default / docker und fügen Sie die folgende Zeile hinzu:

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

Sie können dieser Konfiguration so viele DNS-Server hinzufügen, wie Sie möchten. Sobald Sie diese Datei bearbeitet haben, möchten Sie Ihren Docker-Dienst neu starten:

sudo service docker restart

Binärdateien

Wenn Sie Docker über die Binärmethode (dh kein Paket) installiert haben, legen Sie die DNS-Server beim Starten des Docker-Dämons fest:

sudo docker -d -D --dns <your_dns_server_1> --dns <your_dns_server_2> &

4
Was ist mit der Verwendung des Befehls 'Docker Build' mit Dockfiles? Unter diesen Umständen sieht es nicht so aus: docker --dns = 209.18.47.61 build. 2> & 1 | Tee ./output.txt
Quasaur

2
Ja, das sollte mit Docker Build funktionieren. Docker Build hat kein --dns Flag im Befehl selbst, aber wenn Sie es auf dem Daemon wie folgt setzen, dann wird es
angewendet

Vielen Dank für diese Lösung. An meiner Seite war das Problem, dass Docker anscheinend IPv4 benötigt, um verfügbar und aktiviert zu sein. WTF? Erfahren Sie: IPv4 ist tot. Software, die nur IPv4 ist, ist ernsthaft kaputt.
Tino

1
Ich hatte diesen Schritt bereits ausgeführt und bekam die Fehler wieder. Durch einen Neustart des Dienstes wurde das Problem erneut behoben.
Andrew Grothe

Ich habe dieses Problem mit Docker 1.7, obwohl ich versucht habe, es entweder mit --dnsOption auszuführen oder die Konfiguration einzufügen/etc/default/docker
Patryk

64

Ich empfehle, die DNS-Einstellungen des Docker-Daemons zu ändern. Sie können die Standardoptionen für den Docker-Dämon festlegen, indem Sie eine Dämon-Konfigurationsdatei unter /etc/docker/daemon.json erstellen . Stellen Sie den DNS-Server entsprechend Ihrem Host-Computer ein, z. B. ist mein DNS-Server 10.0.0.2:

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

Dann müssen Sie nur noch den Docker-Dienst neu starten:

sudo service docker restart

Eine schrittweise Erklärung finden Sie hier. Korrigieren Sie die Netzwerk-DNS-Konfiguration von Docker


19

Die folgenden Schritte funktionieren für mich (sowohl für den Docker-Build- als auch für den Docker-Run-Befehl). Meine Linux-Version ist Ubuntu 14.04.

  • Identifizieren Sie DNS mit dem folgenden Befehl.
    nm-tool | grep DNS

Dieses Ergebnis DNS: 192.168.1.1 in meinem Fall

  • Erstellen Sie einen Eintrag in /etc/default/docker.io. Mein aktueller Eintrag sieht so aus
DOCKER_OPTS = "- dns 8.8.8.8 --dns 8.8.4.4 --dns 192.168.1.1"
  • Starten Sie den Docker-Dienst neu
 sudo service docker.io neu starten 

1
Das CentOS-Äquivalent ist die /etc/sysconfig/dockerDatei, zu der ich die DOCKER_OPTS="--dns 8.8.8.8"Zeile hinzufügen und mein Problem lösen konnte.
MarkHu

10

Für jede Linux-Distribution, die mit SystemD arbeitet (Ubuntu 16, RHEL 7 ...), wird der Pfad mit dem folgenden Befehl angezeigt:

$ 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

Der Weg wäre /lib/systemd/system/docker.service. Fügen Sie die DOCKER_OPTSWerte, die einen der folgenden Werte haben können --dns, in die Zeile ein, in der der Dämon gestartet wird.

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://

1
Vielen Dank! Nach der Bearbeitung musste docker.serviceich den Docker-Service mit sudo service docker stopund dann systemctl daemon-reloadund schließlich sudo service docker start
beenden

1
Es ist besser, eine Einheitendatei /etc/systemd/system/docker.service.dmit der geänderten Konfiguration hinzuzufügen (die systemd die Systemkonfiguration hilfreich zusammenführt / überschreibt), als die Systemversion zu ändern. Letzteres geht bei Upgrades verloren.
Raman

6

Mit Docker (mindestens> = 1.13, wahrscheinlich früher) unter Mac und Windows können Sie das DNS unter Einstellungen -> Daemon -> Erweitert konfigurieren:

In der folgenden Konfiguration werden zwei Unternehmens-DNS-Server (verwenden Sie hier Ihre eigenen Werte) mit Fallback auf öffentliche DNS-Server von Google festgelegt.

Docker Daemon Adv Config


5

Geben Sie Ihren DNS für den Docker-Daemon an.

Holen Sie sich zunächst Ihre DNS-Adresse

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

Testen Sie, ob das Problem tatsächlich mit dem DNS zusammenhängt, indem Sie einen Docker-Container starten, der dieses neue DNS erzwingt

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

Wenn das Problem dadurch behoben wird, können Sie dieses Update auf folgende Weise für alle Docker-Daemons anwenden

Bearbeiten oder erstellen Sie eine Datei /etc/docker/daemon.json

Fügen Sie dieser Datei die folgende Zeile hinzu

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

Starten Sie Docker neu

$ sudo service docker restart

Eine sehr schöne Anleitung für ALLE diese Prozesse finden Sie hier.

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


Dies ist eine Borderline- Link-Only-Antwort . Sie sollten Ihre Antwort erweitern, um möglichst viele Informationen hier aufzunehmen, und den Link nur als Referenz verwenden.
Auf Wiedersehen StackExchange

Wenn Sie per Snap installiert haben, daemon.jsonwird am/var/snap/docker/<id>/config/daemon.json
sjt003

3

Lösung ohne Neustart des Docker-Dienstes

Es ist möglich, die DNS-Einstellungen für ein einzelnes Docker-Image zu ändern, ohne andere docker buildAufrufe zu beeinflussen (und ohne den Docker-Dienst neu zu starten), indem Sie zum resolv.confZeitpunkt der Erstellung Folgendes überschreiben :

FROM ubuntu:18.04

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

Ersetzen Sie die IP 123.123.123.123durch die IP-Adresse, die in Ihrem Unternehmensnetzwerk verwendet wird (verwenden Sie nmcli dev show | grep 'IP4.DNS'diese Option, um den aktuell verwendeten DNS-Server abzurufen).

Nachteile:

  • Dies betrifft keine andere Zeile aus der Docker-Datei. Daher müssen Sie jeder Zeile das Update voranstellen, wenn dies von der DNS-Auflösung abhängt

1

Auf meinem Ubuntu 16.04-Computer funktioniert Googles DNS manchmal nicht zum Erstellen von Docker-Images.

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

Ich muss das DNS meines Dienstanbieters mit dem folgenden Befehl manuell ermitteln

nmcli device show <interfacename> | grep IP4.DNS

125.22.47.102

und füge es meiner daemon.jsonwie unten gezeigt hinzu

cat /etc/docker/daemon.json 

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

 restart docker

sudo service docker restart

(PS nm-Tool ist ab Ubuntu 15.04 veraltet)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.