Zurück zur Startseite

Docker Container Networking erklärt: Ein praktischer Leitfaden

Dieser umfassende Leitfaden erklärt Docker Container Networking von Grund auf, einschließlich der Einschränkungen des Standard-Bridge, der Vorteile benutzerdefinierter Bridges, wichtiger Netzwerktreiber, DNS-Service-Discovery, Port-Publishing und praktischer Konfigurationsschritte. Er vermittelt Entwicklern und Systemadministratoren das Wissen, um sichere, isolierte und skalierbare containerisierte Anwendungen zu erstellen.

Docker Networking: Vollständiger Leitfaden für Container
Advertisement 728x90

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.

Google AdInline article slot

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:

Google AdInline article slot
  1. 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 einem db-Container herstellen, indem er einfach den Hostnamen db verwendet. Dies ist im Standard-Bridge-Netzwerk nicht möglich, das veraltete --link-Flags oder manuelle Manipulationen von /etc/hosts erfordert.

  2. Bessere Isolation: Alle Container ohne Angabe von --network werden 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.

  3. 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 slot
  4. Konfigurierbare 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.conf des 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 Adresse 127.0.0.11 verwenden.

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.

  1. 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-container

    Sie können einen Container nicht von seinem letzten Netzwerk trennen; er muss immer mit mindestens einem verbunden sein.

  2. 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 network

    Um 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

— Editorial Team

Advertisement 728x90

Weiterlesen