Um Docker Container miteinander zu verbinden und intern oder extern mit einem Container zu kommunizieren, gibt es verschiedene Möglichkeiten. Einige Docker-Grundlagen sollten für dieses Tutorial bereits vorhanden sein, sind aber nicht zwingend notwendig, ansonsten empfehle ich meinen Kurs Das große Docker & Linux Enterprise Bootcamp zu besuchen.
Hier kommst du zu Teil 1 und Teil 2 dieser Serie über das Docker-Netzwerk.
In dieser Serie verwende ich eine VirtualBox mit einem frisch installierten Ubuntu LTS. Du kannst die Beispiele aber auch auf jeder anderen Maschine oder auf einem gemieteten Server wie z.B. von Netcup nachvollziehen.
Docker-Container im Host-Netzwerk nutzen
Wenn du den Host-Netzwerkmodus für einen Container verwendest, ist der Netzwerkstack des Containers nicht vom Docker-Host isoliert (der Container nutzt den Netzwerk-Namensraum des Hosts), und dem Container wird keine eigene IP-Adresse zugewiesen. Wenn du beispielsweise einen Container ausführst, der sich an Port 80 bindet, und das Host-Netzwerk verwendet, ist die Anwendung des Containers an Port 80 auf der IP-Adresse des Hosts verfügbar.
docker stop enterprise
docker run -itd --rm --network host --name enterprise nginx
Nun haben wir einen neuen Docker-Container im Hostnetzwerk erstellt. Dieser hat nun die gleichen Eigenschaften wie jede andere Anwendung, die auf demselben Host-Computer läuft.
Hinweis: Da der Container keine eigene IP-Adresse hat, wenn er im Host-Modus vernetzt ist, wird das Port-Mapping nicht wirksam, und die Optionen -p, --publish, -P und --publish-all werden ignoriert und führen stattdessen zu einer Warnung.
Die Vernetzung im Host-Modus kann nützlich sein, um die Leistung zu optimieren und in Situationen, in denen ein Container eine große Anzahl von Ports verarbeiten muss, da keine Network Address Translation (NAT) erforderlich ist und kein "Userland-Proxy" für jeden Port erstellt wird.
Der Host-Networking-Treiber funktioniert nur auf Linux-Hosts und wird nicht von Docker Desktop für Mac, Docker Desktop für Windows oder Docker EE für Windows Server unterstützt.
MACVLAN
Einige Anwendungen, insbesondere ältere Anwendungen oder Anwendungen, die den Netzwerkverkehr überwachen, erwarten eine direkte Verbindung mit dem physischen Netzwerk. In solchen Fällen kannst du den macvlan-Netzwerktreiber verwenden, um der virtuellen Netzwerkschnittstelle jedes Containers eine MAC-Adresse zuzuweisen, so dass sie wie eine physische Netzwerkschnittstelle aussieht, die direkt mit dem physischen Netzwerk verbunden ist. In diesem Fall musst du eine physische Schnittstelle auf deinem Docker-Host angeben, die für das macvlan verwendet werden soll, sowie das Subnetz und das Gateway des macvlan. Du kannst deine macvlan-Netzwerke sogar mit verschiedenen physischen Netzwerk-Interfaces isolieren.
Wichtiger Hinweis zu MACVLAN:
- Macvlan-Netzwerke werden in der Regel von den meisten Cloud-Anbietern blockiert. Du brauchst also physischen Zugang zu deinem Server.
- Der macvlan Netzwerktreiber funktioniert nur auf Linux-Hosts. Er wird auf Windows- oder Mac-Geräten nicht unterstützt. Innerhalb einer VirtualBox ist dies jedoch kein Problem.
- Du brauchst einen Linux-Kernel 4.x oder höher.
Wenn du ein macvlan-Netzwerk erstellst, kann es sich entweder im Bridge-Modus oder im 802.1q-Trunk-Bridge-Modus befinden.
- Im Bridge-Modus läuft der macvlan-Verkehr über ein physisches Gerät auf dem Host.
- Im 802.1q-Trunk-Brückenmodus läuft der Verkehr über eine 802.1q-Subschnittstelle, die Docker im laufenden Betrieb erstellt. Dadurch kannst du das Routing und die Filterung auf einer detaillierteren Ebene steuern.
docker network create -d macvlan --subnet 192.168.0.0/24 --gateway 192.168.0.1 -o parent=enp0s3 meinmacvlan
docker network ls
Mit der Option -d macvlan geben wir den gewünschten Treiber an. Als Subnet verwenden wir die IP-Adresse unseres Heimnetzes, als Gateway die unseres Routers. Dann gibt es noch die Option -o parent=enp0s3, hier müssen wir die Netzwerkschnittstelle des Hosts angeben, also eine reale Netzwerkkarte, an die der Datenverkehr angebunden werden soll. Zuletzt geben wir dem neu erstellten Netzwerk einen beliebigen Namen.
docker run -itd --rm --network meinmacvlan --ip 192.168.0.70 --name janeway busybox
docker exec -it janeway sh
ping 192.168.0.1 (IP Adresse eines Host im internen Netzwerk)
ping 8.8.8.8 (IP Adresse eine Host im externen Netzwerk wie die Google DNS)
Promiscuous Mode ( Promiskuitiven Modus )
Wir sehen, dass der Docker Container noch keinen Zugriff auf das Netzwerk hat. In diesem Szenario hat jeder Docker Container eine eigene MAC Adresse, was der Router/Switch ohne den Promiscuous Mode nicht verarbeiten kann, da der Router/Switch ohne den Promiscuous Mode eine MAC Adresse pro Port erwartet.
Sowohl VirtualBox als auch die VM benötigen den Promiskuitiven Modus, bei dem einer physikalischen Schnittstelle mehrere MAC-Adressen zugewiesen werden können. Wenn deine Anwendung mit einer Bridge (auf einem einzelnen Docker-Host) oder einem Overlay (für die Kommunikation zwischen mehreren Docker-Hosts) arbeiten kann, können diese Lösungen langfristig besser sein.
ip link set enp0s3 promisc on
VirtualBox Einstellungen ebenfalls den Promiskuitiven Modus aktivieren
Wenn wir die Einstellungen in der VirtualBox ändern, müssen wir die virtuelle Maschine neu starten, damit sie wirksam wird.
Der MACVLAN hat die gleichen Vorteile wie eine Netzwerkbrücke, jedoch mit dem Vorteil, dass er direkt in das Heimnetzwerk integriert werden kann, mit dem gleichen IP-Adressbereich.
docker run -itd --rm --network meinvmaclan --ip 192.168.0.71 --name tom nginx
Der Nachteil von MACVLAN ist jedoch, dass wir kein DHCP verwenden können, denn wenn wir keine IP-Adresse angeben, weist Docker eine IP-Adresse zu, was zu IP-Adresskonflikten führen kann, da die Zuweisung der Reihe nach erfolgt, unabhängig davon, ob die IP-Adresse bereits vom Router zugewiesen wurde.
Wir können Docker jedoch mitteilen das er mit --ip-range nur aus einem ausgewählten IP-Bereich die IP Adressen zuweisen darf.
802.1q Trunked Bridge Modus
Es kommt häufig vor, dass ein Compute-Host mehrere virtuelle Netzwerke gleichzeitig auf einem Host betreiben muss. Linux-Netzwerke unterstützen seit langem VLAN-Tagging, auch bekannt unter dem Standard 802.1q, um die Isolierung von Datenpfaden zwischen Netzwerken zu gewährleisten. Die mit einem Docker-Host verbundene Ethernet-Verbindung kann so konfiguriert werden, dass sie die 802.1q VLAN-IDs unterstützt, indem Linux-Subinterfaces erstellt werden, die jeweils einer eindeutigen VLAN-ID zugeordnet sind.
Im Beispiel der 802.1q Trunked Bridge fließt dein Datenverkehr über eine Unterschnittstelle von eth0 (genannt eth0.30) und Docker leitet den Datenverkehr über die MAC-Adresse an deinen Container weiter. Für Netzwerkgeräte in deinem Netzwerk scheint dein Container physisch mit dem Netzwerk verbunden zu sein.
In diesem Beispiel erstellen wir ein 802.1q Trunk-Macvlan-Netzwerk namens meinvlan30, das an das Sub-Interface enp0s3.30 angeschlossen ist. Achte darauf, dass du die Parameter Subnetz, Gateway und Parent an dein Netzwerk anpasst.
docker network create -d macvlan --subnet 192.168.30.0/24 --gateway 192.168.30.1 -o parent=enp0s3.30 meinmacvlan30
ip a show
Hierbei musst du jedoch auch dein Netzwerk auf das Trunk konfigurieren, was den rahmen dieses Tutorials sprengt. Du kannst die Befehle docker network ls und docker network inspect meinvlan30 ausführen, um zu überprüfen, ob das Netzwerk existiert.
Von hier aus kannst du einen Container starten und an das Trunk-Bridge-Netzwerk anschließen.
docker run -itd --rm --network=meinmacvlan30 --name voyager30 busybox
Entfernen von macvlan-Netzwerken
Um macvlan-Netzwerke zu entfernen, musst du zunächst die Container stoppen und entfernen, die ein macvlan-Netzwerk verwenden. In unseren obigen Beispielen haben wir beim Starten eines Containers die Option "--rm" verwendet, so dass er automatisch gelöscht wird, wenn wir ihn anhalten.
docker network rm meinvlan30
Weiter geht es im vierten Teil.
Quelle
Docker Kurs - Das große Docker & Linux Enterprise Bootcamp
Docker - https://docs.docker.com/engine/reference/run/#network-settings
Docker Host / MACVLAN unter Windows nicht möglich - https://techcommunity.microsoft.com/t5/itops-talk-blog/docker-host-network-alternatives-for-windows-containers/ba-p/3390115