Docker-Container-Netzwerke: Ein praktischer Leitfaden
Docker-Container-Netzwerke: Ein praktischer Leitfaden
Wenn Sie mit Docker arbeiten, stoßen Sie schnell auf eine der ersten Herausforderungen: Wie kommunizieren Container miteinander und mit der Außenwelt? Docker-Container-Netzwerke einfach erklärt sind das System aus virtuellen Netzwerken und Regeln, das diese Kommunikation ermöglicht – und dabei Isolation, Sicherheit und Konnektivität für Ihre containerisierten Anwendungen gewährleistet. Diese Konzepte zu verstehen ist nicht nur theoretisch; es ist grundlegend für den Aufbau sicherer, skalierbarer und wartbarer Container-Bereitstellungen.
Was Sie lernen werden
Sie verstehen die Kernkonzepte des Docker-Netzwerkmodells – vom Standard-Bridge bis zu spezialisierten Treibern – und lernen, wie Sie sichere, isolierte Netzwerke für Ihre Container konfigurieren. Am Ende können Sie Netzwerktopologien entwerfen, die sensible Dienste isolieren, nahtlose Service-Discovery ermöglichen und häufige Konnektivitätsprobleme beheben. Die wichtigste Erkenntnis: Benutzerdefinierte Bridge-Netzwerke sind den Standard-Bridge-Netzwerken für die meisten Produktionsanwendungen weit überlegen.
Der Kern von Docker-Netzwerken
Im Kern bezeichnet Container-Netzwerke die Fähigkeit von Containern, sich miteinander und mit Nicht-Docker-Netzwerkdiensten zu verbinden und zu kommunizieren. Standardmäßig haben Container Netzwerke aktiviert und können ausgehende Verbindungen herstellen. Ein Container sieht eine Netzwerkschnittstelle mit einer IP-Adresse, einem Gateway, einer Routing-Tabelle und DNS-Diensten, hat jedoch keine Informationen über die Art des Netzwerks, an das er angeschlossen ist, oder ob seine Peers ebenfalls Docker-Container sind.
Wenn die Docker-Engine zum ersten Mal unter Linux startet, erstellt sie ein einzelnes integriertes Netzwerk namens "Standard-Bridge-Netzwerk". Wenn Sie einen Container ohne die Option --network ausführen, wird er an dieses Standard-Bridge-Netzwerk angeschlossen. Obwohl funktionsfähig, hat diese Standardkonfiguration erhebliche Einschränkungen – vor allem das Fehlen einer automatischen DNS-Auflösung zwischen Containern.
Benutzerdefinierte Bridge-Netzwerke: Die bessere Wahl
Für jede ernsthafte Anwendung sollten Sie benutzerdefinierte Bridge-Netzwerke erstellen. Diese benutzerdefinierten Netzwerke bieten mehrere entscheidende Vorteile gegenüber dem Standard-Bridge-Netzwerk:
Automatische DNS-Auflösung: Container in einem benutzerdefinierten Bridge-Netzwerk können einander über den Containernamen oder Alias auflösen. Beispielsweise kann ein
web-Container eine Verbindung zu einemdb-Container herstellen, indem er einfach den Hostnamendbverwendet. Dies ist im Standard-Bridge-Netzwerk nicht möglich, das veraltete--link-Flags oder manuelle Manipulationen von/etc/hostserfordert.Bessere Isolation: Alle Container ohne Angabe von
--networkwerden an das Standard-Bridge-Netzwerk angeschlossen, was ein Risiko darstellt, dass nicht zusammenhängende Container kommunizieren können. Benutzerdefinierte Netzwerke bieten ein abgegrenztes Netzwerk, das Container voneinander isoliert, sofern sie nicht explizit verbunden werden.Flexibles An- und Abkoppeln: Sie können einen laufenden Container ohne Neustart von benutzerdefinierten Netzwerken trennen oder mit ihnen verbinden. Um das Netzwerk eines Containers im Standard-Bridge-Netzwerk zu ändern, müssen Sie ihn stoppen und neu erstellen.
Google AdInline article slotKonfigurierbare Bridges: Jedes benutzerdefinierte Netzwerk kann mit eigenen Einstellungen (wie MTU und Firewall-Regeln) konfiguriert werden, sodass Sie Netzwerke für unterschiedliche Anwendungsanforderungen anpassen können.
So erstellen und verwenden Sie ein benutzerdefiniertes Bridge-Netzwerk
Das Erstellen und Verwenden eines benutzerdefinierten Bridge-Netzwerks ist unkompliziert. Dies ist die Grundlage für eine sichere und verwaltbare Docker-Netzwerkkonfiguration.
Schritt 1: Erstellen Sie das Netzwerk.
docker network create my-secure-network
Standardmäßig wird damit ein Bridge-Netzwerk erstellt. Sie können auch einen Treiber mit dem Flag -d angeben (z. B. docker network create -d bridge my-net).
Schritt 2: Führen Sie Container in diesem Netzwerk aus.
docker run -d --name web --network my-secure-network nginx
docker run -d --name db --network my-secure-network postgres
Der web-Container kann jetzt mit dem db-Container über den Hostnamen db kommunizieren.
Schritt 3: Verbinden Sie einen laufenden Container mit dem Netzwerk.
docker network connect my-secure-network already-running-container
Ein Container kann gleichzeitig mit mehreren Netzwerken verbunden werden – eine leistungsstarke Funktion zum Erstellen komplexer Netzwerkmuster, wie z. B. ein Frontend, das sowohl mit einem externen als auch einem internen Backend-Netzwerk verbunden ist.
Wichtige Netzwerktreiber und ihre Anwendungsfälle
Das Docker-Netzwerk ist modular aufgebaut und verwendet Treiber, um Kernfunktionen bereitzustellen. Hier ist eine Übersicht der wichtigsten Treiber, denen Sie begegnen werden.
| Treiber | Beschreibung | Am besten geeignet für |
|---|---|---|
| bridge | Der Standard-Netzwerktreiber. Erstellt ein privates internes Netzwerk auf dem Host. | Einzelhost-Anwendungen, bei denen Container miteinander kommunizieren müssen. Dies ist die Standard- und häufigste Wahl. |
| host | Entfernt die Netzwerkisolation. Der Container teilt sich direkt den Netzwerk-Stack des Hosts. | Leistungskritische Anwendungen oder Dienste, die viele Ports oder netzwerkbezogene Vorgänge verwalten müssen (z. B. ein netzwerkweiter DNS-/DHCP-Dienst wie Pi-hole). Sicherheitswarnung: Dieser Modus entfernt eine wichtige Isolationsschicht. |
| none | Deaktiviert das Netzwerk für einen Container. Er hat nur eine Loopback-Schnittstelle (lo). |
Hochisolierte Aufgaben wie Offline-Batchverarbeitung oder Aufgaben, die keinen Netzwerkzugriff benötigen. |
| overlay | Verbindet mehrere Docker-Daemons miteinander und ermöglicht Kommunikation über Hosts hinweg. | Docker Swarm-Cluster und Multi-Host-Anwendungen. |
| macvlan | Weist einem Container eine MAC-Adresse zu, sodass er als physisches Gerät in Ihrem Netzwerk erscheint. | Legacy-Anwendungen oder VM-Migrationen, bei denen der Container direkt im physischen Netzwerk sein muss. |
| ipvlan | Ähnlich wie macvlan, jedoch ohne eindeutige MAC-Adressen, mit vollständiger Kontrolle über IPv4-/IPv6-Adressierung. | Netzwerkumgebungen, in denen die Anzahl der zuweisbaren MAC-Adressen eingeschränkt ist. |
Für die meisten Entwickler wird der bridge-Treiber – insbesondere ein benutzerdefiniertes Bridge-Netzwerk – das wichtigste Werkzeug in ihrem Arsenal sein.
Host-Modus im Detail verstehen
Der host-Netzwerktreiber ist ein leistungsstarkes, aber spezialisiertes Werkzeug. Er entfernt die Netzwerkisolation zwischen dem Container und dem Docker-Host, sodass der Container direkt den Netzwerk-Stack des Hosts verwendet. Wie ein Praktiker anmerkte, ist dies ideal für Dienste, die Broadcast-Verkehr verarbeiten müssen, wie DNS- und DHCP-Dienste.
⚠️ Wichtige Warnung: Host-Netzwerke sind nicht plattformübergreifend freundlich. Sie funktionieren nur unter Linux wie erwartet. Unter macOS und Windows (über Docker Desktop) verhalten sie sich aufgrund der VM-Implementierung anders. Darüber hinaus verlieren Sie die Möglichkeit, die Docker-DNS-Service-Discovery für den Container zu verwenden, und können ihn im Host-Modus nicht mit anderen Netzwerken verbinden.
Beispiel mit Docker Compose:
version: "3"
services:
web:
image: nginx:latest
network_mode: host
Dieser Container ist direkt über die IP-Adresse Ihres Hosts erreichbar. Es ist keine ports-Direktive erforderlich.
Ports veröffentlichen: Container mit der Außenwelt verbinden
Standardmäßig sind Ports in Bridge-Netzwerken von außerhalb des Hosts nicht zugänglich. Um einen Dienst extern verfügbar zu machen, veröffentlichen Sie Ports mit dem Flag -p oder --publish.
docker run -d -p 8080:80 --name webserver nginx
Dies bildet Port 8080 auf dem Docker-Host auf Port 80 im Container ab. Datenverkehr, der an die IP Ihres Hosts auf Port 8080 ankommt, wird an den Container weitergeleitet.
- Um alle freigegebenen Ports zu veröffentlichen, verwenden Sie das Flag
-P. - Um den Zugriff nur auf localhost zu beschränken, veröffentlichen Sie auf
127.0.0.1:docker run -p 127.0.0.1:8080:80 nginx. - Es ist wichtig zu beachten, dass Sie keine Ports veröffentlichen müssen, damit Container im selben Bridge-Netzwerk miteinander kommunizieren können; sie können dies direkt über ihre Containernamen und Ports tun.
DNS und Service-Discovery
Standardmäßig übernehmen Container die DNS-Einstellungen des Docker-Hosts. Es gibt jedoch einen entscheidenden Unterschied:
- Standard-Bridge-Netzwerk: Container erhalten eine Kopie der Datei
/etc/resolv.confdes Hosts. - Benutzerdefinierte Netzwerke: Container verwenden den integrierten DNS-Server von Docker unter
127.0.0.11. Dieser Server leitet externe DNS-Abfragen an die konfigurierten Server des Hosts weiter. Dieser integrierte DNS ermöglicht die magische Auflösung von Containernamen. Wenn eine Anwendung in einem Container explizit den Docker-DNS-Server abfragen muss, sollte sie die Adresse127.0.0.11verwenden.
Sie können DNS-Einstellungen pro Container mit Flags wie --dns, --dns-search und --dns-opt überschreiben.
Praktischer Arbeitsablauf: Netzwerk eines Containers ändern
Das Ändern der Netzwerkkonfiguration eines Containers ist möglich, aber es gibt wichtige Einschränkungen.
Für einen Container in einem Bridge-Netzwerk: Sie können ihn im laufenden Betrieb mit Netzwerken verbinden und von ihnen trennen.
# Laufenden Container mit einem benutzerdefinierten Netzwerk verbinden docker network connect my-new-network my-container # Vom Standard-Bridge trennen docker network disconnect bridge my-containerSie können einen Container nicht von seinem letzten Netzwerk trennen; er muss immer mit mindestens einem verbunden sein.
Für einen Container in einem Host-Netzwerk: Es ist unmöglich, seine Netzwerkkonfiguration zu ändern oder ihn im laufenden Betrieb mit einem anderen Netzwerk zu verbinden. Wenn Sie es versuchen, erhalten Sie eine Fehlermeldung:
Error response from daemon: container sharing network namespace with another container or host cannot be connected to any other networkUm sein Netzwerk zu ändern, müssen Sie den Container stoppen, entfernen und neu erstellen, wobei Sie seine Konfiguration durch die gleichen Umgebungsvariablen, Volumes und anderen Einstellungen beibehalten.
Häufig gestellte Fragen
Was ist der Unterschied zwischen dem Standard-Bridge- und einem benutzerdefinierten Bridge-Netzwerk? Der wichtigste Unterschied ist die automatische DNS-Auflösung: Container in einem benutzerdefinierten Bridge-Netzwerk können über den Containernamen kommunizieren, während Container im Standard-Bridge-Netzwerk einander nur über die IP-Adresse erreichen können. Benutzerdefinierte Netzwerke bieten auch eine bessere Isolation und die Flexibilität, Container im laufenden Betrieb an- und abzukoppeln.
Wie mache ich einen Container von meinem lokalen Netzwerk oder dem Internet aus zugänglich?
Sie müssen die Ports des Containers mit dem Flag -p oder --publish veröffentlichen. Beispielsweise bildet -p 8080:80 Port 8080 auf Ihrem Docker-Host auf Port 80 im Container ab und macht den Dienst über die IP-Adresse Ihres Hosts verfügbar.
Kann ich einen Container mit mehreren Netzwerken verbinden?
Ja, das ist eine leistungsstarke Funktion. Ein Container kann gleichzeitig mit mehreren Netzwerken verbunden werden, indem Sie beim Erstellen das Flag --network mehrmals verwenden oder den Befehl docker network connect für laufende Container. Dies ist nützlich, um eine Anwendung mit sowohl externen als auch internen privaten Netzwerken zu erstellen.
Warum kann ich meine Container nicht vom Docker-Host aus anpingen?
Unter Docker Desktop für Mac und Windows können Sie Linux-Container nicht direkt vom Host aus anpingen, da die Netzwerkimplementierung innerhalb der VM erfolgt. Dies ist eine bekannte Einschränkung, und die Bridge-Schnittstelle docker0 ist auf dem Host nicht sichtbar. Ein Windows-Benutzer kann jedoch Windows-Container anpingen.
Wann sollte ich den host-Netzwerktreiber verwenden?
Sie sollten den host-Treiber nur für spezifische Anwendungsfälle verwenden, bei denen die native Netzwerkleistung entscheidend ist oder der Dienst netzwerkbezogene Funktionen (wie einen DNS-/DHCP-Server) verarbeiten muss. Dies geht zu Lasten von Sicherheit und Portabilität, da er nur unter Linux zuverlässig funktioniert und die Netzwerkisolation aufhebt.
Quellen
- Docker Docs. "Networking overview." https://docs.docker.com/engine/network/
- GitHub. "arnab-logs/understanding-docker-networks." https://github.com/arnab-logs/understanding-docker-networks
- Docker Docs. "Explore networking how-tos on Docker Desktop." https://docs.docker.com/desktop/features/networking/networking-how-tos/
- Docker Docs. "Network drivers." https://docs.docker.com/engine/network/drivers/
- Docker Docs (chinesische Übersetzung). "网络 | 容器教程." https://docs.dockerd.com.cn/engine/network/
- Linux Handbook. "Using Docker Compose with Host Network Configuration." https://linuxhandbook.com/docker-compose-host-network-configuration/
- Docker Docs. "Bridge network driver." https://docs.docker.com/engine/network/drivers/bridge/
- Baeldung. "How to Change the Network of a Running Docker Container?" https://www.baeldung.com/ops/docker-container-change-network
— Editorial Team
Noch keine Kommentare.