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.