Beheben von Verbindungsproblemen zwischen Containern
Sie können diesen Schritt überspringen, wenn Sie keine Verbindungsprobleme haben.
Jetzt, nachdem wir verstehen, wie wir die Verbindung zwischen Containern testen, werden wir untersuchen, wie wir häufige Verbindungsprobleme beheben können.
Häufige Verbindungsprobleme
Wenn Sie mit Docker-Container-Netzen umgehen, können Sie mehrere häufige Probleme auftauchen:
- Container auf verschiedenen Netzwerken ohne richtige Routierung
- Firewall- oder Sicherheitsgruppen-Einstellungen blockieren den Netzwerkverkehr
- Die Anwendung hört nicht auf der erwarteten IP-Adresse/Port
- Netzwerkkonfigurationsfehler
- DNS-Auflösungsfehler
Lassen Sie uns die Behebungsschritte für jedes dieser potenziellen Probleme durchgehen.
Überprüfen der Netzwerkkonfiguration
Zunächst untersuchen wir die Netzwerkkonfiguration unserer Container:
## Zeigen Sie die Netzwerkschnittstellen von container1 an
docker exec container1 ip addr show
## Zeigen Sie die Netzwerkschnittstellen von container2 an
docker exec container2 ip addr show
Die Ausgabe zeigt alle Netzwerkschnittstellen in jedem Container. Jede verbundene Docker-Netzwerk-Schnittstelle erscheint als eth
-Schnittstelle mit ihrer zugewiesenen IP-Adresse.
Überprüfen der Netzwerkrouten
Lassen Sie uns die Routierungskonfiguration in unseren Containern überprüfen:
docker exec container1 route -n
Dies zeigt die Routentabelle für container1 an, die angibt, wohin der Netzwerkverkehr weitergeleitet wird.
Überprüfen der lauschenden Ports
Um zu bestimmen, ob eine Anwendung richtig auf Verbindungen wartet, verwenden Sie:
docker exec container2 netstat -tuln
Dies zeigt alle TCP- und UDP-Ports an, auf denen gewartet wird. Unser HTTP-Server sollte auf Port 8080 lauschen.
Diagnose mit tcpdump
Für eine detailliertere Netzwerkverkehrsanalyse können wir tcpdump
verwenden, um Pakete zu erfassen und zu analysieren:
## Installieren Sie tcpdump in container1
docker exec container1 apt-get install -y tcpdump dnsutils
## Erfassen Sie Pakete für 10 Sekunden
docker exec container1 timeout 10 tcpdump -i eth0 -n
Während dies läuft, öffnen Sie ein weiteres Terminal und erzeugen Sie etwas Netzwerkverkehr:
docker exec container1 ping -c 3 container2
Sie sollten sehen, dass die ICMP-Pakete im tcpdump-Ausgabe erfasst werden.
Überprüfen der Docker-DNS-Auflösung
Wenn Sie Probleme mit der DNS-Auflösung zwischen Containern haben:
## Überprüfen Sie die DNS-Konfiguration
docker exec container1 cat /etc/resolv.conf
## Testen Sie die DNS-Auflösung
docker exec container1 nslookup container2
Simulieren eines Netzwerkproblems
Lassen Sie uns ein Verbindungsproblem simulieren, indem wir container1 temporär von unserem benutzerdefinierten Netzwerk trennen:
## Trennen Sie container1 von my-network
docker network disconnect my-network container1
## Versuchen Sie, per Namen zu pingen (dies sollte fehlschlagen)
docker exec container1 ping -c 2 container2
Sie sollten sehen, dass der Ping fehlschlägt, weil container1 nach dem Trennen vom gemeinsamen Netzwerk nicht mehr container2 per Namen auflösen kann.
Verbinden wir es erneut:
## Verbinden Sie container1 mit my-network
docker network connect my-network container1
## Verifizieren Sie, dass die Verbindung wiederhergestellt ist
docker exec container1 ping -c 2 container2
Jetzt sollte der Ping wieder funktionieren, was zeigt, wie die Container auf dem gleichen Netzwerk sein müssen, damit die Namensauflösung funktioniert.
Behebungskontrollliste
Wenn Sie mit Verbindungsproblemen zwischen Containern konfrontiert sind, folgen Sie dieser Kontrollliste:
- Verifizieren Sie, dass die Container im Laufenden sind:
docker ps
- Überprüfen Sie, ob sie auf dem gleichen Netzwerk sind:
docker network inspect <network>
- Verifizieren Sie, dass IP-Adressen zugewiesen sind:
docker inspect <container>
- Testen Sie die grundlegende Verbindung (Ping):
docker exec <container> ping <target>
- Überprüfen Sie, ob die Anwendung lauscht:
docker exec <container> netstat -tuln
- Verifizieren Sie, dass die DNS-Auflösung funktioniert:
docker exec <container> nslookup <target>
- Suchen Sie nach Firewallproblemen:
docker exec <container> iptables -L
- Überprüfen Sie die Containerprotokolle:
docker logs <container>
Das Verwenden dieses systematischen Ansatzes wird Ihnen helfen, die meisten Verbindungsprobleme zwischen Containern zu identifizieren und zu beheben.