Einführung
Docker-Container sind zu einem grundlegenden Bestandteil der modernen Anwendungsentwicklung und -bereitstellung geworden. Wenn Sie mit mehreren Containern arbeiten, ist es entscheidend, dass die richtige Verbindung zwischen ihnen besteht, damit Ihre Anwendungen korrekt funktionieren.
In diesem Lab werden Sie lernen, wie Sie die Verbindung zwischen Docker-Containern überprüfen und Fehler beheben. Wir beginnen mit den grundlegenden Docker-Container-Konzepten, setzen Container für die Tests auf und erkunden dann verschiedene Methoden, um die Netzwerkverbindungen zwischen Containern zu überprüfen und zu diagnostizieren.
Am Ende dieses Tutorials werden Sie in der Lage sein, die Verbindungsprobleme in Ihren containerisierten Anwendungen zu testen, zu überprüfen und zu beheben.
Dieses Lab erfordert eine Internetverbindung zum Lernen. Daher können nur Pro-Benutzer die VM starten. Upgrade Ihr Konto zu Pro.
Einrichten von Docker-Containern für die Tests
Bevor wir die Verbindung zwischen Containern testen können, müssen wir einige Container erstellen, mit denen wir arbeiten können. In diesem Schritt werden wir zwei einfache Docker-Container einrichten und uns mit den grundlegenden Docker-Befehlen vertraut machen.
Das Verständnis von Docker-Containern
Docker-Container sind leichte, eigenständige Pakete, die alles enthalten, was erforderlich ist, um eine Anwendung auszuführen: Code, Laufzeitumgebung, Systemtools, Bibliotheken und Einstellungen. Container teilen den Betriebssystemkern des Hostcomputers, laufen jedoch in isolierten Umgebungen.
Erstellen von Testcontainern
Lassen Sie uns beginnen, indem wir zwei einfache Container basierend auf dem Ubuntu-Image erstellen. Wir werden diese Container während des gesamten Labs verwenden, um die Verbindung zwischen ihnen zu testen.
Zunächst erstellen wir unseren ersten Container:
docker run -d --name container1 ubuntu:22.04 sleep infinity
Jetzt erstellen wir den zweiten Container:
docker run -d --name container2 ubuntu:22.04 sleep infinity

Die Erklärung der Befehlsparameter:
-d: Führt den Container im detachierten Modus (im Hintergrund) aus--name: Weist dem Container einen Namen zuubuntu:22.04: Das zu verwendende Docker-Image (Ubuntu-Version 22.04)sleep infinity: Ein Befehl, der den Container unendlich lange läuft
Überprüfen, ob unsere Container im Laufenden sind
Um zu überprüfen, ob unsere Container richtig laufen, verwenden Sie folgenden Befehl:
docker ps
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8d97c645cce ubuntu:22.04 "sleep infinity" 5 seconds ago Up 4 seconds container2
a2c516a57cb8 ubuntu:22.04 "sleep infinity" 18 seconds ago Up 17 seconds container1
Wenn Sie nicht beide Container aufgelistet sehen, haben sie möglicherweise nicht richtig gestartet. Sie können versuchen, sie erneut zu erstellen.
Installieren von Netzwerktools
Standardmäßig ist das Ubuntu-Containerimage sehr minimal und enthält keine Netzwerktools, die wir benötigen. Lassen Sie uns diese Tools in beiden Containern installieren:
Für container1:
docker exec container1 apt-get update
docker exec container1 apt-get install -y iputils-ping net-tools iproute2 curl
Für container2:
docker exec container2 apt-get update
docker exec container2 apt-get install -y iputils-ping net-tools iproute2 curl
Diese Befehle:
- Verwenden
docker exec, um Befehle in einem laufenden Container auszuführen - Aktualisieren die Paketliste mit
apt-get update - Installieren Netzwerktools (
iputils-pingfür Ping,net-toolsfür Netstat,iproute2für IP-Befehle undcurl)
Jetzt sind unsere Container für die Verbindungstests in den nächsten Schritten bereit.
Das Verständnis von Docker-Netzen
Docker-Container kommunizieren miteinander über Netzwerke. Das Verständnis, wie Docker-Netzwerke funktionieren, ist essentiell für das Testen und das Beheben von Verbindungsproblemen zwischen Containern.
Grundlagen von Docker-Netzen
Wenn Sie Docker installieren, werden automatisch mehrere Standardnetze erstellt. Die am häufigsten verwendeten sind:
bridge: Das Standardnetzwerk, zu dem die Container sich verbinden, wenn kein anderes Netzwerk angegeben isthost: Die Container verwenden das Netzwerk des Hosts direkt (keine Isolation)none: Die Container haben keinen Netzwerkzugang
Lassen Sie uns die Netzwerke auf Ihrem System untersuchen:
docker network ls
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
NETWORK ID NAME DRIVER SCOPE
1b95853bf83b bridge bridge local
91199fc6ad2e host host local
1078d2c781b6 none null local
Das Verständnis des Standardbrückennetzwerks
Standardmäßig sind beide unserer Container mit dem Standardbrückennetzwerk verbunden. Lassen Sie uns dieses Netzwerk untersuchen:
docker network inspect bridge
Dieser Befehl zeigt detaillierte Informationen über das Brückennetzwerk an, einschließlich der mit ihm verbundenen Container und ihrer IP-Adressen. In der Ausgabe suchen Sie den Abschnitt "Containers", um sowohl container1 als auch container2 mit ihren IP-Adressen aufzulisten.
Finden von Container-IP-Adressen
Um mit der Containerverbindung umzugehen, müssen wir wissen, welche IP-Adressen unseren Containern zugewiesen wurden. Es gibt mehrere Möglichkeiten, diese Informationen zu erhalten:
Mit docker inspect:
docker inspect --format='{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container1
Oder von innerhalb des Containers:
docker exec container1 hostname -i
Notieren Sie sich die IP-Adressen für beide Container:
docker exec container1 hostname -i
docker exec container2 hostname -i
Die Ausgabe wird die IP-Adresse für jeden Container anzeigen, die normalerweise mit 172.17.0.x auf dem Standardbrückennetzwerk beginnt.
Erstellen eines benutzerdefinierten Docker-Netzwerks
Während das Standardbrückennetzwerk die Containerkommunikation ermöglicht, bietet das Erstellen eines benutzerdefinierten Netzwerks eine bessere Isolation und eine integrierte DNS-Auflösung (Container können sich gegenseitig per Namen und nicht per IP erreichen).
Lassen Sie uns ein benutzerdefiniertes Brückennetzwerk erstellen:
docker network create --driver bridge my-network
Jetzt verbinden wir unsere vorhandenen Container mit diesem neuen Netzwerk:
docker network connect my-network container1
docker network connect my-network container2
Wir können überprüfen, ob unsere Container mit dem neuen Netzwerk verbunden sind:
docker network inspect my-network
Jetzt sind unsere Container sowohl mit dem Standardbrückennetzwerk als auch mit unserem benutzerdefinierten my-network verbunden. Im nächsten Schritt werden wir die Verbindung zwischen ihnen testen.
Testen der grundlegenden Verbindung zwischen Containern
Jetzt, nachdem wir unsere Container eingerichtet und mit Netzwerken verbunden haben, können wir die Verbindung zwischen ihnen testen. Wir werden mehrere Methoden verwenden, um zu verifizieren, dass die Container miteinander kommunizieren können.
Verwenden von Ping zum Testen der Verbindung
Der einfachste Weg, um die grundlegende Netzwerkverbindung zu testen, ist die Verwendung des ping-Befehls, der ICMP-Echo-Anfragen an den Zielhost sendet.
Lassen Sie uns von container1 nach container2 mit der IP-Adresse pingen:
## Zunächst erhalten wir die IP-Adresse von container2
CONTAINER2_IP=$(docker exec container2 hostname -i)
echo "Container2 IP: $CONTAINER2_IP"
## Wir erhalten die erste IP-Adresse von CONTAINER2_IP
CONTAINER2_IP=$(echo $CONTAINER2_IP | cut -d' ' -f1)
echo "Container2 IP: $CONTAINER2_IP"
## Jetzt pingen wir von container1 nach container2
docker exec container1 ping -c 4 $CONTAINER2_IP
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.095 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.090 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.087 ms
--- 172.17.0.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.067/0.085/0.095/0.000 ms
Testen der DNS-Auflösung
Ein Vorteil benutzerdefinierter Docker-Netze ist, dass sie eine automatische DNS-Auflösung bieten, was es Containern ermöglicht, sich gegenseitig per Namen zu erreichen.
Lassen Sie uns die DNS-Auflösung testen, indem wir den Container per Namen pingen:
docker exec container1 ping -c 4 container2
Dies sollte funktionieren, da beide Container in unserem benutzerdefinierten my-network sind, das die DNS-Auflösung bietet. Sie sollten ähnliche Ping-Antworten wie im vorherigen Test sehen, aber mit dem Container-Namen statt der IP.
Verwenden von curl zum Testen der HTTP-Verbindung
Für Anwendungen, die Webdienste ausführen, müssen wir oft die HTTP-Verbindung testen. Lassen Sie uns einen einfachen HTTP-Server in container2 einrichten und die Verbindung zu ihm von container1 testen.
Zunächst starten wir einen grundlegenden HTTP-Server in container2:
docker exec container2 apt-get install -y python3
docker exec -d container2 bash -c "echo 'Hello from container2' > /index.html && cd / && python3 -m http.server 8080"
Warten Sie einige Sekunden, bis der Server gestartet ist, und testen Sie dann die Verbindung von container1:
docker exec container1 curl -s http://container2:8080
Sie sollten die Ausgabe sehen:
Hello from container2
Dies bestätigt, dass container1 die HTTP-Dienstleistung von container2 über den Container-Namen für die DNS-Auflösung erreichen kann.
Testen der Verbindung mit verschiedenen Methoden
Es ist auch nützlich, zu wissen, wie man die Verbindung mit anderen Tools testet. Lassen Sie uns versuchen, nc (netcat) zu verwenden, um zu überprüfen, ob ein bestimmter Port geöffnet ist:
## Stellen Sie sicher, dass netcat in container1 installiert ist
docker exec container1 apt-get install -y netcat
## Testen Sie die Verbindung zum HTTP-Server auf container2
docker exec container1 nc -zv container2 8080
Sie sollten eine Ausgabe sehen, die angibt, dass die Verbindung erfolgreich war:
Connection to container2 (172.18.0.3) 8080 port [tcp/*] succeeded!
Diese Tests bestätigen, dass unsere Container miteinander sowohl auf Netzwerkebene (ping) als auch auf Anwendungsbene (HTTP) kommunizieren können.
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.
Zusammenfassung
In diesem Lab haben Sie gelernt, wie Sie die Verbindung zwischen Docker-Containern testen und beheben können. Sie haben:
- Docker-Container erstellt und für das Netzwerk konfiguriert
- Grundlagen von Docker-Netzen kennengelernt, einschließlich Standard- und benutzerdefinierter Netzwerke
- Verschiedene Tools verwendet, um die grundlegende Verbindung zwischen Containern zu testen (Ping, Curl, Netcat)
- Häufige Verbindungsprobleme untersucht und systematische Behebungsmethoden gelernt
Diese Fähigkeiten sind essentiell für die Entwicklung und Wartung von Docker-basierten Anwendungen, insbesondere in Mikroservices-Architekturen, in denen mehrere Container miteinander kommunizieren müssen.
Für weitere Lernaktivitäten können Sie Docker Compose für Anwendungen mit mehreren Containern erkunden, Docker Swarm oder Kubernetes für die Containerorchestrierung und fortgeschrittene Netzwerkkonzepte wie Overlay-Netzwerke für Multi-Host-Bereitstellungen.



