Wie man die Verbindung zwischen Docker-Containern testet

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-411613{{"Wie man die Verbindung zwischen Docker-Containern testet"}} docker/ls -.-> lab-411613{{"Wie man die Verbindung zwischen Docker-Containern testet"}} docker/ps -.-> lab-411613{{"Wie man die Verbindung zwischen Docker-Containern testet"}} docker/exec -.-> lab-411613{{"Wie man die Verbindung zwischen Docker-Containern testet"}} docker/inspect -.-> lab-411613{{"Wie man die Verbindung zwischen Docker-Containern testet"}} docker/network -.-> lab-411613{{"Wie man die Verbindung zwischen Docker-Containern testet"}} end

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
run containers

Die Erklärung der Befehlsparameter:

  • -d: Führt den Container im detachierten Modus (im Hintergrund) aus
  • --name: Weist dem Container einen Namen zu
  • ubuntu: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:

  1. Verwenden docker exec, um Befehle in einem laufenden Container auszuführen
  2. Aktualisieren die Paketliste mit apt-get update
  3. Installieren Netzwerktools (iputils-ping für Ping, net-tools für Netstat, iproute2 für IP-Befehle und curl)

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 ist
  • host: 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:

  1. Container auf verschiedenen Netzwerken ohne richtige Routierung
  2. Firewall- oder Sicherheitsgruppen-Einstellungen blockieren den Netzwerkverkehr
  3. Die Anwendung hört nicht auf der erwarteten IP-Adresse/Port
  4. Netzwerkkonfigurationsfehler
  5. 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:

  1. Verifizieren Sie, dass die Container im Laufenden sind: docker ps
  2. Überprüfen Sie, ob sie auf dem gleichen Netzwerk sind: docker network inspect <network>
  3. Verifizieren Sie, dass IP-Adressen zugewiesen sind: docker inspect <container>
  4. Testen Sie die grundlegende Verbindung (Ping): docker exec <container> ping <target>
  5. Überprüfen Sie, ob die Anwendung lauscht: docker exec <container> netstat -tuln
  6. Verifizieren Sie, dass die DNS-Auflösung funktioniert: docker exec <container> nslookup <target>
  7. Suchen Sie nach Firewallproblemen: docker exec <container> iptables -L
  8. Ü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.