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 bridge
Netzwerk verfügt über viele praktische Standardeinstellungen, die jedoch möglicherweise in der Produktion optimiert werden müssen. Beispielsweise werden in Containern bridge
automatisch 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 bridge
Brü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
bridge
Bridge 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 bridge
ist 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 host
Netzwerktreiber können Container ihre Netzwerkstapel neben dem Stapel auf dem Host ausführen. Ein Webserver an Port 80 in einem host
Container 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 macvlan
Treiber 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 network
Befehl. Viele seiner Unterbefehle ähneln anderen Docker-Befehlen. Zeigt beispielsweise docker network ls
alle 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 create
Unterbefehl zusammen mit dem --driver
Flag, 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 host
Flagge. 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 bridge
Netzwerk ausgeführt. Um ein bestimmtes Netzwerk zu verwenden, verwenden Sie --network
beim 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_container
eine Verbindung zum bridge
Netzwerk 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.