Grundlagen von Docker-Netzwerken

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 die Grundlagen des Docker-Netzwerks erkunden. Docker-Netzwerke ermöglichen es Containern, miteinander und mit der Außenwelt zu kommunizieren. Wir werden verschiedene Netzwerktypen behandeln, benutzerdefinierte Netzwerke erstellen, Container verbinden und Netzwerkkonfigurationen verwalten. Diese praktische Erfahrung wird Ihnen eine solide Grundlage in Docker-Netzwerkkonzepten und -praktiken vermitteln.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) linux(("Linux")) -.-> linux/RemoteAccessandNetworkingGroup(["Remote Access and Networking"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") linux/RemoteAccessandNetworkingGroup -.-> linux/ip("IP Managing") subgraph Lab Skills docker/run -.-> lab-389048{{"Grundlagen von Docker-Netzwerken"}} docker/exec -.-> lab-389048{{"Grundlagen von Docker-Netzwerken"}} docker/inspect -.-> lab-389048{{"Grundlagen von Docker-Netzwerken"}} docker/port -.-> lab-389048{{"Grundlagen von Docker-Netzwerken"}} docker/network -.-> lab-389048{{"Grundlagen von Docker-Netzwerken"}} linux/ip -.-> lab-389048{{"Grundlagen von Docker-Netzwerken"}} end

Grundlegendes zu Docker-Netzwerktypen

Docker bietet mehrere integrierte Netzwerk-Treiber (network drivers). Beginnen wir damit, die Standardnetzwerke auf Ihrem System zu untersuchen.

Führen Sie in Ihrem Terminal den folgenden Befehl aus, um alle verfügbaren Docker-Netzwerke aufzulisten:

docker network ls

Dieser Befehl listet alle Netzwerke auf, die Docker auf Ihrem System erstellt hat. Die Ausgabe sollte in etwa wie folgt aussehen:

NETWORK ID     NAME      DRIVER    SCOPE
79dce413aafd   bridge    bridge    local
91199fc6ad2e   host      host      local
1078d2c781b6   none      null      local

Lassen Sie uns die Standard-Netzwerktypen näher betrachten:

  1. bridge: Dies ist der Standard-Netzwerk-Treiber. Wenn Sie einen Container starten, ohne ein Netzwerk anzugeben, wird er automatisch mit dem Bridge-Netzwerk verbunden. Container auf demselben Bridge-Netzwerk können über ihre IP-Adressen miteinander kommunizieren.

  2. host: Dieser Treiber hebt die Netzwerkisolation zwischen dem Container und dem Docker-Host auf. Der Container teilt sich den Netzwerknamensraum (networking namespace) des Hosts, was bedeutet, dass er direkt die IP-Adresse und den Portraum des Hosts verwendet. Dies kann in bestimmten Szenarien zur Optimierung der Leistung nützlich sein.

  3. none: Dieser Treiber deaktiviert alle Netzwerke für einen Container. Container, die diesen Netzwerktyp verwenden, haben keinen Zugang zu externen Netzwerken oder anderen Containern. Dies ist nützlich, wenn Sie einen Container vollständig isolieren möchten.

Die Spalte SCOPE gibt an, ob das Netzwerk auf einen einzelnen Host beschränkt ist (local) oder über mehrere Hosts in einem Docker-Swarm hinweg reichen kann (swarm).

Untersuchung des Standard-Bridge-Netzwerks

Nachdem wir nun die Liste der Netzwerke gesehen haben, werfen wir einen genaueren Blick auf das Standard-Bridge-Netzwerk. Dieses Netzwerk wird automatisch von Docker erstellt und von Containern verwendet, sofern nichts anderes angegeben wird.

Führen Sie den folgenden Befehl aus, um das Bridge-Netzwerk zu untersuchen:

docker network inspect bridge

Dieser Befehl liefert detaillierte Informationen über das Bridge-Netzwerk, einschließlich seiner Subnetzmaske, des Gateways und der verbundenen Container. Die Ausgabe sieht in etwa wie folgt aus (gekürzt für die Klarheit):

[
  {
    "Name": "bridge",
    "Id": "79dce413aafdd7934fa3c1d0cc97decb823891ce406442b7d51be6126ef06a5e",
    "Created": "2024-08-22T09:58:39.747333789+08:00",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": null,
      "Config": [
        {
          "Subnet": "172.17.0.0/16",
          "Gateway": "172.17.0.1"
        }
      ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
      "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {},
    "Options": {
      "com.docker.network.bridge.default_bridge": "true",
      "com.docker.network.bridge.enable_icc": "true",
      "com.docker.network.bridge.enable_ip_masquerade": "true",
      "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
      "com.docker.network.bridge.name": "docker0",
      "com.docker.network.driver.mtu": "1500"
    },
    "Labels": {}
  }
]

Lassen Sie uns einige Schlüsselinformationen aus dieser Ausgabe näher betrachten:

  • Subnet: Das Subnetz, das von Containern in diesem Netzwerk verwendet wird, ist 172.17.0.0/16. Das bedeutet, dass Containern IP-Adressen innerhalb dieses Bereichs zugewiesen werden.
  • Gateway: Das Gateway für dieses Netzwerk ist 172.17.0.1. Dies ist die IP-Adresse, die Container verwenden, um mit Netzwerken außerhalb ihres eigenen zu kommunizieren.
  • Containers: Dieses Feld ist leer, da wir noch keine Container gestartet haben.
  • Options: Dies sind verschiedene Konfigurationsoptionen für das Bridge-Netzwerk. Beispielsweise bedeutet enable_icc auf "true" gesetzt, dass die Kommunikation zwischen Containern in diesem Netzwerk erlaubt ist.

Das Verständnis dieser Informationen ist von entscheidender Bedeutung, wenn Sie Netzwerkprobleme beheben oder Ihre Container so konfigurieren müssen, dass sie mit bestimmten IP-Bereichen kommunizieren können.

Erstellen eines benutzerdefinierten Bridge-Netzwerks

Während das Standard-Bridge-Netzwerk für viele Anwendungsfälle geeignet ist, ermöglicht die Erstellung benutzerdefinierter Netzwerke eine bessere Isolation und Kontrolle. Benutzerdefinierte Netzwerke sind besonders nützlich, wenn Sie verwandte Container zusammenfassen möchten oder wenn Sie kontrollieren müssen, welche Container miteinander kommunizieren können.

Lassen Sie uns ein benutzerdefiniertes Bridge-Netzwerk namens my-network erstellen:

docker network create --driver bridge my-network

Dieser Befehl erstellt ein neues Bridge-Netzwerk. Die Option --driver bridge ist hier eigentlich optional, da Bridge der Standard-Treiber ist, aber sie wird zur Verdeutlichung angegeben.

Jetzt überprüfen wir, ob unser neues Netzwerk erstellt wurde:

docker network ls

Sie sollten my-network in der Liste der Netzwerke sehen:

NETWORK ID     NAME         DRIVER    SCOPE
1191cb61c989   bridge       bridge    local
91199fc6ad2e   host         host      local
47ac4e684a72   my-network   bridge    local
1078d2c781b6   none         null      local

Unser neues my-network erscheint in der Liste, was bestätigt, dass es erfolgreich erstellt wurde. Dieses Netzwerk steht nun für Container zur Verbindung zur Verfügung.

Verbinden von Containern mit Netzwerken

Nachdem wir nun unser benutzerdefiniertes Netzwerk haben, erstellen wir zwei Container und verbinden sie damit. Wir verwenden für dieses Beispiel das nginx-Image, das einen leichten Webserver bereitstellt.

Führen Sie die folgenden Befehle aus, um zwei Container zu erstellen:

docker run -d --name container1 --network my-network nginx
docker run -d --name container2 --network my-network nginx

Lassen Sie uns diese Befehle näher betrachten:

  • -d: Dieser Schalter startet den Container im detached-Modus, d. h., er läuft im Hintergrund.
  • --name: Hiermit wird dem Container ein Name zugewiesen, was die spätere Referenzierung erleichtert.
  • --network: Hier wird angegeben, mit welchem Netzwerk der Container verbunden werden soll.
  • nginx: Dies ist der Name des Images, das wir zur Erstellung unserer Container verwenden.

Diese Befehle erstellen zwei detached (-d) Container namens container1 und container2, die beide mit unserem my-network verbunden sind.

Überprüfen wir nun, ob die Container laufen und mit unserem Netzwerk verbunden sind:

docker ps

Dieser Befehl listet alle laufenden Container auf. In der Ausgabe sollten Sie beide Container sehen:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
1234567890ab   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    80/tcp    container2
abcdef123456   nginx     "/docker-entrypoint.…"   20 seconds ago   Up 19 seconds   80/tcp    container1

Diese Ausgabe zeigt, dass beide Container das Nginx-Image ausführen und Port 80 innerhalb des Containers freigeben.

Testen der Kommunikation zwischen Containern

Einer der Hauptvorteile von Docker-Netzwerken besteht darin, dass Container auf demselben Netzwerk miteinander kommunizieren können, indem sie ihre Containernamen als Hostnamen verwenden. Dies erleichtert die Einrichtung der Kommunikation zwischen Diensten, ohne dass die Kenntnis ihrer IP-Adressen erforderlich ist.

Lassen Sie uns dies testen, indem wir container1 verwenden, um eine Anfrage an container2 zu senden:

docker exec container1 curl -s container2

Lassen Sie uns diesen Befehl näher betrachten:

  • docker exec: Hiermit wird Docker angewiesen, einen Befehl innerhalb eines laufenden Containers auszuführen.
  • container1: Dies ist der Name des Containers, in dem wir den Befehl ausführen möchten.
  • curl -s container2: Dies ist der Befehl, den wir innerhalb des Containers ausführen. Er sendet eine GET-Anfrage an container2, und der -s-Schalter lässt curl im Stumm-Modus (silent mode) arbeiten.

Dieser Befehl führt den curl-Befehl innerhalb von container1 aus und sendet eine Anfrage an container2. In der Ausgabe sollten Sie die Standard-Willkommensseite von Nginx im HTML-Format sehen:

<!doctype html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.
    </p>

    <p>
      For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br />
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Diese erfolgreiche Antwort zeigt, dass container1 mit container2 über dessen Containernamen kommunizieren kann. Docker's eingebauter DNS-Server löst den Containernamen in seine IP-Adresse innerhalb des Netzwerks auf.

Freigeben von Container-Ports

Standardmäßig können Container in einem benutzerdefinierten Netzwerk miteinander kommunizieren, sind aber von außerhalb des Docker-Hosts nicht zugänglich. Um einen Container vom Host oder von externen Netzwerken aus zugänglich zu machen, müssen wir seine Ports freigeben.

Lassen Sie uns einen neuen Container mit einem freigegebenen Port erstellen:

docker run -d --name exposed-container -p 8080:80 --network my-network nginx

Lassen Sie uns diesen Befehl näher betrachten:

  • -d: Starten Sie den Container im detached-Modus.
  • --name exposed-container: Benennen Sie den Container "exposed-container".
  • -p 8080:80: Ordnen Sie Port 80 innerhalb des Containers Port 8080 auf dem Host zu.
  • --network my-network: Verbinden Sie den Container mit unserem benutzerdefinierten Netzwerk.
  • nginx: Verwenden Sie das Nginx-Image.

Dieser Befehl erstellt einen neuen Container namens exposed-container, ordnet den Port 80 des Containers Port 8080 auf dem Host zu und verbindet ihn mit unserem my-network.

Jetzt können Sie den Nginx-Server dieses Containers von Ihrer Hostmaschine aus zugreifen, indem Sie einen Webbrowser öffnen und zu http://localhost:8080 navigieren oder indem Sie curl verwenden:

curl localhost:8080

Sie sollten die gleiche Nginx-Willkommensseite im HTML-Format wie zuvor sehen. Diesmal greifen wir jedoch direkt vom Host auf den Container zu, nicht von einem anderen Container aus.

Verwenden des Host-Netzwerks

Für Szenarien, in denen Sie möchten, dass ein Container den Netzwerkstack des Hosts teilt, können Sie den Host-Netzwerk-Treiber (host network driver) verwenden. Dies hebt die Netzwerkisolation zwischen Container und Host auf, was für bestimmte Anwendungen nützlich sein kann, aber aufgrund möglicher Portkonflikte vorsichtig eingesetzt werden sollte.

Lassen Sie uns einen Container mit Host-Netzwerk erstellen:

docker run -d --name host-networked --network host nginx

Dieser Befehl erstellt einen neuen Container namens host-networked, der das Host-Netzwerk verwendet. Beachten Sie, dass Sie -p bei Verwendung des Host-Netzwerks nicht verwenden können, da der Container bereits die Netzwerkschnittstellen des Hosts nutzt.

Um zu überprüfen, ob der Container das Host-Netzwerk verwendet, können wir seine Netzwerkeinstellungen untersuchen:

docker inspect --format '{{.HostConfig.NetworkMode}}' host-networked

Dieser Befehl untersucht den Container und formatiert die Ausgabe so, dass nur der NetworkMode angezeigt wird. Es sollte host ausgegeben werden, was bestätigt, dass der Container das Host-Netzwerk verwendet.

Bei Verwendung des Host-Netzwerks teilt der Container die IP-Adresse des Hosts und kann direkt auf alle Netzwerkschnittstellen des Hosts zugreifen. Dies kann für die Maximierung der Leistung nützlich sein, bedeutet aber auch, dass alle Ports, die der Container verwendet, direkt auf dem Host geöffnet werden. Dies kann zu Konflikten führen, wenn Sie nicht vorsichtig sind.

Zusammenfassung

In diesem Lab haben wir die Grundlagen von Docker-Netzwerken untersucht. Wir haben verschiedene Netzwerktypen behandelt, benutzerdefinierte Netzwerke erstellt, Container verbunden, die Kommunikation zwischen Containern getestet, Container-Ports freigegeben und das Host-Netzwerk für Container verwendet. Diese Konzepte bilden die Grundlage von Docker-Netzwerken und sind für das Design und die Verwaltung von containerisierten Anwendungen unerlässlich.

Wir haben gelernt, wie man:

  • Docker-Netzwerke auflistet und untersucht
  • Benutzerdefinierte Bridge-Netzwerke (Brückennetzwerke) erstellt
  • Container mit Netzwerken verbindet
  • Die Kommunikation zwischen Containern testet
  • Container-Ports für den Host freigibt
  • Das Host-Netzwerk für Container verwendet

Das Verständnis dieser Netzwerk-Konzepte wird Ihnen helfen, robuster und sicherer containerisierte Anwendungen zu entwerfen. Wenn Sie weiterhin mit Docker arbeiten, werden Sie auf fortgeschrittenere Netzwerk-Szenarien stoßen, aber die hier behandelten Prinzipien werden als solide Grundlage für Ihre Reise in die Container-Orchestrierung und die Microservices-Architektur dienen.

Denken Sie daran, dass Docker-Netzwerke ein leistungsstarkes Werkzeug sind, das es Ihnen ermöglicht, isolierte Umgebungen für Ihre Anwendungen zu schaffen, während dennoch eine kontrollierte Kommunikation zwischen Containern und mit der Außenwelt möglich ist. Üben Sie diese Konzepte und erkunden Sie fortgeschrittenere Themen, um sich in der Verwaltung von Docker-Netzwerken zu verbessern.