Docker Networking Grundlagen
Docker Networking: Container verbinden
Docker Networks ermöglichen Kommunikation zwischen Containern. Lernen Sie die verschiedenen Netzwerk-Typen und ihre Verwendung.
Netzwerk-Typen
| Typ | Beschreibung | Verwendung |
|---|---|---|
| bridge | Standard, isoliertes Netzwerk | Container auf einem Host |
| host | Teilt Host-Netzwerk | Maximale Performance |
| none | Kein Netzwerk | Isolierte Container |
| overlay | Multi-Host Netzwerk | Docker Swarm/Cluster |
| macvlan | Eigene MAC-Adresse | Legacy-Integration |
Bridge Network (Standard)
# Standard Bridge (docker0) docker run nginx # Container ist isoliert, nur via Port erreichbar # Eigenes Bridge Network erstellen docker network create myapp-network # Container im Network starten docker run -d --name web --network myapp-network nginx docker run -d --name api --network myapp-network node-api # Container können sich mit Namen ansprechen # Im "web" Container: curl http://api:3000 # DNS-Auflösung funktioniert!
Network-Befehle
# Networks auflisten docker network ls # Network erstellen docker network create mynetwork docker network create --driver bridge --subnet 172.20.0.0/16 mynetwork # Network Details docker network inspect mynetwork # Container mit Network verbinden docker network connect mynetwork container_name # Container von Network trennen docker network disconnect mynetwork container_name # Network löschen docker network rm mynetwork # Ungenutzte Networks aufräumen docker network prune
Port-Mapping
# Host-Port:Container-Port docker run -p 8080:80 nginx # localhost:8080 → Container:80 # Nur localhost (nicht extern erreichbar) docker run -p 127.0.0.1:8080:80 nginx # Zufälliger Host-Port docker run -p 80 nginx docker port container_name # Zeigt zugewiesenen Port # Mehrere Ports docker run -p 80:80 -p 443:443 nginx # UDP docker run -p 53:53/udp dns-server
Docker Compose Networking
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx
networks:
- frontend
ports:
- "80:80"
api:
image: node:20
networks:
- frontend
- backend
# Erreichbar als "api" von web und db
db:
image: postgres
networks:
- backend
# Nur von api erreichbar, nicht von web
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # Kein Internetzugang
Service Discovery
# Docker's eingebautes DNS
# Container-Name als Hostname
docker run --name mydb postgres
docker run --link mydb:db app # Veraltet!
# Besser: Eigenes Network
docker network create app-net
docker run -d --name db --network app-net postgres
docker run -d --name app --network app-net myapp
# Im "app" Container:
# db ist auflösbar: ping db
# Environment variabel für Verbindung:
# DATABASE_HOST=db
# docker-compose: Service-Namen sind automatisch DNS-Namen
services:
db:
image: postgres
app:
image: myapp
environment:
- DATABASE_HOST=db # Funktioniert automatisch!
Host Network
# Container nutzt Host-Netzwerk direkt docker run --network host nginx # Vorteile: # - Keine NAT-Overhead # - Maximale Performance # Nachteile: # - Keine Port-Isolation # - Port-Konflikte möglich # - Funktioniert nicht auf Mac/Windows (nur Linux)
Overlay Network (Swarm)
# Für Multi-Host Kommunikation docker swarm init # Overlay Network erstellen docker network create --driver overlay --attachable myoverlay # Service im Overlay docker service create --name web --network myoverlay nginx # Auch für Standalone Container (--attachable) docker run --network myoverlay myapp
Network Debugging
# Container IP anzeigen
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
# Netzwerk-Verbindungen im Container
docker exec container_name netstat -tulpn
# DNS testen
docker exec container_name nslookup other_container
# Connectivity testen
docker exec container_name ping other_container
docker exec container_name curl http://other_container:port
# Network Traffic analysieren
docker run --net=container:target_container nicolaka/netshoot tcpdump
Sicherheit
# Isolierte Backend-Netzwerke
networks:
public:
driver: bridge
private:
driver: bridge
internal: true # Kein Internet!
# Nur notwendige Ports exponieren
services:
db:
networks:
- private
# Keine ports: → nicht von außen erreichbar
api:
networks:
- public
- private
ports:
- "3000:3000" # Nur API exponiert
💡 Tipp:
Nutzen Sie interne Netzwerke für Datenbanken und andere Services die nicht extern erreichbar sein müssen. Das erhöht die Sicherheit.