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.
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.
- 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
- Erstellen wir nun ein benutzerdefiniertes Bridge-Netzwerk:
docker network create my-custom-bridge
- 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
- 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
- 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.
- Erstellen wir zunächst ein zweites benutzerdefiniertes Bridge-Netzwerk:
docker network create my-second-bridge
- Ü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
- Verbinden Sie
container2mit 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.
- 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
- 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:
container1kann mitcontainer2kommunizieren (sie befinden sich im selben Netzwerk).container1kann nicht mitcontainer3kommunizieren (sie befinden sich in unterschiedlichen Netzwerken).container2kann sowohl mitcontainer1als auch mitcontainer3kommunizieren (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.
- Erstellen Sie einen Container im Host-Netzwerkmodus:
docker run --network host --name host-container -d nginx
- Ü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.
- Bestätigen Sie, dass der Container das Host-Netzwerk nutzt:
docker inspect --format '{{.HostConfig.NetworkMode}}' host-container
Die Ausgabe sollte host lauten.
- 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.
- Erstellen Sie einen Container ohne Netzwerk:
docker run --network none --name isolated-container -d alpine sleep infinity
- Überprüfen Sie die aktuelle Netzwerkliste:
docker network ls
Es erscheint kein neues Netzwerk, da der Container mit keinem Netzwerk verbunden ist.
- Ü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.
- 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.
- Erstellen Sie ein neues Bridge-Netzwerk für diese Übung:
docker network create service-network
- Überprüfen Sie die Erstellung des Netzwerks:
docker network ls
service-network sollte in der Liste erscheinen.
- 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
- 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.
- 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:
- Benutzerdefinierte Bridge-Netzwerke für verbesserte Isolierung und Kommunikation.
- Das Verbinden von Containern über mehrere Netzwerke hinweg.
- Den Host-Netzwerkmodus für den direkten Zugriff auf den Netzwerk-Stack des Hosts.
- Den None-Netzwerkmodus für eine vollständige Netzwerkisolierung.
- 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.



