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 Chrisian,
ja, ich habe seit Jahren meine Domain. Die nutze ich mit dem Mailserver von Synology und dem Proxmox Mail Gateway. Mein Wildcardzertifikat kaufe ich jedes Jahr für ca. 90 Euro neu. Ich möchte diese Combo so nicht mehr nutzen und meine alte Domain nun nur für Mailcow nutzen und auf einen neuen Server umziehen. Da ich ja ein gekauftes Zertifikat für meine Domain habe gibt es doch mit Sicherheit Probleme ein neues von Let Crypt zu erhalten. Oder kann ich einfach meine DNS Einträge bei selfhost.de löschen und bekomme dann für Traefik etc. ein neues Zertifikat für meinen neuen Server?
Ich habe ein gekauftes Zertifikat für eine *.Domain.
Nun habe ich einen weiteren Server gemietet und möchte nun Traefik installieren. Möchte mir aber in Zukunft das Geld für das Zertifikat sparen. Wie gehe ich hier am besten vor. Muss ich das Zertifikat widerrufen. Muss ich alle alten DNS Einträge erst löschen um Traefik nutzen zu können?
Hallo Christian,
seit ein paar Tagen meckert Mailcaow beim Update, dass wir noch Docker-Compose v1 benutzen:
checking docker compose version…
WARN: Your machine is using Docker-Compose v1!
mailcow will drop the Docker-Compose v1 Support in December 2022
Please consider a upgrade to Docker-Compose v2.
Pros/Cons: Das habe ich mir kurz angesehen (https://u-labs.de/portal/docker-compose-v1-vs-v2-welche-version-sollte-ich-benutzen-worin-liegen-die-unterschiede/). Dort wird empfohlen zu wechseln:
Welche Docker Compose Version sollte ich nutzen?
Version 2 würde ich definitiv bevorzugen: Sie bietet einige Vorteile gegenüber Version 1 und wird aktiv mit Aktualisierungen versorgt. Die letzte 1.x Version 1.29.2 stammt aus dem Mai 2021.
Zumal Mailcow ja auch sagt, dass im Dezember 2022 der Support für Docker-Compose v1 eingestellt wird.
Wie siehst Du das?
Hallo Christian, genau das war mein Fehler. Ich dachte Password muss stehen bleiben damit ein Passwort erstellt wird.
Dachte das wäre ein Befehl um ein Passwort zu stellen. Nun habe ich es. Vielen Dank
Hallo Christian,
ich habe mir jetzt einen schönen Server von Hetzner gemietet und gleich Traefik installiert.
Hat geklappt, aber ich kann mich mit dem angelegten User und Passwort welches ich erstellt habe nicht anmelden.
Nun schon zweimal frisch installiert und ausprobiert. Gibt es bei Hetzner etwas zu beachten? Oder ist da ein Fehler in der Anleitung?
Hinsweis: Traefik läuft und funktioniert, nur anmelden kappt nicht.
VG Jens
Hallo Christian,
Fehler gefunden. Danke für die gute Anleitung.
Hallo Christian,
danke für diesen und die anderen Artikel.
Nach der Installation kommt diese Meldung.
Fehlercode: SSL_ERROR_UNRECOGNIZED_NAME_ALERT
Wo liegt der Fehler. Meine Domain läuft über duckdns. Liegt es daran?
Hallo, Christian,
zunächst mein kommentar: tolle anleitung! Hat auf anhieb geklappt. Im gegensatz zu denen aus diversen top-it-zeitschriften.
Jetzt meine fragen:
ich habe _traefik_ installiert. Anmeldung übers web möglich. Anschließend habe ich _portainer_ installiert. Anmeldung be _traefik_ nicht mehr möglich, dafür bei _portainer_. Ich gehe über eine Fritzbox ins internet. ipv6 ist, glaube ich, konfiguriert. Jedenfalls kann ich das lan-gerät über die ipv6-gerät über die ipv6-adresse ansurfen (dns-rebind-schutz ausgeschaltet.). Meine idealvorstellung ist, subdomains einzurichten (so wie in deinen anleitungen: taefik.meinedomain.de, portainer.meinedomain.de, nextcloud.meinedomain.de). Kann ich das über die Fritzbox machen, oder muß ich über einen dyndns-provider gehen?
Danke für deinen selbstlosen einsatz.
Mit besten grüßen
Joachim
Hallo Christian,
vielen Dank für die hervorragende Anleitung.
Wenn ich für meine Fritzbox einen Cname wie z.B. “fritzbox.meinwww.de” erstellt habe, dann muss dieser doch auch in 3.3 als hostname angegeben werden oder?
VG
Danke für die Starthilfe, ich hab das um OAuth ergänzt und hier beschrieben: https://software-berater.net/2022/traefik-und-oauth/