Ein praktischer Leitfaden für benutzerdefinierte Docker-Netzwerke und die Containerkommunikation

Dieser Leitfaden bietet eine praktische Erörterung benutzerdefinierter Docker-Bridge-Netzwerke und ihrer Rolle bei der Containerkommunikation. Erfahren Sie, wie Sie Container mithilfe der Docker CLI und von Docker Compose erstellen, verwalten und verbinden. Entdecken Sie, wie benutzerdefinierte Netzwerke eine automatische DNS-Auflösung ermöglichen, die Isolierung verbessern und die Inter-Service-Kommunikation vereinfachen, was zu robusteren und skalierbareren containerisierten Anwendungen führt.

35 Aufrufe

Ein praktischer Leitfaden für benutzerdefinierte Docker-Netzwerke und Container-Kommunikation

Docker hat die Anwendungsentwicklung und -bereitstellung revolutioniert, indem es Entwicklern ermöglicht, Anwendungen und deren Abhängigkeiten in leichtgewichtige, portable Container zu verpacken. Ein entscheidender Aspekt bei der Verwaltung von Multi-Container-Anwendungen ist die Gewährleistung einer effektiven und sicheren Kommunikation zwischen ihnen. Die Standardnetzwerke von Docker sind zwar funktional, aber für komplexe Anwendungen oft nicht ausreichend. Dieser Leitfaden befasst sich mit der Erstellung und Verwaltung benutzerdefinierter Docker-Netzwerke, wobei der Schwerpunkt auf Bridge-Netzwerken liegt, und zeigt, wie eine nahtlose Kommunikation zwischen Container-Diensten sowohl über die Docker CLI als auch mit Docker Compose konfiguriert wird.

Das Verständnis der Docker-Netzwerkkonfiguration ist grundlegend für die Erstellung robuster, skalierbarer und wartbarer containerisierter Anwendungen. Indem Sie über das Standardnetzwerk bridge hinausgehen, erhalten Sie eine feinere Kontrolle über die Netzwerktopologie, die IP-Adressverwaltung und die Sicherheit, was zu einem vorhersehbareren und zuverlässigeren Anwendungsverhalten führt. Dieser Artikel vermittelt Ihnen das praktische Wissen und die Beispiele, die Sie benötigen, um benutzerdefinierte Netzwerke für Ihre eigenen Projekte zu nutzen.

Warum benutzerdefinierte Docker-Netzwerke?

Docker bietet verschiedene Netzwerktreiber, die jeweils für unterschiedliche Anwendungsfälle geeignet sind. Das Standardnetzwerk bridge wird automatisch für Container erstellt, die keinem anderen Netzwerk explizit zugeordnet sind. Obwohl es bequem ist, weist es Einschränkungen auf:

  • Begrenzte Isolierung: Container im Standard-Bridge-Netzwerk können über ihre IP-Adressen miteinander kommunizieren, was jedoch nicht immer intuitiv oder sicher ist. Die Auflösung von Containernamen wird standardmäßig nicht unterstützt.
  • IP-Adressverwaltung: Die Containern im Standard-Bridge-Netzwerk zugewiesenen IP-Adressen können dynamisch und schwer zu verwalten sein.
  • Skalierbarkeitsbedenken: Für Produktionsumgebungen ist oft eine kontrolliertere und isoliertere Netzwerkkonfiguration erforderlich.

Benutzerdefinierte Bridge-Netzwerke bieten erhebliche Vorteile:

  • Automatische DNS-Auflösung: Container im selben benutzerdefinierten Bridge-Netzwerk können sich über ihre Containernamen (oder Dienstnamen in Docker Compose) gegenseitig finden und miteinander kommunizieren. Dies ist ein entscheidender Vorteil für die Kommunikation zwischen Diensten.
  • Erhöhte Isolierung: Benutzerdefinierte Netzwerke stellen ein dediziertes Netzwerksegment für Ihre Container bereit, was die Sicherheit verbessert und unbeabsichtigte Kommunikation mit Containern außerhalb des Netzwerks verhindert.
  • Bessere IP-Adressverwaltung: Sie können Subnetz- und Gateway-Konfigurationen für Ihre benutzerdefinierten Netzwerke definieren.
  • Flexibilität: Container können einfach Netzwerken hinzugefügt oder daraus entfernt werden, ohne andere zu beeinträchtigen.

Erstellung und Verwaltung benutzerdefinierter Bridge-Netzwerke mit der Docker CLI

Die Befehlszeilenschnittstelle (CLI) von Docker ermöglicht es Ihnen, Netzwerke direkt zu erstellen, zu inspizieren und zu verwalten. Der Befehl docker network ist Ihr primäres Werkzeug.

Erstellung eines benutzerdefinierten Bridge-Netzwerks

Um ein neues benutzerdefiniertes Bridge-Netzwerk zu erstellen, verwenden Sie den Befehl docker network create:

docker network create my-custom-network

Dieser Befehl erstellt ein Netzwerk mit dem Namen my-custom-network unter Verwendung des Treibers bridge (was der Standard ist, wenn kein Treiber angegeben wird).

Netzwerke inspizieren

Sie können alle Docker-Netzwerke und deren Details anzeigen mit:

docker network ls
docker network inspect my-custom-network

Der Befehl inspect liefert detaillierte Informationen über das Netzwerk, einschließlich seiner Konfiguration, Subnetze und verbundenen Container.

Container mit einem Netzwerk verbinden

Wenn Sie einen neuen Container erstellen, können Sie ihn mit dem Flag --network an Ihr benutzerdefiniertes Netzwerk anhängen:

# Starten Sie einen Webserver-Container und verbinden Sie ihn mit my-custom-network
docker run -d --name webserver --network my-custom-network nginx

# Starten Sie einen Datenbank-Container und verbinden Sie ihn mit demselben Netzwerk
docker run -d --name database --network my-custom-network postgres

Nun können die Container webserver und database über ihre Namen miteinander kommunizieren. Zum Beispiel könnten Sie aus dem Container webserver heraus ping database ausführen oder sich mit der PostgreSQL-Instanz unter Verwendung von postgres als Hostname verbinden.

Vorhandene Container verbinden

Sie können auch einen laufenden Container mit docker network connect mit einem Netzwerk verbinden:

# Angenommen, Sie haben einen laufenden Container namens 'another-app'
docker network connect my-custom-network another-app

Container trennen

Um einen Container von einem Netzwerk zu entfernen:

docker network disconnect my-custom-network another-app

Netzwerke entfernen

Bevor Sie ein Netzwerk entfernen können, müssen alle damit verbundenen Container gestoppt und entfernt oder getrennt werden. Danach können Sie Folgendes verwenden:

docker network rm my-custom-network

Nahtlose Kommunikation mit Docker Compose

Docker Compose ist ein unschätzbares Werkzeug zur Definition und Ausführung von Multi-Container-Docker-Anwendungen. Es ermöglicht Ihnen, die Dienste, Netzwerke und Volumes Ihrer Anwendung in einer einzigen YAML-Datei zu verwalten. Die Definition benutzerdefinierter Netzwerke in Docker Compose ist unkompliziert und für jede Multi-Service-Anwendung sehr zu empfehlen.

Netzwerke in docker-compose.yml definieren

Um ein benutzerdefiniertes Netzwerk für Ihre Dienste zu definieren, verwenden Sie den Schlüssel networks auf der obersten Ebene Ihrer docker-compose.yml-Datei. Anschließend geben Sie das Netzwerk für jeden Dienst unter seiner jeweiligen Dienstdefinition an.

Hier ist eine Beispiel-docker-compose.yml-Datei:

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    networks:
      - app-network

  api:
    image: my-api-image:latest
    networks:
      - app-network
    environment:
      - DB_HOST=db

  db:
    image: postgres:latest
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

In diesem Beispiel:

  • Wir definieren einen networks-Abschnitt auf oberster Ebene.
  • app-network wird als benutzerdefiniertes Bridge-Netzwerk definiert. Docker Compose erstellt dieses Netzwerk, falls es noch nicht existiert.
  • Die Dienste web, api und db sind alle explizit über den Schlüssel networks unter jedem Dienst mit app-network verbunden.

Wie Dienste kommunizieren

Wenn Sie docker-compose up -d ausführen, erstellt Docker Compose das Netzwerk app-network und startet die Container, indem es sie mit diesem Netzwerk verbindet. Entscheidend ist, dass Docker Compose die DNS-Auflösung innerhalb dieses Netzwerks automatisch konfiguriert. Das bedeutet:

  • Der Dienst web kann den Dienst db über den Hostnamen db erreichen.
  • Der Dienst api kann den Dienst db über den Hostnamen db erreichen.
  • Der Dienst web kann den Dienst api über den Hostnamen api erreichen.

Diese namensbasierte Kommunikation ist weitaus robuster und lesbarer, als sich auf IP-Adressen zu verlassen.

Netzwerkkonfiguration anpassen

Docker Compose ermöglicht weitere Anpassungen Ihrer Netzwerke, wie die Definition von Subnetzen und Gateways:

version: '3.8'

services:
  # ... services ...

networks:
  app-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16
          gateway: 172.28.0.1

Dies bietet eine explizite Kontrolle über den vom Netzwerk verwendeten IP-Adressraum.

Best Practices für benutzerdefinierte Netzwerke

  • Ein Netzwerk pro Anwendung: Für die meisten Anwendungen vereinfacht die Definition eines einzigen, dedizierten benutzerdefinierten Netzwerks in Docker Compose die Verwaltung und Kommunikation.
  • Verwenden Sie beschreibende Netzwerknamen: Wählen Sie Namen, die den Zweck des Netzwerks klar angeben (z. B. my-app-net, backend-services).
  • Nur notwendige Dienste anhängen: Dienste, die kommunizieren müssen, sollten sich im selben Netzwerk befinden. Vermeiden Sie es, alle Dienste mit einem einzigen Netzwerk zu verbinden, wenn sie nicht interagieren müssen.
  • Docker Compose nutzen: Für alles, was über einfache Einzelcontainer-Setups hinausgeht, erleichtert Docker Compose die Verwaltung benutzerdefinierter Netzwerke und der zugehörigen Dienste erheblich.
  • Standard-Bridge für die Produktion vermeiden: Verwenden Sie für Produktionsumgebungen immer benutzerdefinierte Bridge-Netzwerke oder andere Netzwerktreiber (wie overlay für Swarm/Kubernetes), um eine bessere Isolierung, Kontrolle und DNS-Auflösung zu gewährleisten.

Fazit

Die Beherrschung benutzerdefinierter Docker-Netzwerke ist unerlässlich für die Erstellung anspruchsvoller, miteinander verbundener containerisierter Anwendungen. Durch die Nutzung benutzerdefinierter Bridge-Netzwerke, entweder über die Docker CLI oder, was praktischer ist, mit Docker Compose, ermöglichen Sie eine robuste DNS-basierte Dienstfindung und verbessern die Netzwerktrennung. Dies führt zu wartbareren, skalierbareren und sichereren Container-Bereitstellungen. Nutzen Sie benutzerdefinierte Netzwerke, um das volle Potenzial von Docker für Ihre Multi-Service-Anwendungen auszuschöpfen.