Eintauchen in das Docker-Networking

DockerBeginner
Jetzt üben

Einführung

In diesem Lab werden wir fortgeschrittene Konzepte des Docker-Networkings untersuchen und auf den Grundlagen aufbauen. Wir tauchen tief in die drei Hauptnetzwerkmodi ein: Bridge, Host und None. Zudem lernen Sie, wie Sie benutzerdefinierte Netzwerke erstellen, Container über verschiedene Netzwerke hinweg verbinden und verstehen die Auswirkungen der jeweiligen Netzwerkmodi auf die Kommunikation und Isolierung von Containern. Diese praktische Erfahrung wird Ihnen ein solides Fundament für die Arbeit mit Docker-Netzwerken vermitteln.

Dies ist ein geführtes Lab, das Schritt-für-Schritt-Anleitungen bietet, um Ihnen beim Lernen und Üben zu helfen. Folgen Sie den Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrung zu sammeln. Historische Daten zeigen, dass dies ein Lab für Anfänger ist, mit einer Abschlussquote von 98%. Es hat eine positive Bewertungsrate von 100% von den Lernenden erhalten.

Benutzerdefinierte Bridge-Netzwerke

Obwohl Docker ein Standard-Bridge-Netzwerk bereitstellt, bietet das Erstellen benutzerdefinierter Bridge-Netzwerke eine bessere Isolierung und Kontrolle über die Kommunikation zwischen den Containern.

  1. Schauen wir uns zunächst die aktuelle Liste der Docker-Netzwerke an:
docker network ls

Sie sollten eine Ausgabe ähnlich dieser sehen:

NETWORK ID     NAME      DRIVER    SCOPE
296d1b460b17   bridge    bridge    local
91199fc6ad2e   host      host      local
1078d2c781b6   none      null      local
  1. Erstellen wir nun ein benutzerdefiniertes Bridge-Netzwerk:
docker network create my-custom-bridge
  1. Listen Sie alle Docker-Netzwerke erneut auf, um die Erstellung zu überprüfen:
docker network ls

In der Ausgabe sollte nun my-custom-bridge erscheinen:

NETWORK ID     NAME               DRIVER    SCOPE
296d1b460b17   bridge             bridge    local
91199fc6ad2e   host               host      local
7215f99d0080   my-custom-bridge   bridge    local
1078d2c781b6   none               null      local
  1. Starten Sie zwei Container im benutzerdefinierten Bridge-Netzwerk und installieren Sie Ping:
docker run --network=my-custom-bridge --name container1 -d nginx
docker run --network=my-custom-bridge --name container2 -d nginx

Nun installieren wir das Ping-Dienstprogramm in beiden Containern. Dies ist notwendig, da das Standard-Nginx-Image kein Ping enthält:

docker exec container1 apt-get update && docker exec container1 apt-get install -y iputils-ping
docker exec container2 apt-get update && docker exec container2 apt-get install -y iputils-ping
  1. Testen Sie die Kommunikation zwischen den Containern:
docker exec container1 ping -c 4 container2

Sie sollten erfolgreiche Ping-Antworten sehen. Dies beweist, dass Container im selben benutzerdefinierten Bridge-Netzwerk über ihre Containernamen kommunizieren können. Das funktioniert, weil der integrierte DNS-Server von Docker die Containernamen innerhalb desselben Netzwerks in ihre IP-Adressen auflöst.

Falls die Pings fehlschlagen, stellen Sie sicher, dass beide Container laufen (docker ps) und dass das Ping-Tool korrekt installiert wurde.

Container über Netzwerke hinweg verbinden

Docker ermöglicht es, Container mit mehreren Netzwerken zu verbinden, was die Kommunikation zwischen Containern in unterschiedlichen Netzwerken erlaubt. Dies ist besonders nützlich, wenn Sie bestimmte Container isolieren möchten, aber dennoch gezielte Kommunikationswege zulassen müssen.

  1. Erstellen wir zunächst ein zweites benutzerdefiniertes Bridge-Netzwerk:
docker network create my-second-bridge
  1. Überprüfen Sie die Erstellung des Netzwerks:
docker network ls

Sie sollten nun beide benutzerdefinierten Netzwerke sehen:

NETWORK ID     NAME               DRIVER    SCOPE
296d1b460b17   bridge             bridge    local
91199fc6ad2e   host               host      local
7215f99d0080   my-custom-bridge   bridge    local
8a15f99d0081   my-second-bridge   bridge    local
1078d2c781b6   none               null      local
  1. Verbinden Sie container2 mit dem neuen Netzwerk:
docker network connect my-second-bridge container2

Dieser Befehl fügt container2 zum Netzwerk my-second-bridge hinzu, während die Verbindung zu my-custom-bridge bestehen bleibt.

  1. Erstellen Sie einen neuen Container im zweiten Netzwerk:
docker run --network=my-second-bridge --name container3 -d nginx
docker exec container3 apt-get update && docker exec container3 apt-get install -y iputils-ping
  1. Testen Sie die Kommunikation zwischen allen Containern:
docker exec container1 ping -c 2 container2
docker exec container1 ping -c 2 container3
docker exec container2 ping -c 2 container3

Beachten Sie die Ergebnisse:

  • container1 kann mit container2 kommunizieren (sie befinden sich im selben Netzwerk).
  • container1 kann nicht mit container3 kommunizieren (sie befinden sich in unterschiedlichen Netzwerken).
  • container2 kann sowohl mit container1 als auch mit container3 kommunizieren (er ist mit beiden Netzwerken verbunden).

Falls container1 den container3 anpingen könnte, gäbe es ein Problem mit Ihrer Netzwerkisolierung.

Host-Netzwerkmodus

Der Host-Netzwerkmodus hebt die Netzwerkisolierung zwischen dem Container und dem Docker-Host auf. Dadurch kann der Container das Netzwerk des Hosts direkt nutzen. Dies kann zur Maximierung der Performance nützlich sein, bringt jedoch Sicherheitsrisiken mit sich, da die Isolierung verringert wird.

  1. Erstellen Sie einen Container im Host-Netzwerkmodus:
docker run --network host --name host-container -d nginx
  1. Überprüfen Sie die aktuelle Netzwerkliste:
docker network ls

Sie werden kein neues Netzwerk für diesen Container sehen, da er direkt das Netzwerk des Hosts verwendet.

  1. Bestätigen Sie, dass der Container das Host-Netzwerk nutzt:
docker inspect --format '{{.HostConfig.NetworkMode}}' host-container

Die Ausgabe sollte host lauten.

  1. Versuchen Sie, die Standard-Nginx-Seite von Ihrem Host-Rechner aus aufzurufen:
curl localhost:80

Sie sollten die Nginx-Willkommensseite sehen. Dies funktioniert, weil der Container das Netzwerk des Hosts nutzt und Nginx auf Port 80 der Netzwerkschnittstelle des Hosts lauscht.

Hinweis: Falls bereits ein Dienst auf Port 80 Ihres Hosts läuft, könnte dieser Schritt fehlschlagen. In diesem Fall müssten Sie den bestehenden Dienst zuerst stoppen.

None-Netzwerkmodus

Der 'none'-Netzwerkmodus erstellt Container ohne Netzwerkschnittstelle und isoliert sie vollständig vom Netzwerk. Dies ist für maximale Sicherheitsisolierung nützlich, bedeutet aber auch, dass der Container keinerlei Netzwerkkommunikation führen kann.

  1. Erstellen Sie einen Container ohne Netzwerk:
docker run --network none --name isolated-container -d alpine sleep infinity
  1. Überprüfen Sie die aktuelle Netzwerkliste:
docker network ls

Es erscheint kein neues Netzwerk, da der Container mit keinem Netzwerk verbunden ist.

  1. Überprüfen Sie, dass der Container keine Netzwerkschnittstelle besitzt:
docker exec isolated-container ip addr

Sie sollten lediglich das Loopback-Interface (lo) sehen. Es wird kein eth0 oder andere Netzwerkschnittstellen geben.

  1. Versuchen Sie, Google vom isolierten Container aus anzupingen:
docker exec isolated-container ping -c 2 google.com

Dies sollte mit der Fehlermeldung "Network is unreachable" fehlschlagen, da der Container keinen Netzwerkzugriff hat.

Netzwerk-Aliase und Service Discovery

Docker-Netzwerke unterstützen Service Discovery mittels Netzwerk-Aliasen, was für den Aufbau resilienter und skalierbarer Anwendungen nützlich ist. Diese Funktion ermöglicht es mehreren Containern, auf denselben DNS-Namen zu reagieren, was ein einfaches Load Balancing ermöglicht.

  1. Erstellen Sie ein neues Bridge-Netzwerk für diese Übung:
docker network create service-network
  1. Überprüfen Sie die Erstellung des Netzwerks:
docker network ls

service-network sollte in der Liste erscheinen.

  1. Erstellen Sie zwei Container mit demselben Netzwerk-Alias:
docker run -d --network service-network --network-alias myservice --name service1 nginx
docker run -d --network service-network --network-alias myservice --name service2 nginx
  1. Erstellen Sie einen Client-Container und nutzen Sie nslookup, um den Dienst aufzulösen:
docker run --rm --network service-network appropriate/curl nslookup myservice

Sie sollten die IP-Adressen beider Container zurückerhalten. Dies zeigt, dass der eingebettete DNS-Server von Docker die Last zwischen den beiden Containern verteilt.

  1. Testen Sie den Zugriff auf den Dienst mehrfach:
for i in {1..4}; do docker run --rm --network service-network appropriate/curl ping -c 1 myservice; done

Sie sollten Antworten von beiden Containern sehen, was das grundlegende Load Balancing demonstriert. Der Docker-DNS-Server wechselt bei der Auflösung von myservice zwischen den beiden IP-Adressen ab.

PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.106 ms

--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.106/0.106/0.106 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.119 ms

--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.119/0.119/0.119 ms
PING myservice (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.097 ms

--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.097/0.097/0.097 ms
PING myservice (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.140 ms

--- myservice ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.140/0.140/0.140 ms

Zusammenfassung

In diesem fortgeschrittenen Docker-Networking-Lab haben wir mehrere Schlüsselkonzepte untersucht:

  1. Benutzerdefinierte Bridge-Netzwerke für verbesserte Isolierung und Kommunikation.
  2. Das Verbinden von Containern über mehrere Netzwerke hinweg.
  3. Den Host-Netzwerkmodus für den direkten Zugriff auf den Netzwerk-Stack des Hosts.
  4. Den None-Netzwerkmodus für eine vollständige Netzwerkisolierung.
  5. Netzwerk-Aliase und Service Discovery für den Aufbau skalierbarer Anwendungen.

Diese fortgeschrittenen Netzwerkfunktionen in Docker bieten leistungsstarke Werkzeuge für das Design komplexer Multi-Container-Anwendungen mit präziser Kontrolle über die Kommunikation und Isolierung. Das Verständnis dieser Konzepte ist entscheidend für die Entwicklung effizienter, sicherer und skalierbarer containerisierter Anwendungen.

Denken Sie daran, dass Docker-Networking zwar große Flexibilität bietet, es aber wichtig ist, die Sicherheitsaspekte bei der Gestaltung Ihrer Netzwerkarchitektur zu berücksichtigen. Folgen Sie stets dem Prinzip der minimalen Rechtevergabe und geben Sie nur die notwendigen Ports und Dienste frei.

Während Sie weiter mit Docker arbeiten, werden sich diese Netzwerkkonzepte als unschätzbar wertvoll für die Orchestrierung komplexer Anwendungen und Microservices-Architekturen erweisen. Üben Sie diese Konzepte regelmäßig, um Docker-Netzwerke effektiv verwalten zu können.