Ich habe eine neue Ubuntu 14.04-Installation und möchte Docker verwenden, um meine alten Sachen auszuführen, die 12.04 benötigen. DNS in Docker funktioniert nicht.
Die resolv.conf meines Laptops sieht so aus:
nameserver 127.0.0.1
Was bei Docker anscheinend nicht funktioniert. Es wird daher versucht, die Nameserver auf 8.8.8.8 und 8.8.4.4 zu setzen; wenn ich es tue
$ sudo docker run -i -t ubuntu /bin/bash
Es sagt:
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
Und tatsächlich sieht die Datei resolv.conf in der Docker-Instanz folgendermaßen aus:
nameserver 8.8.8.8
nameserver 8.8.4.4
Ich kann beide von der Docker-Instanz aus erfolgreich pingen. Es ist jedoch kein DNS vorhanden (z ping google.com
. B. fehlgeschlagen).
ifconfig-Ausgabe in Docker:
eth0 Link encap:Ethernet HWaddr aa:e9:9f:83:9d:92
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:648 (648.0 B) TX bytes:738 (738.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Was jetzt?
quelle
Ich benutze Docker nicht selbst, daher würde ich normalerweise nicht auf eine Docker-Frage eingehen, aber ich habe gerade darüber gelesen und bin auf eine Docker-Dokumentation gestoßen, die genau dieses Problem zu lösen scheint . Um zusammenzufassen...
In der Dokumentation werden einige Problemumgehungen vorgeschlagen. Der erste besteht darin, den DNS-Server anzugeben, der vom Docker-Daemon für die Container verwendet werden soll, indem die folgende Zeile hinzugefügt wird
/etc/default/docker
:Bei dem bereitgestellten DNS kann es sich um einen lokalen DNS-Server handeln, z. B. 192.168.1.1 (Gateway). Starten Sie dann mit neu
Eine alternative Lösung besteht darin, dnsmasq in NetworkManager zu deaktivieren, indem Sie die Konfiguration folgendermaßen auskommentieren
/etc/NetworkManager/NetworkManager.conf
:Starten Sie dann beide neu
quelle
/etc/default/docker
hat dies keine Auswirkung mehr. In meiner Lösung erfahren Sie, wie Sie dieses Problem in einer Welt nach init.d / upstart lösen können./etc/NetworkManager/NetworkManager.conf
existiert nicht auf Ubuntu 18.04 LTS. : /systemd-resolved
standardmäßig als DNS-Cache-Server fungiert und dasWARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.
Problem verursacht (Ubuntu 16.04-Setups scheinen es nicht standardmäßig zu aktivieren). Die Problemumgehung besteht darin,systemd-resolved
die--dns
Option beim Starten des Containers zu deaktivieren oder zu verwenden, wie in der Hauptantwort angegeben.Ich bin in meiner spezifischen Situation darauf gestoßen
npm install
von einem benutzerdefinierten Repository im VPN innerhalb des Containers ausgeführt.npm
eine erfolgreiche DNS-Suche nicht möglich istUbuntu verwendet standardmäßig
dnsmasq
den von NetworkManager gestarteten Cache für DNS-Anforderungen und konfiguriert/etc/resolv.conf
, um auf diese Instanz zu verweisen127.0.1.1
/etc/resolv.conf
der die NetworkManager-Konfiguration überschreibt/etc/resolv.conf
Container standardmäßigdnsmasq
Situation kennt) .docker0
Netzwerkbrücke zu den DNS-Servern über den VPN-tap0
Adapter.Die Lösung :
Es scheint eleganter zu sein, NetworkManager und seine Captive-
dnsmasq
Instanz so zu verwenden, wie sie entworfen wurden.Weisen Sie Docker an, Ihre
dnsmasq
Instanz für DNS zu verwendenFügen Sie eine Datei hinzu oder bearbeiten Sie sie
/etc/docker/daemon.json
, um Docker anzuweisen, dendocker0
Bridge-Adapter für DNS zu verwendenKonfigurieren Sie die NM-
dnsmasq
Instanz so, dass sie auch die Docker-Bridges überwacht, da standardmäßig nur 127.0.1.1 - create file abgehört wird/etc/NetworkManager/dnsmasq.d/docker-bridge.conf
Ich mag das unhöfliche Verhalten dieses VPN-Clients nicht und ich würde das DNS lieber nur am VPN-Ende für VPN-Lookups verwenden (wenn Sie einen höflichen VPN-Client haben, der NetworkManager richtig konfiguriert hat, müssen Sie dies nicht tun )
resolv.conf
beim Herstellen der Verbindung beendet und alle DNS-Vorgänge werdendnsmasq
erneut ausgeführt.)Fügen Sie eine Konfigurationsdatei hinzu, um
dnsmasq
die DNS-Anforderungen für Ihre Domain entsprechend zu leiten - fügen Sie die Datei `/etc/NetworkManager/dnsmasq.d/vpn-dns.conf hinzuFügen Sie optional eine Suchdomäne für Ihre Domäne hinzu, damit Sie Kurznamen verwenden können
Starten Sie NetworkManager und Docker neu
Zu diesem Zeitpunkt sollten Ihre Docker-Container in der Lage sein,
nslookup
Probleme zu vermeiden, wenn Sie sich in einem VPN befinden, und zwar für Domänen innerhalb und außerhalb Ihres VPN.quelle
cannot unmarshal string into Go value of type []string
beim Neustart des Docker-Dienstes.Hier ist, wie ich Docker auf meinem Ubuntu 14.04 Server einrichte, der ohne Kopf läuft.
Ich verwende Ubuntu Server 14.04 mit der folgenden Docker-Version.
Die Datei /etc/init/docker.io.conf und das Skript enthalten die folgende Zeile:
Die Antwort oben hat mir geholfen, die Datei oben zu finden.
Ich habe das Folgende in /etc/default/docker.io auskommentiert und meinen lokalen DNS-Server hinzugefügt:
Service neu gestartet mit:
Ran
docker run <image> /bin/bash
Keine DNS-Meldungen beim Starten des Containers.
Startete einen neuen Container, installierte dnsutils.
Ran dig und die Servermeldung ist der richtige lokale DNS-Server.
quelle
Ich hatte ein ähnliches Problem und habe es StackOverflow gemeldet . Es scheint, dass ich den
8.8.8.8
in der Ubuntu-Standardinstallation von Docker angegebenen Nameserver nicht abfragen konnte . Ich könnte es jedoch anpingen. Verwenden Sie in diesem Fall einen DNS-Server, den Sie tatsächlich abfragen können. Testen Sie mitund starte den Container über
Ich habe noch keinen Weg zu https://askubuntu.com/q/607172/30266 gefunden , um eine automagic-Lösung abzuleiten.
quelle
Sie können den lokalen DNS-Resolver des Hosts (z. B.
dnsmasq
) aus Ihren Docker-Containern verwenden, wenn diese sich in einem benutzerdefinierten Netzwerk befinden . In diesem Fall verfügt ein Container/etc/resolv.conf
über den Nameserver127.0.0.11
(auch bekannt als der eingebettete DNS-Server des Dockers ), der DNS-Anforderungen ordnungsgemäß an die Loopback-Adresse des Hosts weiterleiten kann.Wenn Sie verwenden
docker-compose
, wird automatisch ein benutzerdefiniertes Netzwerk für Ihre Container eingerichtet (mit einem Dateiformat von v2 + ). Beachten Sie jedoch, dassdocker-compose
Container zwar in einem benutzerdefinierten Netzwerk ausgeführt werden, diese jedoch weiterhin im Standardnetzwerk erstellt werden . Um ein benutzerdefiniertes Netzwerk für Builds zu verwenden, können Sie dennetwork
Parameter in der Build-Konfiguration angeben (erfordert das Dateiformat v3.4 + ).quelle