Eintauchen in Docker-Netzwerke

DockerDockerBeginner
Jetzt üben

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

Einführung

In diesem Lab werden wir fortgeschrittene Docker-Netzwerkkonzepte erkunden, die auf den Grundlagen des Docker-Netzwerks aufbauen. Wir werden tiefer in die drei Hauptnetzwerkmodi eintauchen: Bridge, Host und None. Wir werden auch lernen, wie man benutzerdefinierte Netzwerke erstellt, Container über verschiedene Netzwerke hinweg verbindet und die Auswirkungen jedes Netzwerkmodus auf die Containerkommunikation und -isolierung versteht. Diese praktische Erfahrung wird Ihnen eine solide Grundlage in Docker-Netzwerkpraktiken geben.


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/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-389047{{"Eintauchen in Docker-Netzwerke"}} docker/exec -.-> lab-389047{{"Eintauchen in Docker-Netzwerke"}} docker/inspect -.-> lab-389047{{"Eintauchen in Docker-Netzwerke"}} docker/network -.-> lab-389047{{"Eintauchen in Docker-Netzwerke"}} end

Benutzerdefinierte Bridge-Netzwerke

Während Docker ein Standard-Bridge-Netzwerk bereitstellt, bietet die Erstellung benutzerdefinierter Bridge-Netzwerke eine bessere Isolierung und Kontrolle über die Kommunikation zwischen Containern.

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

Sie sollten etwas wie Folgendes sehen:

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

Sie sollten jetzt my-custom-bridge in der Ausgabe sehen:

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

Jetzt installieren wir das ping-Utility in beiden Containern. Dies müssen wir tun, da das Standard-Nginx-Image ping nicht 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, was zeigt, dass Container im selben benutzerdefinierten Bridge-Netzwerk über ihre Containernamen kommunizieren können. Dies funktioniert, weil Docker's integrierte DNS die Containernamen in ihre IP-Adressen innerhalb desselben Netzwerks auflöst.

Wenn Sie keine erfolgreichen Pings sehen, stellen Sie sicher, dass beide Container laufen (docker ps) und dass Sie das ping-Utility korrekt installiert haben.

Verbinden von Containern über verschiedene Netzwerke

Docker ermöglicht es, Container mit mehreren Netzwerken zu verbinden, was die Kommunikation zwischen Containern auf verschiedenen Netzwerken ermöglicht. Dies ist besonders nützlich, wenn Sie bestimmte Container isolieren möchten, aber dennoch eine bestimmte Kommunikation zwischen ihnen zulassen wollen.

  1. Zunächst erstellen wir ein zweites benutzerdefiniertes Bridge-Netzwerk:
docker network create my-second-bridge
  1. Überprüfen Sie die Netzwerkerstellung:
docker network ls

Sie sollten jetzt 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 dem Netzwerk my-second-bridge hinzu, während es weiterhin mit my-custom-bridge verbunden bleibt.

  1. Erstellen Sie einen neuen Container auf dem 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 verschiedenen Netzwerken).
  • container2 kann sowohl mit container1 als auch mit container3 kommunizieren (es ist mit beiden Netzwerken verbunden).

Wenn container1 container3 erreichen könnte, wäre etwas mit Ihrer Netzwerkisolierung falsch.

Host-Netzwerkmodus

Der Host-Netzwerkmodus hebt die Netzwerkisolierung zwischen dem Container und dem Docker-Host auf und ermöglicht es dem Container, direkt das Netzwerk des Hosts zu nutzen. Dies kann für die Maximierung der Leistung 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 nutzt.

  1. Überprüfen Sie, ob der Container das Netzwerk des Hosts nutzt:
docker inspect --format '{{.HostConfig.NetworkMode}}' host-container

Dies sollte host ausgeben.

  1. Versuchen Sie, die Standardseite von Nginx von Ihrer Hostmaschine aus zuzugreifen:
curl localhost:80

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

Hinweis: Wenn Sie bereits einen Dienst auf Port 80 Ihrer Hostmaschine laufen haben, kann dieser Schritt fehlschlagen. In diesem Fall müssen Sie zunächst den vorhandenen Dienst 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 überhaupt nicht über das Netzwerk kommunizieren 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

Sie werden kein neues Netzwerk für diesen Container sehen, da er mit keinem Netzwerk verbunden ist.

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

Sie sollten nur die Loopback-Schnittstelle (lo) sehen. Es wird keine eth0 oder andere Netzwerkschnittstellen geben.

  1. Versuchen Sie, von dem isolierten Container aus Google zu pingen:
docker exec isolated-container ping -c 2 google.com

Dies sollte mit einem "Network is unreachable"-Fehler fehlschlagen, da der Container keinen Netzwerkzugang hat.

Netzwerk-Aliase und Service Discovery

Docker-Netzwerke unterstützen die Service Discovery mithilfe von Netzwerk-Aliasen, was für die Erstellung widerstandsfähiger und skalierbarer Anwendungen nützlich sein kann. Diese Funktion ermöglicht es mehreren Containern, auf denselben DNS-Namen zu reagieren und somit eine grundlegende Lastverteilung zu ermöglichen.

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

Sie sollten service-network in der Liste sehen.

  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 verwenden Sie nslookup, um den Service aufzulösen:
docker run --rm --network service-network appropriate/curl nslookup myservice

Sie sollten beide Container-IPs zurückerhalten, was zeigt, dass Docker's eingebauter DNS-Server die Last zwischen den beiden Containern verteilt.

  1. Testen Sie den Zugriff auf den Service mehrmals:
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 eine grundlegende Lastverteilung zeigt. Der Docker-DNS-Server wechselt zwischen den beiden IP-Adressen, wenn er myservice auflöst.

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-Netzwerk-Labor haben wir mehrere Schlüsselkonzepte untersucht:

  1. Benutzerdefinierte Bridge-Netzwerke zur Verbesserung der Container-Isolierung und -Kommunikation
  2. Verbinden von Containern über mehrere Netzwerke
  3. Host-Netzwerkmodus für direkten Zugriff auf den Netzwerkstapel des Hosts
  4. None-Netzwerkmodus für vollständige Netzwerkisolierung
  5. Netzwerk-Aliase und Service Discovery für das Bauen skalierbarer Anwendungen

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

Denken Sie daran, dass Docker-Netzwerke zwar eine große Flexibilität bieten, es aber wichtig ist, die Sicherheitsaspekte bei der Planung Ihrer Container-Netzwerkarchitektur zu berücksichtigen. Befolgen Sie immer das Prinzip des geringsten Privilegs und öffnen Sie nur die erforderlichen Ports und Dienste.

Wenn Sie weiterhin mit Docker arbeiten, werden Sie feststellen, dass diese Netzwerk-Konzepte unschätzbar sind, wenn es darum geht, komplexe Anwendungen und Microservices-Architekturen zu orchestrieren. Üben Sie diese Konzepte regelmäßig, um sich in der effektiven Verwaltung von Docker-Netzwerken zu verbessern.