Das Docker-Ökosystem: Vernetzung und Kommunikation

Einführung

Bei der Erstellung verteilter Systeme für Docker-Container sind Kommunikation und Vernetzung von größter Bedeutung. Serviceorientierte Architekturen sind unbestreitbar stark von der Kommunikation zwischen Komponenten abhängig, um korrekt zu funktionieren.

In diesem Handbuch werden die verschiedenen Netzwerkstrategien und -werkzeuge erläutert, mit denen die von Containern verwendeten Netzwerke in den gewünschten Zustand gebracht werden. Einige Situationen können die Vorteile von nativen Docker-Lösungen nutzen, während andere alternative Projekte verwenden müssen.

Native Docker-Netzwerkimplementierung

Docker selbst bietet viele der Netzwerkgrundlagen, die für die Kommunikation von Container zu Container und von Container zu Host erforderlich sind.

Wenn der Docker-Prozess selbst aufgerufen wird, konfiguriert er eine neue virtuelle Bridge-Schnittstelle mit dem Namendocker0 auf dem Hostsystem. Über diese Schnittstelle kann Docker ein virtuelles Subnetz für die Verwendung unter den Containern zuweisen, die es ausführen wird. Die Bridge dient als Hauptschnittstelle zwischen der Vernetzung innerhalb eines Containers und der Vernetzung auf dem Host.

Wenn ein Container von Docker gestartet wird, wird eine neue virtuelle Schnittstelle erstellt und eine Adresse innerhalb des Subnetzbereichs der Bridge zugewiesen. Die IP-Adresse ist mit dem internen Netzwerk des Containers verbunden und bietet dem Netzwerk des Containers einen Pfad zurdocker0-Brücke auf dem Hostsystem. Docker konfiguriert automatisch die Regeln voniptables, um die Weiterleitung zu ermöglichen, und konfiguriert die NAT-Maskierung für Datenverkehr, der vondocker0für die Außenwelt stammt.

Wie setzen Container Dienstleistungen für Verbraucher aus?

Andere Container auf demselben Host können ohne zusätzliche Konfiguration auf Dienste zugreifen, die von ihren Nachbarn bereitgestellt werden. Das Host-System leitet Anforderungen, die von derdocker0-Schnittstelle stammen und für diese bestimmt sind, einfach an den entsprechenden Speicherort weiter.

Container können ihre Ports für den Host freigeben und von der Außenwelt weitergeleiteten Datenverkehr empfangen. Offene Ports können dem Host-System zugeordnet werden, indem entweder ein bestimmter Port ausgewählt wird oder Docker einen zufälligen, hohen, nicht verwendeten Port auswählt. Docker kümmert sich um alle Weiterleitungsregeln und die Konfiguration voniptables, um Pakete in diesen Situationen korrekt weiterzuleiten.

Was ist der Unterschied zwischen dem Bereitstellen und Veröffentlichen eines Ports?

Wenn Sie Container-Images erstellen oder einen Container ausführen, können Sie Ports verfügbar machen oder Ports veröffentlichen. Der Unterschied zwischen den beiden ist signifikant, aber möglicherweise nicht sofort erkennbar.

Das Anzeigen eines Ports bedeutet lediglich, dass Docker zur Kenntnis nimmt, dass der betreffende Port vom Container verwendet wird. Dies kann dann zu Erkennungszwecken und zum Verknüpfen verwendet werden. Wenn Sie beispielsweise einen Container untersuchen, erhalten Sie Informationen zu den freigelegten Ports. Wenn Container verknüpft sind, werden Umgebungsvariablen im neuen Container festgelegt, die die Ports angeben, die im ursprünglichen Container verfügbar gemacht wurden.

Standardmäßig sind Container für das Hostsystem und alle anderen Container auf dem Host zugänglich, unabhängig davon, ob Ports verfügbar sind. Das Offenlegen des Ports dokumentiert lediglich die Portnutzung und stellt diese Informationen für automatisierte Zuordnungen und Verknüpfungen zur Verfügung.

Wenn Sie dagegen einen Port veröffentlichen, wird er der Host-Schnittstelle zugeordnet und der Außenwelt zur Verfügung gestellt. Container-Ports können entweder einem bestimmten Port auf dem Host zugeordnet werden, oder Docker kann automatisch einen hohen, nicht verwendeten Port nach dem Zufallsprinzip auswählen.

Docker bietet einen Mechanismus namens „Docker-Links“ zum Konfigurieren der Kommunikation zwischen Containern. Wenn ein neuer Container mit einem vorhandenen Container verknüpft ist, erhält der neue Container über Umgebungsvariablen Verbindungsinformationen für den vorhandenen Container.

Auf diese Weise können Sie auf einfache Weise die Kommunikation zwischen zwei Containern herstellen, indem Sie dem neuen Container explizite Informationen zum Zugriff auf seinen Begleiter geben. Die Umgebungsvariablen werden entsprechend den vom anderen Container freigegebenen Ports festgelegt. Die IP-Adresse und andere Informationen werden von Docker selbst eingegeben.

Projekte zur Erweiterung der Netzwerkfähigkeiten von Docker

Das oben diskutierte Netzwerkmodell bietet einen guten Ausgangspunkt für den Netzwerkaufbau. Die Kommunikation zwischen Containern auf demselben Host ist recht einfach, und die Kommunikation zwischen Hosts kann über reguläre öffentliche Netzwerke erfolgen, sofern die Ports korrekt zugeordnet sind und die Verbindungsinformationen an die andere Partei weitergegeben werden.

Viele Anwendungen erfordern jedoch aus Sicherheits- oder Funktionsgründen bestimmte Netzwerkumgebungen. Die native Netzwerkfunktionalität von Docker ist in diesen Szenarien etwas eingeschränkt. Aus diesem Grund wurden viele Projekte erstellt, um das Docker-Netzwerk-Ökosystem zu erweitern.

Erstellen von Overlay-Netzwerken zur Zusammenfassung der zugrunde liegenden Topologie

Eine funktionale Verbesserung, auf die sich mehrere Projekte konzentriert haben, ist die Einrichtung von Overlay-Netzwerken. Ein Overlay-Netzwerk ist ein virtuelles Netzwerk, das auf vorhandenen Netzwerkverbindungen aufbaut.

Durch das Einrichten von Overlay-Netzwerken können Sie eine vorhersehbare und einheitliche Netzwerkumgebung für alle Hosts erstellen. Dies kann die Vernetzung zwischen Containern vereinfachen, unabhängig davon, wo sie ausgeführt werden. Ein einzelnes virtuelles Netzwerk kann sich über mehrere Hosts erstrecken, oder jedem Host in einem einheitlichen Netzwerk können bestimmte Subnetze zugewiesen werden.

Eine andere Verwendung eines Overlay-Netzwerks ist der Aufbau von Fabric-Computing-Clustern. Beim Fabric-Computing werden mehrere Hosts als eine einzige, leistungsfähigere Einheit abstrahiert und verwaltet. Durch die Implementierung einer Fabric-Computing-Schicht kann der Endbenutzer den Cluster als Ganzes anstatt einzelner Hosts verwalten. Das Netzwerk spielt eine große Rolle bei diesem Clustering.

Erweiterte Netzwerkkonfiguration

Andere Projekte erweitern die Netzwerkfähigkeiten von Docker, indem sie mehr Flexibilität bieten.

Die Standard-Netzwerkkonfiguration von Docker ist funktional, aber recht einfach. Diese Einschränkungen kommen beim Umgang mit hostübergreifenden Netzwerken am besten zur Geltung, können jedoch auch individuellere Netzwerkanforderungen innerhalb eines einzelnen Hosts beeinträchtigen.

Zusätzliche Funktionalität wird durch zusätzliche "Sanitär" -Funktionen bereitgestellt. Diese Projekte bieten keine sofort einsatzbereite Konfiguration, ermöglichen es Ihnen jedoch, Teile manuell zusammenzufügen und komplexe Netzwerkszenarien zu erstellen. Einige der Fähigkeiten, die Sie erlangen können, reichen von der einfachen Einrichtung eines privaten Netzwerks zwischen bestimmten Hosts bis zur Konfiguration von Bridges, VLANs, benutzerdefinierten Subnetzen und Gateways.

Es gibt auch eine Reihe von Tools und Projekten, die zwar nicht im Hinblick auf Docker entwickelt wurden, jedoch häufig in Docker-Umgebungen verwendet werden, um die erforderlichen Funktionen bereitzustellen. Insbesondere werden häufig ausgereifte private Netzwerk- und Tunneling-Technologien verwendet, um eine sichere Kommunikation zwischen Hosts und zwischen Containern bereitzustellen.

Welche gängigen Projekte zur Verbesserung des Docker-Netzwerks gibt es?

Es gibt verschiedene Projekte, die sich mit der Bereitstellung von Overlay-Netzwerken für Docker-Hosts befassen. Die häufigsten sind:

  • flannel: Dieses vom CoreOS-Team entwickelte Projekt wurde ursprünglich entwickelt, um jedem Hostsystem ein eigenes Subnetz eines gemeinsam genutzten Netzwerks bereitzustellen. Dies ist eine Voraussetzung dafür, dass das Kubernetes-Orchestrierungs-Tool von Google funktioniert. In anderen Situationen ist dies jedoch hilfreich.

  • weave: Weave erstellt ein virtuelles Netzwerk, das jeden Hostcomputer miteinander verbindet. Dies vereinfacht das Routing von Anwendungen, da jeder Container an einen einzelnen Netzwerk-Switch angeschlossen wird.

In Bezug auf fortschrittliche Vernetzung zielt das folgende Projekt darauf ab, diese Stelle durch zusätzliche Sanitärinstallationen zu besetzen:

  • pipework: Dieses Projekt wurde als Stop-Gap-Maßnahme erstellt, bis das native Docker-Netzwerk weiterentwickelt wird. Es ermöglicht die einfache Konfiguration beliebig erweiterter Netzwerkkonfigurationen.

Ein relevantes Beispiel für vorhandene Software, die für das Hinzufügen von Funktionen zu Docker kooptiert wurde, ist:

  • tinc: Tinc ist eine leichte VPN-Software, die mithilfe von Tunneln und Verschlüsselung implementiert wird. Tinc ist eine robuste Lösung, die das private Netzwerk für alle Anwendungen transparent macht.

Fazit

Die Bereitstellung interner und externer Dienste über containerisierte Komponenten ist ein sehr leistungsfähiges Modell, aber Überlegungen zur Vernetzung werden zu einer Priorität. Während Docker einige dieser Funktionen nativ durch die Konfiguration von virtuellen Schnittstellen, Subnetzen,iptables und NAT-Tabellenverwaltung bereitstellt, wurden andere Projekte erstellt, um erweiterte Konfigurationen bereitzustellen.

In dennext guide werden wir diskutieren, wie Scheduler und Orchestrierungs-Tools auf dieser Grundlage aufbauen, um Cluster-Container-Verwaltungsfunktionen bereitzustellen.