Kann mir jemand helfen, apt-get in meinem Docker-Container zum Laufen zu bekommen? Wenn ich versuche, einen apt-get-Befehl in meinem Docker-Container auszuführen, schlägt der Befehl fehl. Ich verwende Docker Version 1.1.1, Build bd609d2 auf Ubuntu 12.04.
Wenn ich tue
$ Sudo docker run -i -t ubuntu:14.04 /bin/bash
# apt-get update
Ich bekomme Fehler, wenn ich sage
Konnte "archive.ubuntu.com" nicht auflösen
Ich habe versucht, die folgende Zeile in/etc/default/docker zu kommentieren
DOCKER_OPTS = "- DNS 8.8.8.8 - DNS 8.8.4.4"
ich kann jedoch immer noch kein Ping an google.com
ping: unbekannter Host
Ich habe bestätigt, dass der Container die DNS-Server 8.8.8.8 und 8.8.4.4 verwendet
root @ 0baa87fc6322:/# cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
und ich bin in der Lage, beide Server anzupingen, also bin ich ziemlich sicher, dass eine Firewall nicht nur meine Pakete verwirft.
Jede Hilfe dazu wäre dankbar!
Vielen Dank!
Danke für deine Hilfe! Ich fand heraus, dass es ein DNS-Problem war und dass es wegen einer Firewall war. Nach einiger Suche fand ich diese Frage, die ich bei der Suche nach 'docker apt-get fail' nicht finden konnte.
Docker - Netzwerkanrufe schlagen während Image-Erstellung im Unternehmensnetzwerk fehl.
Sein Problem war ähnlich wie bei mir, und die Lösung half mir dabei, dass es funktioniert. Ich habe seine Lösung für jeden kopiert, der diese Frage in der Zukunft findet.
Auf diese Google-Server konnte nicht hinter unserer Firewall zugegriffen werden. Aus diesem Grund konnten wir keine URLs auflösen.
Die Lösung besteht darin, Docker mitzuteilen, welche DNS-Server verwendet werden sollen. Dieses Update 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 <Ihr_dns_server_1> --dns <Ihr_dns_server_2>"
Sie können beliebig viele DNS-Server zu dieser Konfiguration hinzufügen. Nachdem Sie diese Datei bearbeitet haben, möchten Sie Ihren Docker-Dienst neu starten:
Sudo Service Docker-Neustart
Binaries
Wenn Sie Docker über die Binärmethode installiert haben (d. H. Kein Paket), legen Sie die DNS-Server fest, wenn Sie den Docker-Dämon starten:
Sudo Docker -d -D --dns --dns &
Wenn Sie einen Fehler wie Could not resolve ...
sehen, handelt es sich wahrscheinlich um eine DNS-Konfiguration.
Als erstes sollten Sie cat /etc/resolv.conf
im docker-Container ausführen. Wenn es über einen ungültigen DNS-Server verfügt, beispielsweise nameserver 127.0.x.x
, kann der Container die Domänennamen nicht in IP-Adressen auflösen, sodass ping google.com
fehlschlägt.
Die zweite zu überprüfende Sache ist cat /etc/resolv.conf
auf dem Host-Rechner. Docker kopiert grundsätzlich den /etc/resolv.conf
des Hosts in den Container, wenn ein Container gestartet wird. Wenn also /etc/resolv.conf
des Hosts falsch ist, gilt dies auch für den Docker-Container.
Wenn Sie festgestellt haben, dass der /etc/resolv.conf
des Hosts falsch ist, haben Sie zwei Möglichkeiten:
Festcodieren Sie den DNS-Server in daemon.json. Dies ist einfach, aber nicht ideal, wenn Sie erwarten, dass sich der DNS-Server ändert.
Korrigieren Sie den /etc/resolv.conf
der Hosts. Dies ist etwas komplizierter, aber es wird dynamisch generiert, und Sie kodieren den DNS-Server nicht.
1. Hardcode-DNS-Server in docker daemon.json
/etc/docker/daemon.json
bearbeiten
{
"dns": ["10.1.2.3", "8.8.8.8"]
}
Starten Sie den Docker-Daemon neu, damit diese Änderungen wirksam werden:Sudo systemctl restart docker
Wenn Sie jetzt einen Container ausführen/starten, füllt das Docker /etc/resolv.conf
mit den Werten von daemon.json
.
2. /etc/resolv.conf
der Hosts korrigieren
A. Ubuntu 16.04 und früher
Für Ubuntu 16.04 und frühere Versionen wurde /etc/resolv.conf
von NetworkManager dynamisch generiert.
Kommentieren Sie die Zeile dns=dnsmasq
(mit einem #
) in /etc/NetworkManager/NetworkManager.conf
aus.
Starten Sie den NetworkManager neu, um /etc/resolv.conf
zu regenerieren:Sudo systemctl restart network-manager
Überprüfen Sie auf dem Host: cat /etc/resolv.conf
B. Ubuntu 18.04 und später
Ubuntu 18.04 wurde geändert, um systemd-resolved
ZU VERWENDEN, UM /etc/resolv.conf
zu generieren. Jetzt verwendet es standardmäßig einen lokalen DNS-Cache (127.0.0.53). Dies funktioniert nicht in einem Container. Daher verwendet Docker standardmäßig den 8.8.8.8-DNS-Server von Google, der für Benutzer hinter einer Firewall möglicherweise beschädigt wird.
/etc/resolv.conf
ist eigentlich ein Symlink (ls -l /etc/resolv.conf
), der standardmäßig in Ubuntu 18.04 auf /run/systemd/resolve/stub-resolv.conf
(127.0.0.53) verweist.
Ändern Sie einfach den Symlink, um auf /run/systemd/resolve/resolv.conf
zu verweisen, der die echten DNS-Server auflistet:Sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Überprüfen Sie auf dem Host: cat /etc/resolv.conf
Jetzt sollte auf dem Host ein gültiger /etc/resolv.conf
vorhanden sein, damit das Andockfenster in die Container kopiert werden kann.
Überprüfen Sie zuerst, ob Sie eine Verbindung haben, und pingen Sie direkt an ip 91.189.92.201
, dass archive.ubuntu.com
auf Folgendes verweist:
ping 91.189.92.201
Wenn Sie den Host immer noch nicht erreichen können, ist dies kein DNS-Problem.
Auch wenn Sie eine Internetverbindung haben, können Sie einen Hack machen. Fügen Sie einfach eine Zeile in die /etc/hosts
-Datei ein und das Problem wurde behoben:
91.189.92.201 archive.ubuntu.com
Ich stoße auf das Problem in zwei verschiedenen Fällen und die Auflösung war anders ...
Erster mit Win7 + virtualbox (Xubuntu 16.04)} .__ Dieser Kommentar hat die Aufgabe erfüllt: https://stackoverflow.com/a/29659783/2260796
Ich ändere die Datei/etc/default/docker:
DOCKER-OPTS = "- ip-masq = true --dns mein_ip_dns_win --dns 8.8.8.8 - dns 8.8.4.4" Und Renn Sudo Service Docker-Neustart
Zweite auf einem Xubuntu-Betriebssystem (ubuntu 16.04) Die vorhergehende Lösung war nicht genug . Dieser Kommentar erledigte die Aufgabe: https://github.com/docker/docker/issues/1809 Ich musste eine Zeile in der Datei /etc/NetworkManager/NetworkManager.conf kommentieren:
dns = dnsmasq
Dann renne
Starten Sie den Netzwerk-Manager neu
Ich verwende die Version von Mint und habe nach der Installation von Docker versucht, ein Abbild von Ubuntu zu erstellen, damit der Befehl apt-get update nicht erkannt wird. Um das Problem zu beheben, habe ich den Schritt zurückgesetzt
docker run -it -p 8080:80 ubuntu /bin/bash
echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts
cat /etc/hosts
apt-get update