5.1 Haupttypen von benutzerdefinierten Netzwerken
Benutzerdefinierte Netzwerke in Docker bieten flexible Möglichkeiten zur Konfiguration und Verwaltung der Netzwerkkommunikation zwischen Containern. Sie ermöglichen es, Container zu isolieren, ihre Interaktionen zu organisieren und komplexe Netzwerktopologien zu erstellen. In dieser Vorlesung schauen wir uns an, wie man benutzerdefinierte Netzwerke in Docker erstellt und konfiguriert sowie Beispiele für deren Verwendung.
Haupttypen von benutzerdefinierten Netzwerken
Docker unterstützt mehrere Arten von benutzerdefinierten Netzwerken, die jeweils ihre eigenen Merkmale haben und für verschiedene Nutzungsszenarien gedacht sind:
-
Bridge (Bridge-Netzwerke)
: bieten Isolierung und Kommunikation zwischen Containern auf einem Host. Dieser Netzwerktype wird standardmäßig für lokale Anwendungen verwendet, die keine Interaktion außerhalb des Hosts benötigen. -
Overlay (Overlay-Netzwerke)
: gedacht für die Kommunikation von Containern, die auf verschiedenen Hosts in einem Docker Swarm- oder Kubernetes-Cluster arbeiten. Sie bieten hohe Skalierbarkeit und Sicherheit für verteilte Anwendungen. -
Macvlan
: ermöglichen es Containern, die physische Netzwerkschnittstelle des Hosts direkt zu verwenden. Das ist nützlich für Netzwerk-Anwendungen mit hohen Leistungsanforderungen sowie in Fällen, in denen Bindung an bestimmte MAC-Adressen erforderlich ist. Container im Macvlan-Netzwerk können wie eigenständige Knoten mit anderen Geräten im physischen Netzwerk kommunizieren. -
Host (Host-Netzwerke)
: Container nutzen den Netzwerk-Stack des Hosts, wodurch der Overhead der Netzwerkvirtualisierung entfällt, aber die Isolierung verringert wird. Dieser Netzwerktype ist geeignet für Anwendungen, die maximale Netzwerkleistung erfordern.
5.2 Erstellen und Verwenden von bridge Netzwerken
Bridge Netzwerke sind der am häufigsten verwendete Typ von benutzerdefinierten Netzwerken und werden zur Isolierung von Containern auf einem Host verwendet. Container, die mit demselben bridge Netzwerk verbunden sind, können über IP-Adressen und Hostnamen miteinander interagieren.
Erstellung eines benutzerdefinierten bridge Netzwerks
Um ein benutzerdefiniertes bridge Netzwerk
zu erstellen, benutze den Befehl docker network create
:
docker network create --driver bridge my_bridge_network
Starten von Containern im benutzerdefinierten Netzwerk
Starte Container mit einer Verbindung zum erstellten Netzwerk:
docker run -d --name container1 --network my_bridge_network nginx
docker run -d --name container2 --network my_bridge_network busybox sleep 1000
Überprüfung der Verbindung zwischen Containern
Du kannst den Befehl ping
verwenden, um die Verbindung zwischen Containern zu überprüfen:
docker exec container2 ping -c 4 container1
Wenn die Container korrekt mit dem Netzwerk my_bridge_network
verbunden sind, wird der Befehl ping
erfolgreich sein.
5.3 Benutzerdefinierte Netzwerke in Docker Compose
Beispiele für die Verwendung von benutzerdefinierten Netzwerken in Docker Compose
Docker Compose vereinfacht das Erstellen und Verwalten von Netzwerken für Multi-Container-Anwendungen. Du kannst benutzerdefinierte Netzwerke in der Datei docker-compose.yml
definieren.
Beispiel für eine docker-compose.yml
-Datei:
version: '3.8'
services:
web:
image: nginx:latest
networks:
- my_bridge_network
app:
image: myapp:latest
networks:
- my_bridge_network
networks:
my_bridge_network:
driver: bridge
Starte Docker Compose:
docker compose up -d
In diesem Beispiel sind beide Services (web
und app
) mit dem benutzerdefinierten Netzwerk my_bridge_network
verbunden.
5.4 Konfiguration und Nutzung von macvlan
-Netzwerken
macvlan
-Netzwerke erlauben es Containern, direkt die physische Netzwerkschnittstelle des Hosts zu nutzen, was für Anwendungen mit hohen Anforderungen an die Netzwerkleistung nützlich sein kann. Container in einem solchen Netzwerk erhalten eigene IP-Adressen innerhalb des angegebenen Subnetzes, wodurch sie im selben Netzwerk wie der Host sichtbar werden.
Erstellen eines macvlan
-Netzwerks
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my_macvlan_network
In diesem Befehl:
--subnet
: definiert das Subnetz, in dem sich die Container befinden werden.--gateway
: gibt das Gateway für die Container an.-o parent
: gibt die Netzwerkschnittstelle des Hosts an, mit der das Netzwerk verbunden ist.
Container im macvlan
-Netzwerk starten
docker run -d --name container1 --network my_macvlan_network nginx
docker run -d --name container2 --network my_macvlan_network busybox sleep 1000
In diesem Beispiel sind beide Container mit dem Netzwerk my_macvlan_network
verbunden und haben Zugriff auf das externe Netzwerk über die physische Schnittstelle eth0
.
5.5 Beispiele für die Verwendung in Docker Compose
Du kannst ebenfalls macvlan
-Netzwerke in Docker Compose
verwenden. Zum Beispiel:
version: '3.8'
services:
web:
image: nginx:latest
networks:
- my_macvlan_network
networks:
my_macvlan_network:
driver: macvlan
driver_opts:
parent: eth0
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
Starte Docker Compose
:
docker compose up -d
In diesem Beispiel ermöglicht das Netzwerk my_macvlan_network
dem Service web
, mit Geräten im Subnetz 192.168.1.0/24
einschließlich des Hosts zu kommunizieren.
Praktische Empfehlungen:
- Netzwerkzugriff konfigurieren: Stelle sicher, dass dein Router oder Netzwerkadministrator die Nutzung des Subnetzes erlaubt, das in den
macvlan
-Einstellungen angegeben ist. - Isolation: Wenn Sicherheit wichtig ist, nutze VLANs, um das Netzwerk zu segmentieren, sodass Container nur Zugriff auf notwendige Ressourcen haben.
- Testen: Überprüfe nach der Konfiguration die Verbindung zwischen Containern und dem externen Netzwerk mithilfe von Befehlen wie
ping
odercurl
.
5.6 Beispiel zur Verwendung von Netzwerken für Microservices
Schauen wir uns ein Beispiel an, bei dem wir ein Frontend, ein Backend und eine Datenbank haben, die in verschiedene Netzwerke isoliert sind, aber trotzdem über Netzwerküberschneidungen miteinander interagieren können.
Datei docker-compose.yml
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
- db-tier
database:
image: postgres:latest
environment:
POSTGRES_USER: benutzer
POSTGRES_PASSWORD: passwort
networks:
- db-tier
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
db-tier:
driver: bridge
Starte Docker Compose
:
docker compose up -d
In diesem Beispiel:
- Der Service
frontend
ist mit den Netzwerkenfront-tier
undback-tier
verbunden, was ihm erlaubt, sowohl mit externen Clients als auch mit dem Backend zu kommunizieren. - Der Service
backend
ist mit den Netzwerkenback-tier
unddb-tier
verbunden, was ihm erlaubt, sowohl mit dem Frontend als auch mit der Datenbank zu kommunizieren. - Der Service
database
ist nur mit dem Netzwerkdb-tier
verbunden, was die Datenbank vor externem Zugriff isoliert.
Praktische Empfehlungen:
- Verwende Isolation: Die Trennung von Netzwerken hilft, den Zugriff von Services auf Datenbanken oder andere kritische Ressourcen zu begrenzen.
- Verbindung testen: Stelle sicher, dass Services über gemeinsame Netzwerke miteinander kommunizieren können, indem du Befehle wie
ping
odercurl
verwendest. - Optimierung: Verwende das Netzwerk
overlay
, wenn dein Projekt in einem Cluster oder auf mehreren Hosts betrieben wird.
Dieses Beispiel zeigt, wie man Netzwerkisolation erstellt und gleichzeitig die Interaktion zwischen verschiedenen Anwendungsebenen ermöglicht.
GO TO FULL VERSION