Traefik Reverse Proxy für Docker-Services: praxisnahe Produktionskonfiguration
Wenn mehrere Docker-Services auf einem Host laufen, wird Port-Management schnell unübersichtlich. Traefik löst das Problem als dynamischer Reverse Proxy: Services werden per Labels erkannt und Anfragen automatisch geroutet.
Diese Anleitung zeigt eine produktionsnahe Basis mit automatischem TLS, sauberem Routing und einem sicheren Dashboard-Konzept.
Architekturüberblick
Ein typisches Setup enthält:
- Einen externen Einstiegspunkt auf Port 80/443
- Ein internes Docker-Netzwerk für Traefik und Apps
- Service-spezifische Labels für Hostnamen, Middleware und Zielport
- Einen ACME-Resolver für automatisches HTTPS
Traefik überwacht Docker-Events und aktualisiert Routen ohne manuelle Reloads. Das reduziert Betriebsaufwand deutlich.
1) Gemeinsames Netzwerk erstellen
docker network create edge
Nutze dieses Netzwerk für Traefik und alle veröffentlichten Anwendungscontainer.
2) Traefik mit Docker Compose deployen
Beispiel docker-compose.yml:
services:
traefik:
image: traefik:v3.1
container_name: traefik
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.letsencrypt.acme.email=admin@example.com
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.letsencrypt.acme.httpchallenge=true
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
- --api.dashboard=true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- edge
networks:
edge:
external: true
ACME-Datei mit restriktiven Rechten erstellen:
mkdir -p letsencrypt
touch letsencrypt/acme.json
chmod 600 letsencrypt/acme.json
3) App per Labels routen
Beispiel-Service:
services:
app:
image: ghcr.io/example/myapp:latest
restart: unless-stopped
networks:
- edge
labels:
- traefik.enable=true
- traefik.http.routers.myapp.rule=Host(`app.example.com`)
- traefik.http.routers.myapp.entrypoints=websecure
- traefik.http.routers.myapp.tls.certresolver=letsencrypt
- traefik.http.services.myapp.loadbalancer.server.port=8080
Der DNS-Eintrag app.example.com muss auf die öffentliche Server-IP zeigen.
4) Betriebsendpunkte absichern
Dashboard niemals ohne Auth veröffentlichen. Bei Bedarf schützen:
labels:
- traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$...
- traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
- traefik.http.routers.traefik.service=api@internal
- traefik.http.routers.traefik.entrypoints=websecure
- traefik.http.routers.traefik.tls.certresolver=letsencrypt
- traefik.http.routers.traefik.middlewares=admin-auth
5) Härtung für Produktion
exposedByDefault=falseaktiv halten- Docker-Socket nur lesbar binden
- Firewall auf notwendige Ports beschränken
- Rate-Limits für öffentliche Endpunkte setzen
- Security-Header über Middleware aktivieren
Beispiel für sichere Header:
- traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000
- traefik.http.middlewares.secure-headers.headers.browserXssFilter=true
- traefik.http.middlewares.secure-headers.headers.contentTypeNosniff=true
Binde die Middleware an alle relevanten Router.
Prüf-Checkliste
docker ps
docker logs traefik --tail=100
curl -I https://app.example.com
Erwartetes Ergebnis:
- Gültiges Zertifikat ausgestellt
HTTP/2 200(oder erwarteter App-Status)- Keine Zertifikatsfehler im Browser
Fazit
Traefik ist eine starke Wahl für Docker-zentrierte Umgebungen mit häufigen Änderungen. Labelbasiertes Routing plus automatisches TLS sorgen für weniger manuelle Proxy-Pflege und stabileren Betrieb.
Die größten Zuverlässigkeitsgewinne kommen durch Netzsegmentierung, geschütztes Dashboard und klare Middleware-Policies pro Anwendung.