Docker-Netzwerke: Bridge, Host, DNS und Service Discovery erklärt
AI generated
Docker · Netzwerke · DNS · Service Discovery
Docker-Netzwerke verstehen
Bridge, Host, DNS und Service Discovery

Container kommunizieren nicht automatisch miteinander. Docker-Netzwerke definieren, wer wen erreichen kann – und wer nicht. Bridge-Netzwerke, eingebettetes DNS, Service Discovery in Compose und sichere Netzwerktrennung sind die Bausteine jeder belastbaren Container-Infrastruktur.

13 Min. Lesezeit Bridge · Host · none · Overlay · DNS · Service Discovery Docker Engine · Docker Compose · Docker Swarm

1. Warum Docker-Netzwerke wichtiger sind als Ports

Der erste Reflex beim Verbinden von Containern ist das Öffnen von Ports: ports: "3306:3306" und der Datenbankcontainer ist erreichbar. Das Problem: Damit ist die Datenbank auch für jeden anderen Prozess auf dem Host erreichbar, nicht nur für den Applikationscontainer. Docker-Netzwerke lösen das eleganter – Container im selben benutzerdefinierten Netzwerk können sich direkt per Service-Name erreichen, ohne Port-Forwarding auf den Host. Ports müssen nur dann geöffnet werden, wenn ein Dienst von außen erreichbar sein soll.

Wer Docker-Netzwerke richtig versteht, baut Stacks, in denen die Datenbank ausschließlich vom Applikationscontainer erreichbar ist, der Redis-Cache nur von der PHP-Anwendung gesehen wird und der Reverse Proxy als einziger Service einen Host-Port exponiert. Das ist nicht nur sicherer, sondern auch übersichtlicher: Die Netzwerktopologie in der Compose-Datei dokumentiert, welcher Dienst mit wem kommunizieren darf.

2. Bridge-Netzwerke: der Standard-Netzwerktreiber

Der Standard-Netzwerktreiber in Docker-Netzwerken ist bridge. Ein Bridge-Netzwerk erstellt eine virtuelle Netzwerkbrücke auf dem Host, an die Container angeschlossen werden. Alle Container im selben Bridge-Netzwerk können sich gegenseitig über ihre IP-Adressen erreichen. In benutzerdefinierten Bridge-Netzwerken – nicht im Standard-bridge-Netzwerk – funktioniert außerdem Name Resolution über den eingebetteten DNS-Server, sodass Container sich per Service-Name statt per IP ansprechen können.

Das Standard-bridge-Netzwerk, das Docker beim Start anlegt, hat einen wichtigen Unterschied zu benutzerdefinierten Bridge-Netzwerken: Es unterstützt kein eingebettetes DNS. Container im Standard-Bridge-Netzwerk können sich nur per IP oder über einen veralteten --link-Mechanismus verbinden. Deshalb empfiehlt die Docker-Dokumentation ausdrücklich, immer eigene Docker-Netzwerke mit dem bridge-Treiber zu erstellen, statt das Standard-Netzwerk zu verwenden. Docker Compose erledigt das automatisch.


# compose.yaml — Explicit network definitions for clean topology
networks:
  frontend:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24
  backend:
    driver: bridge
    internal: true   # No external access — purely internal communication
  db:
    driver: bridge
    internal: true

services:
  nginx:
    image: nginx:1.27-alpine
    networks:
      - frontend      # Exposed to host via ports
      - backend       # Can reach phpfpm
    ports:
      - "80:80"
      - "443:443"

  phpfpm:
    image: php:8.4-fpm-alpine
    networks:
      - backend       # Reachable from nginx
      - db            # Can reach mysql and redis
    # No ports needed — only nginx talks to phpfpm

  mysql:
    image: mysql:8.4
    networks:
      - db            # Only phpfpm can reach mysql
    # No host port — not accessible from outside the db network

3. Eingebettetes DNS: wie Container sich per Name finden

Docker betreibt in benutzerdefinierten Docker-Netzwerken einen eingebetteten DNS-Server unter der IP 127.0.0.11. Jeder Container in einem benutzerdefinierten Netzwerk hat automatisch diesen DNS-Server als Nameserver konfiguriert. Wenn PHP-FPM einen Datenbankcontainer namens mysql per Hostname ansprechen möchte, fragt es diesen DNS-Server an, der den aktuellen Container-Namen auflöst. Das funktioniert für Service-Namen aus Compose-Dateien, Netzwerk-Aliases und Container-Namen.

Der eingebettete DNS ist dynamisch: Wenn ein Container neu startet und eine neue IP-Adresse bekommt, aktualisiert sich die DNS-Auflösung sofort. Das ist der Grund, warum Service-Namen in Datenbankverbindungsstrings in Docker-Netzwerken stabiler sind als IP-Adressen. IPs können sich bei Container-Neustarts ändern, aber der Service-Name bleibt konstant. Für Magento bedeutet das: mysql als Datenbankhost in env.php, redis als Cache-Backend und opensearch als Suchhost – ohne feste IP-Adressen.

4. Service Discovery in Docker Compose

Docker Compose implementiert Service Discovery automatisch: Jeder Service-Name in der Compose-Datei wird als DNS-Hostname im Netzwerk registriert. Wenn ein Service mehrere Replikate hat, gibt der DNS-Server alle ihre IP-Adressen zurück – Round-Robin-DNS als einfaches Load Balancing. Das ist die Grundlage dafür, dass Services sich in einem Compose-Stack per Name finden, ohne Umgebungsvariablen mit IP-Adressen zu setzen.

Für fortgeschrittene Service Discovery-Szenarien in Docker Compose bieten Netzwerk-Aliases eine Lösung: Einem Container können in einem Netzwerk mehrere Namen zugewiesen werden. Ein Migrations-Container kann unter dem Alias db-migrate erreichbar sein, während der reguläre Datenbankcontainer als mysql angesprochen wird. Sollen zwei Compose-Stacks miteinander kommunizieren, können externe Netzwerke referenziert werden – ein Stack erstellt das Netzwerk, der andere bindet es als extern ein.


# Service discovery with aliases and cross-stack networking
services:
  mysql:
    image: mysql:8.4
    networks:
      db:
        aliases:
          - database     # Reachable as both "mysql" and "database"
          - db-primary   # Useful for read/write splitting

  redis:
    image: redis:7.4-alpine
    networks:
      backend:
        aliases:
          - cache        # phpfpm can use "cache" as hostname
          - session-store

  phpfpm:
    networks:
      - backend
      - db

# Cross-stack networking: reference a network from another Compose project
networks:
  shared-proxy:
    external: true       # Created by the reverse-proxy stack
    name: proxy_default  # Exact network name from the other stack
  backend:
    driver: bridge
    internal: true
  db:
    driver: bridge
    internal: true

# Check DNS resolution inside a container
# docker exec phpfpm nslookup mysql
# docker exec phpfpm getent hosts redis

5. Host-Modus und none: wann auf den Bridge-Treiber verzichten

Neben bridge kennen Docker-Netzwerke zwei weitere wichtige Modi: host und none. Im Host-Modus teilt der Container den Netzwerk-Namespace des Hosts direkt. Es gibt keine Netzwerkisolation, keine Port-Übersetzung und keinen eingebetteten DNS. Der Container bindet direkt an die Host-Netzwerkschnittstellen. Das eliminiert den Overhead der Docker-Netzwerkbrücke und ist relevant für performancekritische Netzwerkanwendungen oder Tools, die den Host-Netzwerkstack direkt beobachten müssen.

Der none-Modus deaktiviert das Netzwerk vollständig. Der Container hat nur eine Loopback-Schnittstelle und kann keine Netzwerkverbindungen aufbauen oder annehmen. Das ist das restriktivste Isolation-Niveau in Docker-Netzwerken und sinnvoll für Batch-Processing-Container, die Dateitransformationen durchführen und keinerlei Netzwerkzugang brauchen. In Sicherheitsaudits und Compliance-Szenarien schließt none eine ganze Klasse von Angriffsvektoren aus.

6. Netzwerktrennung: Frontend, Backend und Datenbank isolieren

Die wichtigste Sicherheitsmaßnahme in Docker-Netzwerken ist die Segmentierung in mehrere Netzwerke. Ein typisches dreischichtiges Modell trennt Frontend, Backend und Datenschicht. Der Reverse Proxy (nginx, Traefik) ist im Frontend-Netzwerk und hat einen Port auf dem Host. Der Applikationsserver (PHP-FPM) ist im Frontend-Netzwerk erreichbar für den Reverse Proxy und im Backend-Netzwerk für Datenbank-Services. MySQL, Redis und OpenSearch sind ausschließlich im internen Netzwerk und nicht vom Frontend-Netzwerk aus erreichbar.

Das Flag internal: true bei einem Docker-Netzwerk verhindert, dass Container in diesem Netzwerk ausgehende Verbindungen ins Internet aufbauen können. Damit ist sichergestellt, dass eine kompromittierte Datenbankinstanz keine Daten nach außen senden kann. Für Entwicklungsumgebungen ist das weniger relevant, aber für Produktions- und Staging-Umgebungen ist es ein wichtiger Layer in einer Defense-in-Depth-Strategie. Die Netzwerkdefinition in Compose ist damit gleichzeitig eine explizite Dokumentation der erlaubten Kommunikationspfade.


# Verify network topology — which networks is a container connected to?
docker inspect phpfpm --format '{ { json .NetworkSettings.Networks } }' | jq .

# List all networks and their containers
docker network ls
docker network inspect backend --format '{ { range .Containers } }{ { .Name } } { { end } }'

# Test DNS resolution and connectivity between containers
docker exec phpfpm nslookup mysql
docker exec phpfpm curl -s http://nginx/health || true

# Check if internal network truly blocks outbound traffic
docker exec mysql curl -s --max-time 3 https://example.com || echo "Blocked — internal:true works"

# Diagnose network issues: inspect routing and iptables rules
docker exec phpfpm ip route
docker exec phpfpm cat /etc/resolv.conf   # Should show 127.0.0.11 as nameserver

7. Netzwerk-Aliases und mehrere Netzwerke pro Container

Ein Container kann in Docker-Netzwerken an mehreren Netzwerken gleichzeitig teilnehmen, jedes mit eigener IP-Adresse und eigenen Aliases. Das ermöglicht differenzierte Kommunikationsregeln: Ein API-Gateway-Container ist im öffentlichen Netzwerk unter api-gateway erreichbar, im Backend-Netzwerk unter dem Alias gateway-internal und im Monitoring-Netzwerk unter metrics-endpoint. Jedes Netzwerk hat seine eigene DNS-Auflösung, sodass ein Service unter unterschiedlichen Namen je nach Netzwerksicht erscheint.

Netzwerk-Aliases sind besonders nützlich bei Blue-Green-Deployments und bei der Migration von Diensten: Der neue Container bekommt denselben Alias wie der alte, sodass bestehende Verbindungen vom neuen Dienst bedient werden, ohne dass die Verbindungskonfiguration der abhängigen Services geändert werden muss. In Docker-Netzwerken mit mehreren Containern unter demselben Alias implementiert der eingebettete DNS automatisch DNS-Round-Robin – eine einfache Form von Load Balancing ohne zusätzliche Infrastruktur.

8. Overlay-Netzwerke für Multi-Host-Setups

Wenn Container auf verschiedenen physischen oder virtuellen Hosts miteinander kommunizieren sollen, stoßen Bridge-Docker-Netzwerke an ihre Grenzen: Sie funktionieren nur auf einem einzelnen Host. Overlay-Netzwerke erweitern das Konzept auf mehrere Hosts, indem sie VXLAN (Virtual Extensible LAN) verwenden, um Container-Netzwerkpakete über das physische Netzwerk zu tunneln. Für Docker Swarm und Docker-native Multi-Host-Setups ist der Overlay-Treiber der Standard.

Für kleinere Teams, die Docker-Netzwerke ohne Swarm nutzen, ist Overlay weniger relevant – Kubernetes oder Docker Swarm bringen eigene Netzwerkschichten mit. Wichtig zu verstehen ist jedoch das Grundprinzip: Overlay-Netzwerke ermöglichen denselben Service-Discovery-Mechanismus wie Bridge-Netzwerke, nur über Host-Grenzen hinweg. Ein Container auf Host A kann einen Container auf Host B per Service-Name ansprechen, sofern beide im selben Overlay-Netzwerk sind. Das ist die Basis dafür, dass horizontal skalierte Dienste in Swarm-Clustern wie eine einzelne Einheit erscheinen.

9. Netzwerktreiber im direkten Vergleich

Die Wahl des richtigen Netzwerktreibers hängt von Isolationsbedarf, Performance-Anforderungen und der Deployment-Topologie ab. Die folgende Tabelle fasst die wichtigsten Docker-Netzwerk-Treiber zusammen.

Treiber DNS / Service Discovery Isolation Typischer Einsatz
bridge (benutzerdefiniert) Ja, per Service-Name Hoch Standard für Compose-Stacks
bridge (Standard-docker0) Kein DNS Mittel Vermeiden – Legacy
host Host-DNS Keine Performance-kritische Dienste
none Kein Netzwerk Maximal Batch-Jobs ohne Netzwerkzugang
overlay Ja, Multi-Host Hoch Docker Swarm, Multi-Host

Für die meisten Docker-Netzwerk-Setups mit Docker Compose sind benutzerdefinierte Bridge-Netzwerke die richtige Wahl. Sie bieten DNS-basierte Service Discovery, klare Isolation und unkomplizierte Konfiguration. Host-Modus und none sind Spezialfälle, die nur dann verwendet werden sollten, wenn es einen konkreten Grund gibt. Overlay-Netzwerke kommen erst ins Spiel, wenn der Stack auf mehrere Hosts verteilt wird.

Mironsoft

Docker-Netzwerkarchitektur, Container-Infrastruktur und DevOps-Consulting

Docker-Netzwerke sicher und skalierbar gestalten?

Wir entwerfen die Netzwerktopologie für euren Container-Stack – mit klarer Segmentierung, Service Discovery ohne Port-Chaos und dokumentierter Kommunikationsarchitektur.

Netzwerk-Audit

Bestehende Docker-Netzwerktopologie analysieren und Sicherheitslücken identifizieren

Segmentierung

Frontend, Backend und Datenbankschicht in isolierte interne Netzwerke trennen

Multi-Stack-Setup

Cross-Stack-Kommunikation über externe Netzwerke und Reverse-Proxy-Integration

10. Zusammenfassung

Docker-Netzwerke sind die unsichtbare Schicht, die darüber entscheidet, welcher Container mit wem kommunizieren kann. Benutzerdefinierte Bridge-Netzwerke mit dem eingebetteten DNS-Server auf 127.0.0.11 ermöglichen Service Discovery per Name – ohne Port-Forwarding, ohne feste IP-Adressen. Das dreischichtige Modell aus Frontend-, Backend- und Datenbank-Netzwerk mit internal: true für die inneren Schichten schafft eine klare, dokumentierte Sicherheitsarchitektur.

Netzwerk-Aliases und mehrere Netzwerke pro Container ermöglichen flexible Kommunikationsregeln, bei denen ein Service aus verschiedenen Netzwerken unter verschiedenen Namen erreichbar ist. Für Multi-Host-Setups lösen Overlay-Netzwerke das Problem der Host-Grenzen. Das wichtigste Prinzip bei Docker-Netzwerken: So wenig Konnektivität wie möglich, so viel wie nötig – und immer benutzerdefinierte Bridge-Netzwerke statt des Legacy-Standard-Netzwerks.

Docker-Netzwerke — Das Wichtigste auf einen Blick

Eingebettetes DNS

Docker betreibt DNS auf 127.0.0.11 in benutzerdefinierten Netzwerken. Service-Namen aus Compose werden automatisch registriert – keine festen IPs nötig.

Netzwerksegmentierung

Frontend, Backend und DB in separate Netzwerke trennen. internal: true verhindert ausgehende Verbindungen für interne Netzwerke.

Port-Disziplin

Ports nur für Dienste öffnen, die vom Host erreichbar sein müssen. Interne Dienste wie MySQL und Redis brauchen keine Host-Ports.

Aliases & Multi-Netzwerk

Netzwerk-Aliases ermöglichen mehrere Namen pro Service. Container können in mehreren Netzwerken gleichzeitig sein – mit je eigener IP und DNS-Sicht.

11. FAQ: Docker-Netzwerke

1Bridge vs. Host-Netzwerk in Docker?
Bridge erstellt eine isolierte virtuelle Brücke. Host deaktiviert Isolation – der Container nutzt direkt den Host-Netzwerkstack ohne Port-Übersetzung.
2Warum Standard-docker0-Netzwerk meiden?
Kein eingebettetes DNS. Container nur per IP oder veraltetes --link erreichbar. Benutzerdefinierte Bridge-Netzwerke bieten DNS und bessere Isolation.
3Netzwerke eines Containers herausfinden?
docker inspect <container> --format '{ { json .NetworkSettings.Networks } }' listet alle Netzwerke mit IPs. docker network inspect <net> zeigt alle verbundenen Container.
4MySQL-Port auf dem Host öffnen?
Nicht notwendig wenn App und DB im selben Netzwerk sind. PHP-FPM erreicht MySQL per Service-Name. Host-Port nur für lokale DB-Tools wie TablePlus.
5Was macht internal: true?
Verhindert ausgehende Internetverbindungen aus diesem Netzwerk. Eingehende Docker-interne Verbindungen bleiben möglich. Für DB- und Cache-Netzwerke empfohlen.
6Zwei Compose-Stacks verbinden?
Stack A erstellt das Netzwerk. Stack B referenziert es mit external: true und dem exakten Netzwerknamen. Dann per Service-Name erreichbar.
7Wofür sind Netzwerk-Aliases?
Zusätzliche DNS-Namen pro Netzwerk. Nützlich für Blue-Green-Deployments oder wenn ein Dienst in verschiedenen Netzwerken unter unterschiedlichen Namen erscheinen soll.
8Welchen DNS-Server nutzt ein Container?
Docker konfiguriert automatisch 127.0.0.11 in /etc/resolv.conf. Dieser interne DNS löst Service-Namen auf und leitet externe Anfragen an den Host-DNS weiter.
9Wann Overlay-Netzwerke?
Wenn Container auf verschiedenen physischen Hosts kommunizieren müssen – typisch für Docker Swarm. Für Single-Host reichen Bridge-Netzwerke vollständig.
10Verbindungsprobleme zwischen Containern debuggen?
nslookup <service> im Container prüft DNS. curl http://<service>:<port> testet Konnektivität. cat /etc/resolv.conf zeigt DNS-Server. network inspect zeigt verbundene Container.