Docker Compose Leitfaden: Verwaltung von Multi-Container-Anwendungen
Multi-Container-Anwendungen mit Docker Compose definieren: Service-Abhängigkeiten, Umgebungsvariablen, Health Checks, Skalierung und Production-Deployment.
Traefik-Installation: Service-Erkennung mit dem Docker-Provider, Let's Encrypt SSL, Middleware, Dashboard, Kubernetes Ingress und Load Balancing.
Traefik ist ein moderner Edge Router und Reverse Proxy, der für Microservice-Architekturen entwickelt wurde. Dank seiner tiefen Integration mit Docker und Kubernetes erkennt und leitet er Services automatisch weiter.
Hauptmerkmale von Traefik:
Traefik v3 bietet bessere Performance und neue Funktionen im Vergleich zu v2. Dieser Leitfaden konzentriert sich auf Traefik v3.
# docker-compose.yml
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "8080:8080" # Dashboard (in Production schließen)
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- ./config:/etc/traefik/config:ro
- traefik_certs:/certs
networks:
- traefik-net
labels:
- "traefik.enable=true"
# Dashboard
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$hash"
- "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
volumes:
traefik_certs:
networks:
traefik-net:
external: true
# traefik.yml
global:
checkNewVersion: true
sendAnonymousUsage: false
api:
dashboard: true
insecure: false # false in Production
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
http:
tls:
certResolver: letsencrypt
http3:
advertisedPort: 443
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /certs/acme.json
httpChallenge:
entryPoint: web
# DNS-Challenge (für Wildcard)
# dnsChallenge:
# provider: cloudflare
# resolvers:
# - "1.1.1.1:53"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: traefik-net
file:
directory: /etc/traefik/config
watch: true
log:
level: INFO
filePath: /var/log/traefik/traefik.log
accessLog:
filePath: /var/log/traefik/access.log
bufferingSize: 100
Registrieren Sie Services automatisch bei Traefik mit Docker-Labels:
# Beispielanwendung
services:
webapp:
image: nginx:alpine
networks:
- traefik-net
labels:
# Traefik aktivieren
- "traefik.enable=true"
# HTTP-Router
- "traefik.http.routers.webapp.rule=Host(`app.example.com`)"
- "traefik.http.routers.webapp.entrypoints=websecure"
- "traefik.http.routers.webapp.tls.certresolver=letsencrypt"
# Service-Port
- "traefik.http.services.webapp.loadbalancer.server.port=80"
# Middleware anwenden
- "traefik.http.routers.webapp.middlewares=security-headers,rate-limit"
networks:
traefik-net:
external: true
services:
api:
image: myapi:latest
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.example.com`)"
- "traefik.http.routers.api.entrypoints=websecure"
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
- "traefik.http.services.api.loadbalancer.server.port=3000"
# Health Check
- "traefik.http.services.api.loadbalancer.healthcheck.path=/health"
- "traefik.http.services.api.loadbalancer.healthcheck.interval=30s"
frontend:
image: myfrontend:latest
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`example.com`) || Host(`www.example.com`)"
- "traefik.http.routers.frontend.entrypoints=websecure"
- "traefik.http.routers.frontend.tls.certresolver=letsencrypt"
- "traefik.http.services.frontend.loadbalancer.server.port=80"
networks:
traefik-net:
external: true
# config/middlewares.yml
http:
middlewares:
# Sicherheits-Header
security-headers:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
stsPreload: true
forceSTSHeader: true
contentTypeNosniff: true
frameDeny: true
referrerPolicy: "strict-origin-when-cross-origin"
customResponseHeaders:
X-Powered-By: ""
Server: ""
# Rate Limiting
rate-limit:
rateLimit:
average: 100
burst: 50
period: 1m
sourceCriterion:
ipStrategy:
depth: 1
# Basic Auth
basic-auth:
basicAuth:
users:
- "admin:$apr1$xyz$hashedpassword"
removeHeader: true
# IP-Allowlist
ip-whitelist:
ipAllowList:
sourceRange:
- "192.168.1.0/24"
- "10.0.0.0/8"
# www zu non-www umleiten
www-redirect:
redirectRegex:
regex: "^https://www\\.(.*)"
replacement: "https://${1}"
permanent: true
# Sichere Dashboard-Konfiguration
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
- "traefik.http.routers.traefik-dashboard.service=api@internal"
- "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
- "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik-dashboard.middlewares=dashboard-auth"
- "traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$apr1$$xyz$$hash"
Basic-Auth-Passwort generieren:
# Passwort mit htpasswd generieren
echo $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g
# Oder mit openssl
echo "admin:$(openssl passwd -apr1 'IhrPasswort')" | sed -e 's/\$/\$\$/g'
# Traefik Helm-Repository hinzufügen
helm repo add traefik https://traefik.github.io/charts
helm repo update
# Traefik installieren
helm install traefik traefik/traefik \
--namespace traefik \
--create-namespace \
--set deployment.replicas=2 \
--set ports.web.redirectTo.port=websecure \
--set ingressRoute.dashboard.enabled=true
# ingressroute.yml
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: webapp-ingress
namespace: default
spec:
entryPoints:
- websecure
routes:
- match: Host(`app.example.com`)
kind: Rule
services:
- name: webapp-service
port: 80
middlewares:
- name: security-headers
tls:
certResolver: letsencrypt
# middleware.yml
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: security-headers
namespace: default
spec:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
contentTypeNosniff: true
frameDeny: true
# traefik.yml - TCP-Entrypoint
entryPoints:
mysql:
address: ":3306"
redis:
address: ":6379"
# config/tcp.yml
tcp:
routers:
mysql-router:
entryPoints:
- mysql
rule: "HostSNI(`*`)"
service: mysql-service
services:
mysql-service:
loadBalancer:
servers:
- address: "mysql:3306"
# Load Balancing mit mehreren Instanzen
services:
api:
image: myapi:latest
deploy:
replicas: 3
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.example.com`)"
- "traefik.http.services.api.loadbalancer.server.port=3000"
# Sticky Sessions
- "traefik.http.services.api.loadbalancer.sticky.cookie=true"
- "traefik.http.services.api.loadbalancer.sticky.cookie.name=traefik_session"
- "traefik.http.services.api.loadbalancer.sticky.cookie.secure=true"
# Health Check
- "traefik.http.services.api.loadbalancer.healthcheck.path=/health"
- "traefik.http.services.api.loadbalancer.healthcheck.interval=10s"
- "traefik.http.services.api.loadbalancer.healthcheck.timeout=3s"
Traefik ist eine leistungsstarke Reverse-Proxy- und Load-Balancer-Lösung für moderne Microservice-Infrastrukturen. Mit seiner tiefen Integration in Docker und Kubernetes, automatischem SSL-Management und einem reichen Middleware-Ökosystem ist es eine zuverlässige Wahl für Produktionsumgebungen. Dank der Label-basierten Konfiguration kann jeder Service seine eigenen Routing-Regeln definieren.
Traefik hat eine tiefe Integration mit Docker/Kubernetes und erkennt Services automatisch. Nginx erfordert statische Konfiguration und benötigt bei jeder Änderung einen Reload. Traefik unterstützt dynamische Konfiguration und aktualisiert sich ohne Downtime. Nginx ist ausgereifter und kann bei sehr hohem Traffic besser performen. Traefik wird für Microservice-Umgebungen bevorzugt, Nginx für traditionelle Webserver.
Öffnen Sie das Dashboard niemals im unsicheren Modus (Port 8080) in der Production. Schützen Sie das Dashboard mit HTTPS und Basic Auth durch Labels am Traefik-Container. Beschränken Sie den Zugriff auf bestimmte IPs mit der IP-Whitelist-Middleware. Alternativ können Sie das Dashboard vollständig deaktivieren und Prometheus/Grafana zur Überwachung verwenden.
Setzen Sie den dnsChallenge-Provider unter certificatesResolvers in traefik.yml. Für Cloudflare sind 'provider: cloudflare' und die Umgebungsvariable 'CF_DNS_API_TOKEN' erforderlich. Definieren Sie die relevanten API-Schlüssel als Umgebungsvariablen für andere DNS-Provider. DNS-Challenge ist sicherer als HTTP-Challenge und ermöglicht die Ausstellung von Wildcard-Zertifikaten.
Ja, Middlewares werden in der Reihenfolge angewendet, in der sie definiert sind. Die allgemein empfohlene Reihenfolge ist: IP-Whitelist → Rate Limit → Auth → Headers. Falsche Reihenfolge kann zu unerwartetem Verhalten führen. Wenn Sie beispielsweise die Auth-Middleware vor dem Rate Limiting platzieren, werden auch nicht authentifizierte Anfragen in das Rate Limit einbezogen.
Verwenden Sie Rolling Updates in Docker Swarm oder Kubernetes. Traefik leitet Traffic automatisch weiter, wenn neue Container bereit sind. Die Health-Check-Konfiguration ist entscheidend: An ungesunde Container wird kein Traffic gesendet. Definieren Sie den Health-Check-Endpunkt mit dem Label 'traefik.http.services.myapp.loadbalancer.healthcheck.path=/health'.
Traefik erhält für jede Domain separate Zertifikate. Verwenden Sie für mehrere Domains 'Host(`a.com`) || Host(`b.com`)' in der Router-Regel. Separate Zertifikate werden automatisch für jede Domain ausgestellt. DNS-Challenge ist für Wildcard-Zertifikate erforderlich. Für SAN-Zertifikate kann manuelle Konfiguration oder die Verwendung externer Zertifikate erforderlich sein.
Multi-Container-Anwendungen mit Docker Compose definieren: Service-Abhängigkeiten, Umgebungsvariablen, Health Checks, Skalierung und Production-Deployment.
CI/CD-Pipelines mit GitHub Actions erstellen: Docker Build und Push, SSH-Server-Deployment, Test-Automatisierung, Secrets-Verwaltung und Workflow-Optimierung.
Ansible Schritt für Schritt: Installation, Inventory, Playbooks, Rollen, Variablen, verschlüsselter Vault, Ad-hoc-Befehle und Serverautomatisierung.