Docker-Tutorial: Beginnen Sie mit dem Docker-Netzwerk

Ein häufiger Anwendungsfall für Docker sind Netzwerkdienste, und Docker verfügt über ein eigenes Netzwerkmodell, mit dem Container sowohl miteinander als auch mit der Außenwelt sprechen können.

Ursprünglich mussten Docker-Container von Hand miteinander vernetzt oder manuell der Außenwelt ausgesetzt werden. Mit dem aktuellen Netzwerkmodell können sich Container automatisch auf demselben Host (oder auf verschiedenen Hosts) finden und kontrollierter der Welt ausgesetzt werden.

Docker bietet Entwicklern vier grundlegende Möglichkeiten zur Vernetzung von Containern. Die ersten beiden, Bridge- und Overlay- Netzwerke, decken die häufigsten Anwendungsfälle in der Produktion ab. Die beiden anderen, Host- und Macvlan- Netzwerke, decken weniger häufige Fälle ab.

Docker-Netzwerk: Brückennetzwerke

Über Bridge-Netzwerke können Container, die auf demselben Docker-Host ausgeführt werden, miteinander kommunizieren. Eine neue Instanz von Docker wird mit einem Standardbrückennetzwerk mit dem Namen geliefert bridge, und standardmäßig stellen alle neu gestarteten Container eine Verbindung dazu her.

Das bridgeNetzwerk verfügt über viele praktische Standardeinstellungen, die jedoch möglicherweise in der Produktion optimiert werden müssen. Beispielsweise werden in Containern bridgeautomatisch alle Ports einander ausgesetzt, aber keiner der Außenwelt. Dies ist nützlich, wenn Sie die Kommunikation zwischen Containern testen müssen, nicht jedoch, um einen Live-Dienst bereitzustellen.

Erstellen Sie für die besten Ergebnisse Ihr eigenes Brückennetzwerk. Benutzerdefinierte Brücken haben viele Funktionen, die die bridgeBrücke nicht bietet:

  • Die DNS-Auflösung funktioniert automatisch zwischen Containern auf einer benutzerdefinierten Bridge. Auf diese Weise müssen Sie keine rohen IP-Adressen verwenden, um wie auf der bridgeBridge zwischen ihnen zu kommunizieren . Container können andere Container über DNS unter Verwendung des Containernamens lokalisieren.
  • Container können während der Ausführung zu einer benutzerdefinierten Bridge hinzugefügt und daraus entfernt werden.
  • Umgebungsvariablen können von Containern auf einer benutzerdefinierten Bridge gemeinsam genutzt werden.

Kurz gesagt, Sie können mit der Standardbrücke mit dem Basteln von Containern beginnen. Für jede ernsthafte Produktionsarbeit sollten Sie jedoch eine benutzerdefinierte Brücke erstellen.

Docker-Netzwerk: Overlay-Netzwerke

Brückennetzwerke gelten für Container auf demselben Host. Overlay- Netzwerke sind für Container vorgesehen, die auf verschiedenen Hosts ausgeführt werden, z. B. in einem Docker-Schwarm. Auf diese Weise können sich Hosts zwischen Hosts finden und kommunizieren, ohne dass Sie sich Gedanken darüber machen müssen, wie Sie dies für jeden einzelnen teilnehmenden Container einrichten.

Der Schwarmmodus-Orchestrator von Docker erstellt automatisch ein Overlay-Netzwerk ingress. Standardmäßig hängen sich alle Dienste auf dem Schwarm an ingress. Wie bei der Standardeinstellung bridgeist dies jedoch nicht die beste Wahl für ein Produktionssystem, da die Standardeinstellungen möglicherweise nicht angemessen sind. Am besten erstellen Sie ein benutzerdefiniertes Overlay-Netzwerk mit oder ohne Schwarm und fügen bei Bedarf Knoten hinzu.

Wenn Sie ein Overlay-Netzwerk mit Containern verwenden möchten, die nicht in einem Schwarm ausgeführt werden, ist dies ein weiterer Anwendungsfall zum Erstellen eines benutzerdefinierten Overlay-Netzwerks. Beachten Sie, dass jeder Docker-Host in einem Overlay-Netzwerk über die richtigen Ports verfügen muss, damit seine Peers angezeigt werden können. Ohne Schwarmmodus muss jeder Knoten auf einen Schlüsselwertspeicher zugreifen.

Beachten Sie auch, dass Overlay-Netzwerke standardmäßig nur 256 unterschiedliche IP-Adressen zulassen. Sie können dieses Limit erhöhen, Docker empfiehlt jedoch, stattdessen mehrere Overlays zu verwenden.

Docker-Netzwerk: Host-Netzwerk

Mit dem hostNetzwerktreiber können Container ihre Netzwerkstapel neben dem Stapel auf dem Host ausführen. Ein Webserver an Port 80 in einem hostContainer mit Netzwerk ist über Port 80 auf dem Host selbst verfügbar.

Der größte Segen des Host-Netzwerks ist die Geschwindigkeit. Wenn Sie einem Container-Port Zugriff gewähren müssen und ihn so nah wie möglich an das zugrunde liegende Betriebssystem bringen möchten, ist dies der richtige Weg. Dies geht jedoch zu Lasten der Flexibilität: Wenn Sie Port 80 einem Container zuordnen, kann kein anderer Container ihn auf diesem Host verwenden.

Docker-Netzwerk: Macvlan-Netzwerk

Ein Macvlan-Netzwerk ist für Anwendungen vorgesehen, die direkt mit dem zugrunde liegenden physischen Netzwerk zusammenarbeiten, z. B. Anwendungen zur Überwachung des Netzwerkverkehrs. Der macvlanTreiber weist einem Container nicht nur eine IP-Adresse zu, sondern auch eine physische MAC-Adresse.

Beachten Sie, dass diese Art von Docker-Netzwerk viele der gleichen Einschränkungen aufweist, die Sie haben würden, wenn Sie beispielsweise virtuelle MAC-Adressen mithilfe von VMs erstellen würden. Kurz gesagt, Macvlan sollte nur für Anwendungen reserviert werden, die nur funktionieren, wenn sie auf einer physischen Netzwerkadresse basieren.

Docker-Netzwerk: Erstellen und Verwalten von Netzwerken

Die gesamte Netzwerkverwaltung in Docker erfolgt mit dem docker networkBefehl. Viele seiner Unterbefehle ähneln anderen Docker-Befehlen. Zeigt beispielsweise docker network lsalle konfigurierten Netzwerke in der aktuellen Docker-Instanz an:

$ docker network ls NETZWERK-ID NAME DRIVER SCOPE 2e0adaa0ce4a Bridge Bridge lokal 0de3da43b973 Host Host lokal 724a28c6d86d keine null lokal

Verwenden Sie zum Erstellen eines Netzwerks den createUnterbefehl zusammen mit dem --driverFlag, um anzugeben, welcher Treiber verwendet werden soll ( bridge, overlay, macvlan):

$ docker network create --driver bridge my-bridge 

Für Host-Netzwerk-Container muss kein Netzwerk für sie erstellt werden. Starten Sie stattdessen den Container mit der --network hostFlagge. Alle Prozesse im Container überwachen ihre vorkonfigurierten Ports. Stellen Sie daher sicher, dass diese zuerst festgelegt werden.

Zu den Optionen zum Erstellen eines Netzwerks gehört auch die Angabe des Subnetzes, des IP-Adressbereichs und des Netzwerk-Gateways, ähnlich wie dies beim Erstellen eines Netzwerks mit anderen Mitteln der Fall wäre.

Container werden standardmäßig im bridgeNetzwerk ausgeführt. Um ein bestimmtes Netzwerk zu verwenden, verwenden Sie --networkbeim Starten des Containers einfach das Flag und geben Sie den Netzwerknamen an.

Sie können einen laufenden Container auch mit einem Netzwerk koppeln:

$ docker network connect bridge my_container

Dadurch wird  my_containereine Verbindung zum bridgeNetzwerk hergestellt, während vorhandene Netzwerkverbindungen beibehalten werden.

Wenn ein Container heruntergefahren wird, bleiben alle damit verbundenen Netzwerke intakt. Wenn Sie Netzwerke manuell entfernen möchten, können Sie dies mit dem docket network rm Befehl tun oder verwenden docker network prune, um alle Netzwerke zu entfernen, die auf dem Host nicht mehr verwendet werden.

Docker-Netzwerk und Kubernetes-Netzwerk

Wenn Sie Kubernetes als Orchestrierungslösung betrachten, aber bereits eine Menge Arbeit in einem Docker-Netzwerk-Setup stecken, werden Sie nicht begeistert sein zu hören, dass es keine Eins-zu-Eins-Korrespondenz zwischen Docker und Kubernetes beim Umgang mit Netzwerken gibt.

Die Details sind in der Kubernetes-Dokumentation beschrieben. In der Kurzversion gibt es jedoch grundlegend unterschiedliche Modelle für die Zuweisung und Verwaltung von Netzwerkressourcen. Daher müssen Sie ein Kubernetes-spezifisches Netzwerk-Setup für Ihre Anwendung entwickeln.

Ein möglicher Ansatz auf halbem Weg ist die Verwendung eines CNI-Plugins (Kubernetes Container Network Interface), das mit Dockers eigenen Netzwerksteuerelementen funktioniert. Dies ist jedoch bestenfalls eine Zwischenlösung. Irgendwann müssen Sie Ihre Kubernetes-Projekte mithilfe eigener Netzwerkmetaphern von innen nach außen erstellen.