DNS-Auflösung schlägt im Container fehl - Ursachen und Fixes
DNS-Auflösung schlägt im Container fehl - Ursachen und Fixes
curl: Could not resolve host im Container — das ist ein DNS-Problem, und es hat mehrere mögliche Ursachen.
Diagnose
resolv.conf im Container prüfen
docker exec containername cat /etc/resolv.conf
Docker schreibt beim Container-Start eine resolv.conf. Standardmäßig erbt der Container die DNS-Einstellungen des Hosts — wenn der Host-DNS kaputt ist, ist der Container-DNS auch kaputt.
DNS manuell testen
docker exec containername nslookup google.com
docker exec containername nslookup google.com 8.8.8.8
Wenn der zweite Befehl funktioniert, der erste aber nicht, ist der konfigurierte DNS-Server das Problem.
docker exec containername ping -c 2 google.com
Ursachen und Lösungen
1. Host-DNS defekt
Wenn /etc/resolv.conf auf dem Host einen nicht erreichbaren DNS-Server enthält, erbt der Container das Problem.
Fix: DNS explizit in daemon.json setzen
sudo nano /etc/docker/daemon.json
{
"dns": ["8.8.8.8", "1.1.1.1"]
}
sudo systemctl restart docker
2. DNS per Compose pro Stack setzen
Alternativ DNS nur für bestimmte Services konfigurieren:
services:
myapp:
image: myimage
dns:
- 8.8.8.8
- 1.1.1.1
3. VPN blockiert Docker-DNS
VPN-Software verändert oft Routing-Tabellen und DNS-Einstellungen. Docker-Container können dann externe Domains nicht mehr auflösen.
Diagnose: VPN deaktivieren und prüfen, ob DNS wieder funktioniert. Falls das der Fall ist, muss der VPN-Client so konfiguriert werden, dass er die Docker-Netzwerk-Interfaces (docker0, br-*) auslässt.
4. --network host umgeht Docker-DNS
Mit network_mode: host nutzt der Container den Host-Netzwerk-Stack direkt — einschließlich des Host-DNS. Wenn der Host-DNS nicht funktioniert, hat der Container kein DNS.
# Vorsicht:
network_mode: host
# → kein Docker-DNS, kein Service-Discovery
5. Firewall blockiert Port 53
Wenn iptables oder ufw ausgehende UDP/TCP-Verbindungen auf Port 53 blockiert:
# Auf dem Host prüfen
sudo iptables -L OUTPUT -n | grep 53
Internes DNS zwischen Containern
Docker hat einen eingebauten DNS-Server für Service-Discovery — aber nur auf user-defined networks, nicht auf dem Default Bridge Network (docker0).
# Funktioniert nicht auf Default Bridge:
docker exec containerA nslookup containerB # NXDOMAIN
# Funktioniert auf user-defined network:
docker network create mynet
docker run --network mynet --name api ...
docker run --network mynet --name web ...
docker exec web nslookup api # → gibt IP zurück
Compose erstellt automatisch ein user-defined Network — deshalb funktioniert Service-Discovery in Compose-Stacks ohne Konfiguration.
Zusammenfassung
| Symptom | Ursache | Fix |
|---------|---------|-----|
| Kein externer DNS | Host-DNS defekt | dns in daemon.json setzen |
| Nur mit explizitem DNS-Server | Falsche resolv.conf | daemon.json oder Compose dns: |
| Nach VPN-Verbindung | VPN überschreibt DNS | VPN-Konfiguration anpassen |
| Service-Name nicht auflösbar | Default Bridge Network | User-defined Network nutzen |
Weiterführend
DNS-Grundlagen, resolv.conf und Linux-Netzwerkkonfiguration sind Themen jenseits von Docker — weiterführende Artikel gibt es auf nolr.nexon.cyou.