Docker & Traefik

Traefik im Docker-Swarm sauber betreiben

Traefik ist in vielen Docker-Setups der zentrale Einstiegspunkt für Webdienste. Im Swarm entscheidet die Kombination aus Labels, Overlay-Netzwerken, Service-Port, TLS, Middlewares und Placement darüber, ob eine Seite sauber erreichbar ist — oder ob man bei 403, 404 oder 502 landet.

Grundsatz

Ein Traefik-Router ist nur so gut wie sein Netzwerk.

kritisch

In Docker Swarm reicht es nicht, nur Labels zu setzen. Traefik muss den Zielservice auch im richtigen Overlay-Netz erreichen können. Wenn Router und Labels korrekt aussehen, aber der Service nicht im erwarteten Netzwerk hängt, entstehen typische Fehler wie 404, 502 oder scheinbar zufälliges Routing.

Router Host-Rule

Host(`example.tld`) entscheidet, welcher Request zum Service gehört.

Service Backend-Port

loadbalancer.server.port muss zum internen Container-Port passen.

Network Overlay

Traefik und App-Service müssen im selben Swarm-Netzwerk hängen.

Middleware Security

Header, CrowdSec, Auth und Redirects können Requests verändern oder blockieren.

Minimaler Label-Satz

Ein sauberer Swarm-Service braucht klare Traefik-Labels.

Die Labels liegen bei Docker Swarm auf dem Service, nicht nur auf einem einzelnen Container. Der Router-Name, die Host-Regel, der EntryPoint, TLS, der Service-Port und das Swarm-Netzwerk müssen zusammenpassen.

Beispiel

Traefik-Labels für einen Website-Service.

Docker Swarm Labels

Grundkonfiguration

traefik.enable=true
traefik.http.routers.website.rule=Host(`example.tld`) || Host(`www.example.tld`)
traefik.http.routers.website.entrypoints=websecure
traefik.http.routers.website.tls=true
traefik.http.routers.website.tls.certresolver=le
traefik.http.routers.website.service=website
traefik.http.services.website.loadbalancer.server.port=80
traefik.swarm.network=proxy-swarm

Wichtig: traefik.swarm.network ist kein Ersatz dafür, den Service wirklich mit diesem Netzwerk zu verbinden. Es sagt Traefik nur, welches Netzwerk genutzt werden soll.

Netzwerk prüfen

Ist der Service wirklich im Proxy-Netz?

Einer der häufigsten Fehler: Das Label zeigt auf proxy-swarm, aber der Service hängt gar nicht in diesem Netzwerk. Dann kann Traefik zwar den Router kennen, erreicht aber das Backend nicht sauber.

Debug

Service-Netzwerke anzeigen

docker service inspect SERVICE --format '{{json .Spec.TaskTemplate.Networks}}' | jq
docker network inspect proxy-swarm --format '{{.ID}} {{.Name}} {{.Driver}} {{.Scope}}'

Fix

Service an Overlay-Netz hängen

docker service update --network-add proxy-swarm SERVICE
docker service update --force SERVICE

Traefik API

Router und Services sichtbar machen.

Die Traefik-API ist beim Debugging extrem wertvoll. Sie zeigt, ob Router, Services und Middlewares überhaupt geladen wurden. Wenn ein Router dort nicht auftaucht, matcht Traefik den Host nicht.

Router

Router prüfen

curl -s http://127.0.0.1:8082/api/http/routers | jq '.[] | select(.name | contains("website"))'

Services

Services prüfen

curl -s http://127.0.0.1:8082/api/http/services | jq '.[] | select(.name | contains("website"))'

Fehlerbilder

403, 404 und 502 richtig einordnen.

HTTP-Statuscodes sind beim Traefik-Debugging Hinweise. Wichtig ist, ob die Antwort von Traefik, von einer Middleware oder vom Backend kommt.

404

Router matcht nicht

Häufige Ursachen: falscher Hostname, falsche Router-Rule, Labels nicht geladen, Service nicht von Traefik erkannt oder falscher EntryPoint.

403

Middleware blockt

Security-Middleware, CrowdSec-Bouncer, Auth oder IP-Regeln können Requests blockieren, obwohl der Router grundsätzlich korrekt ist.

502

Backend nicht erreichbar

Traefik findet den Router, kann aber das Backend nicht erreichen. Typisch bei falschem Netzwerk oder falschem internen Service-Port.

TLS

Zertifikat fehlt

DNS, ACME, Certresolver, EntryPoint oder SNI müssen stimmen. Sonst liefert Traefik nicht das erwartete Zertifikat.

WWW

Root und www getrennt

digital-world.dev und www.digital-world.dev sind unterschiedliche Hosts. Beide müssen in DNS und Router-Rule berücksichtigt werden.

Swarm

Replica hat alten Stand

Bei mehreren Replicas auf mehreren Nodes müssen statische Dateien oder Volumes auf allen Nodes identisch sein.

Praxisfall

Wenn die Website lokal läuft, aber extern 404 liefert.

Debugging

Ein häufiger Denkfehler: Man testet den Nginx-Container direkt und bekommt 200 OK, aber extern liefert die Domain 404. Dann ist der Webserver nicht das Problem. Der Fehler liegt in Traefik: Host-Rule, Router, Middleware oder Netzwerk.

Container 200 OK

wget http://127.0.0.1/ im Nginx-Container funktioniert.

Extern 404

Traefik matcht den Router nicht oder lädt die Labels nicht richtig.

Prüfung API

Router und Services in der Traefik-API kontrollieren.

Fix Labels/Netz

Host-Rule, Overlay-Netzwerk und Backend-Port korrigieren.

Host-Header

127.0.0.1 ist kein echter Domain-Test.

Wenn du lokal gegen Traefik testest, brauchst du den passenden Host-Header oder --resolve. Sonst weiß Traefik nicht, welcher Router gemeint ist.

HTTP-Test

Mit Host-Header testen

curl -I -H "Host: digital-world.dev" http://127.0.0.1/

HTTPS-Test

Mit SNI testen

curl -kI --resolve digital-world.dev:443:127.0.0.1 https://digital-world.dev/

Container-Test

Backend isoliert prüfen.

Um Traefik auszuschließen, testest du direkt im Backend-Container. Wenn dort 200 OK kommt, ist der Backend-Webserver sauber.

Nginx

Direkt im Container testen

docker exec CONTAINER sh -c 'wget -S -O /dev/null http://127.0.0.1/'

Dateien

Webroot prüfen

docker exec CONTAINER ls -la /usr/share/nginx/html
docker inspect CONTAINER --format '{{json .Mounts}}' | jq

Swarm & Datenstand

Mehrere Replicas brauchen identische Inhalte.

Wenn ein statischer Webroot per Bind-Mount auf jedem Node liegt, muss der Datenstand auf allen Nodes identisch sein. Sonst liefert Traefik je nach Ziel-Replica unterschiedliche Ergebnisse.

02

Ansible Sync

  • Webroot vom Quellnode holen
  • Auf Website-Nodes verteilen
  • Dateien prüfen
  • Swarm-Service neu ausrollen
03

3 Replicas erst später

  • Alle Nodes synchron
  • Gleiche Mount-Pfade
  • Gleiches Proxy-Netz
  • Cluster-Test ohne 404

Debug-Runbook

Kurze Reihenfolge bei Traefik-Problemen.

Diese Reihenfolge spart Zeit, weil sie Backend, Traefik, Netzwerk und Middleware getrennt prüft.

1

Backend testen

docker exec CONTAINER wget -q --spider http://127.0.0.1/

2

Labels prüfen

docker service inspect SERVICE --pretty

3

Netzwerke prüfen

docker service inspect SERVICE --format '{{json .Spec.TaskTemplate.Networks}}'

4

Traefik API prüfen

curl -s http://127.0.0.1:8082/api/http/routers | jq

5

Middleware reduzieren

CrowdSec/Auth temporär entfernen und Route isoliert testen.

6

Extern testen

curl -I https://digital-world.dev/

Fazit

Traefik-Probleme sind fast immer systematisch lösbar.

Wenn du Backend, Router, Service, Netzwerk und Middleware getrennt prüfst, wird aus „die Seite geht nicht“ ein nachvollziehbarer Betriebsfehler mit klarer Ursache.