Mit Docker lassen sich sehr leicht neue Container auf einem Host erstellen. Sollen aber mehrere Container über dem Port 80 (HTTP) nach außen kommunizieren, so kann es etwas problematisch werden, da dieser Port nur einmal auf dem Server zur Verfügung steht.
Hier kann ein Reverse Proxy Abhilfe schaffen. Ein bekanntes Spiel ist Traefik.
Ich habe diese Anleitung erstellt, da die meisten Anleitungen im Netz leider nicht mehr funktionieren (Traefik v1) und es kaum aktuelle Anleitungen gibt.
Diese Anleitung ist nicht mehr aktuell. Bitte nutzt diese Anleitung zur Installation von Traefik:
Update
| 26.07.2022 | Docker Compose angepasst, kleine Fehler behoben. |
| 26.09.2021 | Docker Compose Version aktualisiert, TLS Sicherheit in den Artikel eingebaut. |
| 30.04.2021 | Docker Compose Version aktualisiert. |
| 23.01.2021 | WordPress Beispiel entfernt. |
| 30.12.2020 | Kapitel neu sortiert und Anleitung getestet. |
| 07.05.2020 | Kapitel zur Docker Installation hinzugefügt. |
| 27.03.2020 | Erstellung dieser Anleitung. |
Meine Anleitung bezieht sich auf die aktuelle Traefik Version 2. Dies ist wichtig, da die Konfigurationen bei Version 1 anders sind.
0. Was ist das Ziel dieser Anleitung?
- Traefik v2 installieren
- TLS aktivieren
- Automatisch gültige Zertifikate von Let´s encrypt zu beziehen
- Wissen, wie ihr neue Anwendungen zu Traefik hinzufügt.
1. Installation von Docker und Docker Compose
Nun installieren wir zuerst Docker & Docker Compose. Diese beiden Programme bilden die Grundlage.
1.1 Docker installieren
Zur Installation von Docker habe ich hier eine Anleitung geschrieben.
2. htpasswd installieren
Wir installieren nun noch das Tool htpasswd. Dieses benötigen wir um uns ein Passwort für Traefik zu generieren.
apt-get update
apt-get install apache2-utilsCode-Sprache: JavaScript (javascript)
3. Traefik installieren und konfigurieren
3.1 Verzeichnisse / Dateien anlegen
Als erstes legen wir uns ein Verzeichnis für Traefik an. Ich wähle dazu folgendes:
mkdir -p /opt/containers/traefik
Anschließend erzeugen wir uns noch ein paar Datein / Ordner, welche wir später noch benötigen.
mkdir -p /opt/containers/traefik/data
touch /opt/containers/traefik/data/acme.json
chmod 600 /opt/containers/traefik/data/acme.json
touch /opt/containers/traefik/data/traefik.yml
3.2 traefik.yml anpassen
Nun bearbeiten wir die Datei “traefik.yml”. Dabei ist wichtig, dass ihr nur Leerzeichen und keine Tabs benutzen dürft.
nano /opt/containers/traefik/data/traefik.yml
Inhalt:
api:
dashboard: true
entryPoints:
http:
address: ":80"
https:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
filename: "./dynamic_conf.yml"
certificatesResolvers:
http:
acme:
email: email@example.com #### hier eure E-Mail angeben ####
storage: acme.json
httpChallenge:
entryPoint: httpCode-Sprache: PHP (php)
Notwendige Anpassungen:
- E-Mail Adresse anpassen. Ohne Anführungszeichen oder sonstiges.
3.3 docker-compose.yml anpassen
Nun legen wir unsere Docker Compose Datei an.
nano /opt/containers/traefik/docker-compose.yml
Inhalt:
version: '3'
services:
traefik:
image: traefik:latest
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- proxy
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
- ./data/dynamic_conf.yml:/dynamic_conf.yml
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=http"
- "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=USER:PASSWORD"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.traefik-secure.tls=true"
- "traefik.http.routers.traefik-secure.tls.certresolver=http"
- "traefik.http.routers.traefik-secure.service=api@internal"
- "providers.file.filename=/dynamic_conf.yml"
- "traefik.http.routers.traefik-secure.middlewares=secHeaders@file,traefik-auth"
networks:
proxy:
external: trueCode-Sprache: PHP (php)
Notwendige Anpassungen:
- Hostnamen anpassen: Hier müsst ihr noch die Zeilen mit eurem Hostnamen (traefik.example.com) anpassen.
- Benutzer / Passwort festlegen: Ihr müsst noch euer Passwort / Benutzer festlegen. Hier in diesem Beispiel werden folgende Daten festgelegt.
3.4 Benutzer erzeugen
Nun legen wir uns einen neuen Benutzer sowie Passwort an. Dazu müsst ihr nachfolgenden Code anpassen:
echo $(htpasswd -nb <user> <password>) | sed -e s/\\$/\\$\\$/g
Zum Beispiel:
echo $(htpasswd -nb christian supersicher) | sed -e s/\\$/\\$\\$/g
Ausgabe: christian:$$apr1$$uNheRNLT$$apG7iqwsukzfV0ob6qJFs0Code-Sprache: PHP (php)
Der Befehl wird hier beim Hersteller erklärt. Diese Zeichenkette kopiert ihr nun in eure Konfiguration:
vorher:
"traefik.http.middlewares.traefik-auth.basicauth.users=USER:PASSWORD"
nachher:
"traefik.http.middlewares.traefik-auth.basicauth.users=christian:$$apr1$$uNheRNLT$$apG7iqwsukzfV0ob6qJFs0"
Code-Sprache: JavaScript (javascript)
3.5 Dynamic_conf.yml anlegen
Hier legen wir nun noch eine neue Datei an. Dazu gebt ihr folgenden Code ein:
nano /opt/containers/traefik/data/dynamic_conf.yml
Kopiert nun folgenden Code in die Datei:
tls:
options:
default:
minVersion: VersionTLS12
cipherSuites:
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
curvePreferences:
- CurveP521
- CurveP384
sniStrict: true
http:
middlewares:
secHeaders:
headers:
browserXssFilter: true
contentTypeNosniff: true
frameDeny: true
sslRedirect: true
#HSTS Configuration
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 31536000
customFrameOptionsValue: "SAMEORIGIN"
Code-Sprache: PHP (php)
3.6 Docker Netzwerk anlegen
Als nächstes müssen wir noch ein internes Netzwerk anlegen, über welches später unsere Docker Container mit Traefik kommunizieren sollen. Dies haben wir in unserer Compose Datei “proxy” genannt.
docker network create proxy
4. Traefik starten
Nun können wir Traefik starten.
docker compose -f /opt/containers/traefik/docker-compose.yml up -d
Wenn ihr nun auf traefik.euredomain.de geht, solltet ihr folgendes sehen:

Nach dem Login mit eurem oben festgelegten Passwort solltet ihr diese Übersicht sehen.

Hier sind wir jetzt fertig mit der Traefik Konfiguration und Installation.
5. Wie kann ich Anwendungen im Allgemeinen zu Traefik hinzufügen?
Im Allgemeinen ist es wichtig, dass ihr die Labels hinzufügt.
wp:
labels:
- "traefik.enable=true"
- "traefik.http.routers.wp.entrypoints=http"
- "traefik.http.routers.wp.rule=Host(`wordpress.euredomain.de`)"
- "traefik.http.middlewares.wp-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.wp.middlewares=wp-https-redirect"
- "traefik.http.routers.wp-secure.entrypoints=https"
- "traefik.http.routers.wp-secure.rule=Host(`wordpress.euredomain.de`)"
- "traefik.http.routers.wp-secure.tls=true"
- "traefik.http.routers.wp-secure.tls.certresolver=http"
- "traefik.http.routers.wp-secure.service=wp"
- "traefik.http.services.wp.loadbalancer.server.port=80"
- "traefik.docker.network=proxy"Code-Sprache: JavaScript (javascript)
Wichtig ist hier auch, dass unser Service “wp” heißt und dementsprechend die Labels auch alle auf den Namen “wp” angepasst werden müssen. Dies kann aber auch jeder andere Name sein. Muss nur konstant sein.
Ihr müsst immer noch das Netzwerk hinzufügen, mit dem Traefik kommuniziert. Dieses Netzwerk ist im einfachsten Fall bei jeder Anwendung identisch. In diesem Fall also “proxy”.
wp:
networks:
- proxy
networks:
proxy:
external: trueCode-Sprache: JavaScript (javascript)
Der Name “proxy” wurde hier auch frei gewählt. Dort könnt ihr auch jeden anderen Namen verwenden. Wichtig hierbei ist jedoch, dass das Netzwerk unter Docker angelegt ist:
docker network create NamedesNetzwerks
6. Quellen
https://medium.com/@containeroo/traefik-2-0-docker-a-simple-step-by-step-guide-e0be0c17cfa5
https://hub.docker.com/_/traefik

Hallo,
danke für die Anleitung, ich bin super damit durchgekommen.
Ich möchte jetzt aber noch eine Reverseproxy für eine Webseite einrichten, die nicht auf dem Docker liegt.
Also sogar von IPV4 nach IPV6.
domainIPV4.com –> domainIPV6.com
Wobei domainIPV4.com auf dem Docker traefik liegen soll und domainIPV6.com liegt extern auf einem anderen Webserver.
Kann ich das einfach hier hinzufügen?
Docker und traefik sind für mich absolutes Neuland ….
Moin,
Vielen Dank für die Anleitung!
Habe eine kleine Frage
wie bindet man zwei Server, also den socket an traefik damit er die docker Container vom anderen Server übernimmt ?
Hallo Christian,
zunächst vielen Dank für Deine gute Anleitung.
Ich habe TRAEFIK damit auf Anhieb zum Laufen bekommen (hinter einer FritzBox mit eigener Domäne ‘Traefik.mydomain.de’). Nun möchte ich TRAEFIK zusätzlich nutzen, um weitere Server (z. B. “http://192.168.1.22:8080”) von “außen” über weitere Subdomains (z. B. ‘service1.mydomain.de’) in meiner lokalen Umgebung zu erreichen. Das SSL-Zertifikat soll dabei jeweils von TRAEFIK gemanaged werden.
Meine Versuche, Services in einer dynamischen Konfigurationsdatei anzulegen scheitern dabei jeweils und führen üblicherweise dazu, dass auch das Dashboard nicht mehr erreichbar ist. Hast Du da einen Tipp für mich oder eine Idee, wo ich nachlesen kann.
Vielen Dank und viele Grüße
Jens
Hey hier wäre ein update zu Docker-Compose 1.29.2 möglich 🙂
Vill. passt du, dass noch in der Anleitung an.
Ansonsten Top Anleitung wie immer 🙂
Hallo Christian,
besten Dank für deine wirklich guten Anleitungen! Mit deren Hilfe hab ich einen Server mit Docker/Docker Compose und Traefik als reverse-proxy auf Anhieb zum laufen gebracht. Die Kirsche auf der Torte wäre jetzt noch eine jupyterhub-Installation (https://jupyter.org/hub). Damit könnte ich vielen lernwütigen Menschen jupyter-Notebooks zur Verfügung stellen, ohne dass die was installieren müssten. Leider sind Anleitungen in dem Gebiet nicht häufig. Hast du da einen Tipp für mich der unter der von dir vorgeschlagenen Konfiguration läuft?
Vielen Dank,
Markus
Hallo Christian, tolles Tutorial, hat auch fast alles geklappt. Traefik ( -Webkonsole) ist extern erreichbar, und zeigt keine Fehler. Also Home Assistant einbinden. Ich habe die Anleitung aus Deinem obigen Beispiel benutzt.
Die einigen Änderungen, die ich vorgenommen habe, sind meine Domain- Namen und bei mir heißt das Netz nicht “proxy” sondern “traefik”, und der Serverport ist 8123.
Der docker-compose.yaml Abschnitt sieht so aus:
…
homeassistant:
container_name: homeassistant
image: homeassistant/home-assistant:stable
volumes:
– “homeassistant:/config”
– “/etc/localtime:/etc/localtime:ro”
network_mode: host
devices:
– “/dev/ttyACM0:/dev/ttyACM0”
restart: unless-stopped
labels:
– “traefik.enable=true”
– “traefik.http.routers.homeassistant.entrypoints=http”
– “traefik.http.routers.homeassistant.rule=Host(`homeassistant.xxx.xxx.xxx`)”
– “traefik.http.middlewares.homeassistant-https-redirect.redirectscheme.scheme=https”
– “traefik.http.routers.homeassistant.middlewares=homeassistant-https-redirect”
– “traefik.http.routers.homeassistant-secure.entrypoints=https”
– “traefik.http.routers.homeassistant-secure.rule=Host(`homeassistant.xxx.xxx.xxx.org`)”
– “traefik.http.routers.homeassistant-secure.tls=true”
– “traefik.http.routers.homeassistant-secure.tls.certresolver=http”
– “traefik.http.routers.homeassistant-secure.service=homeassistant”
– “traefik.http.services.homeassistant.loadbalancer.server.port=8123”
– “traefik.docker.network=traefik”
Allerdings bekomme ich nur ein mageres “501 Bad Gateway”.
In der Anleitung steht, dass man das Netzwerk von Traefik noch zufügen soll. Wenn ich das allerdings tue, bekomme ich die Fehlermeldung: “network mode: host” and “networks” are incompatible!” Ich gehe davon aus, dass dies die Ursache für den Fehle ist.
Ich muss aber Home Assistant aber im Network Mode “Host” laufen lassen , da es die Protokolle nDNS / Bonjour, SSDP, zeroconf, … benötigt. Irgendeine Idee, wie das gelöst werden kann?
Vielen Dank im Voraus!
Hans – Thomas
Hallo,
ich habe deine Anleitung befolgt und bin dir sehr dankbar für das HowTo.
Leider stehe ich gerade etwas auf dem Schlauch und bräuchte Unterstützung.
Folgendes habe ich vor:
Docker inkl Docker Compose ist auf einem vServer im Internet installiert.
Traefik ist über das Docker Compose File Online und soweit funktional.
Nun habe ich z.B einen Raspi daheim stehen, welcher via Wireguard mit dem vServer verbunden ist.
Was müsste ich Docker / Traefik seitig denn nun konfigurieren, damit ich über den vServer zu meinem Homepi komme?
Also Traefik hält den FQDN myhomepi.domain.tld und soll diese an die Wireguard IP Adresse 10.172.55.13 weiterleiten.
Traefik sollte in diesem Falle als Reverse Proxy dienen und ein LE Zertifikat beziehen.
Muss ich hier Anpassungen in der docker-compose.yml vornehmen?
Recht wäre es mir, wenn ich eine zweite .yml Datei anlegen, wo die Config dann drin steht, so gesehen, dass für jeden “vHost” eine Datei im Traefik eingelesen wird.
Vielen Dank für eure Hilfe
Hi Christian,
erst einmal: DANKE für deine Mühen und die easy Anleitungen! Dank deiner Seite habe ich jetzt an zwei Tagen endlich das erreicht, was ich eigentlich schon seit längerem einführen wollte. Hab bei mir jetzt mailcow (war bis dato nur standalone), Portainer, BitWarden (wollte schon länger von 1Password wechseln) und einige WordPress-Instanzen hinter Traefik! Danke in Form einer Spende geht nachher mal raus… 🙂
Aber mal eine Frage zu Traefik selbst:
Nach der initialen Installation hat es mich noch nach dem Login gefragt… Mittlerweile aber nicht mehr. Hab gerade noch in der docker-compose.yml einen neuen Login erstellt und den Container mal neugebaut – trotzdem lande ich sofort im Dashboard. Selbst im Inkognito-Modus meines Browsers.
Hast du da ‘ne Idee zu?
VG
Dawid
Hallo Christian,
zunächst mal vielen Dank für die sehr gute Hilfestellung. Ich bin aktuell dabei eine bestehende nextcloud-nginx-reverse-proxy docker Konfiguration umzustellen (Zielsetzung: nginx reverse proxy mit traefik ersetzen, um weitere Services einfacher umsetzen zu können). Mit Hilfe deiner Beschreibung bin ich bereits ein gutes Stück weiter gekommen. Nur noch ein Hinweis, was bei mir zu etwas Verwirrung gesorgt hat (da ich mich mit traefik noch Null auskenne – also eigentlich mein Fehler, aber vielleicht würde eine etwas ausführlichere Erklärung an der Stelle auch anderen helfen):
Die Benennung der “entrypoints” und “certificateresolvers” zusammen mit labels wie beispielsweise “traefik.http.middlewares.traefik-https-redirect.redirectscheme=https” haben bei mir dazu geführt, dass ich nicht wusste an welcher Stelle im label was gemeint ist. Konkret: Bezieht sich das erste “http” auf einen entrypoint, einen certificateresolver oder ist es schlicht Teil der label-Syntax, die von traefik so gefordert wird? Gleiche Fragestellung gilt für das letzte “https” im obigen Beispiellabel…
Vielen Dank nochmal!
Die Anleitung sieht gut aus. Nur eine Frage: Ich habe bereits AdGuard Home unabhängig von Docker installiert und möchte das auch ganz gerne so beibehalten. Die Ports 80 und 443 sind also bereits belegt. Kann ich die hier vergebenen Ports einfach durch andere, z.B. 8042, 8043…. ersetzen oder klemmt es dann?