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 Christian,
erst einmal danke für deine tollen Tutorials, die haben mir schon sehr geholfen. Ich habe hier dank dir aktuell auf Ubuntu 20.04 Docker mit Traefik, Nextcloud, Portainer und Bitwarden laufen.
Ich wollte auch gerne Hass.io (Home Assistant Supervised (mit Addon Store)) ans laufen bekommen. Ich habe ewig einen Weg gesucht es per Docker Compose ans laufen zu bekommen, bin aber immer gescheitert.
Dann habe ich doch den Weg über ein Skript nach dieser Anleitung gewählt (https://www.smarthomebeginner.com/install-hass-io-on-docker-linux/), was auch wunderbar funktioniert hat. Im Heimnetz ist Home Assistant erreichbar, aber ich scheiter kläglich an der Integration in Traefik, da ich hier keine Docker Compose File habe 🙁
Laut dieser Seite gibt es auch die möglichkeit über “rules” Treafik entsprechend zu konfigurieren, damit es klappt. Blöderweise hat der Autor Traefik anders konfiguriert als du in deiner und ich kann (verstehe) es nicht so intigrieren wie er. Er bindet .yml files ein per CLI arguments im Docker-Compose.yml von Treafik.
Gibt es eine andere möglichkeit, z.B. über die Labels im Docker Compose von Traefik?
Es wäre der Hammer wenn du mir da auf die Sprünge helfen könntest, weil ich da bei weitem nicht genug Backgroundwissen habe um da durch zu steigen.
Gruß Bert
So nun habe ich mal wieder ein Problem.
habe alles gemacht wie sonst. ur komme ich nicht auf den Traefik.
wenn ich mich auf dem Server einlogge und docker ps eingeben, sehe ich zwar das der Docker läuft, aber er hat keine IP. Bei Port sethet 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
Wo liegt nun wieder das Problem?
Moin
bei mir startet der container nicht mehr nach dem letzen update.
musste die version erst mal bei traefik:v2.2.11 festsetzen.
Ist das reproduzierbar?
Danke
Frage wie müssten die Datein geändert werden wenn wir Letsencrypt für die Zertifikate verwenden möchten??
Danke im voraus
Hallo Christian, danke für deine Anleitung / Anleitungen, super.
Folgende Fragen zu dieser:
Warum verwendest Du root und sudo im Tutorial abwechselnd, hat das eine Grund oder übersehen?
Warum USER (/opt/containers/traefik/docker-compose.yml) und “user” in der Beschreibung von Traefik, hat es einen Grund?
Funktioniert, sollte deine Anleitung auch mit einer kostenfreien Subdomain funktionieren?
Viele Grüße
Matthias
Du hast hier einige top HowTos publiziert die mri sehr geholfen haben. Ich habe eben einen kleinen Hinweis in den Logs entdeckt den du korrigieren könntest.
dockerd[2108]: time=”2020-08-07T09:51:33.715401963+02:00″ level=warning msg=”Security options with `:` as a separator are deprecated
and will be completely unsupported in 17.04, use `=` instead.”
I schätze mal das sollte dann so aussehen?
security_opt:
– no-new-privileges=true
Hallo 🙂
das Port Problem ist gelöst aber dann erscheint beim Aufruf der Webseite folgendes:
Datenschutzfehler
Ihre Verbindung ist nicht privat.
Angreifer versuchen möglicherweise Ihre Informationen von traefik.marcos-cloud.de zu stehlen (z. B. Kennwörter, Nachrichten oder Kreditkarten).
NET::ERR_CERT_AUTHORITY_INVALID
Die Seite ist mit einem LetsEncrypt Zertifikat geschützt.
Im Log des Containers steht folgendes:
time=”2020-08-01T19:32:50+02:00″ level=error msg=”error parsing BasicUser: USER::$apr1$EWQVnN0K$8P8qBkiNHWIn3SCdqahJW/” entryPointName=https routerName=traefik-secure@docker
time=”2020-08-01T19:32:58+02:00″ level=error msg=”Unable to obtain ACME certificate for domains \”marcos-cloud.de\”: unable to generate a certificate for the domains [marcos-cloud.de]: error: one or more domains had a problem:\n[marcos-cloud.de] acme: error: 403 :: urn:ietf:params:acme:error:unauthorized :: Invalid response from https://marcos-cloud.de/.well-known/acme-challenge/LwQQJxI9lVjrWuJeV1LkTJ8XVYAlzKP6Pjyh1pi4m7I [178.254.9.9]: \”\\r\\n404 Not Found\\r\\n\\r\\n404 Not Found\\r\\nnginx\\r\\n\”, url: \n” routerName=traefik-secure@docker rule=”Host(`marcos-cloud.de`)” providerName=http.acme
Weiss jemand Rat ?
Vielen Dank 🙂
Hallo 🙂
bei mir erscheint beim Start folgende Fehlermeldung.
root@v16015:/opt/containers/traefik# ERROR: for traefik Cannot start service traefik: driver failed programming external connectivity on endpoint traefik (75f3d202c2e22691039cd713a577ad0fe8fd4bde9d7bb3d1f581041405f5c5be): Error starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
-bash: syntax error near unexpected token `(‘
Ich denke es hat was mit den Ports zu tun. Finde aber keine Lösung.
Weiss Du oder jemand hier vielleicht eine Lösung ?
Hallo,
Danke für die Tutorials.
Was mir so ein bisschen sorgen macht ist die tatsache, das alle services als user root laufen.
es gibt da wohl die möglichkeit mittels user: 1000:1000 bzw user: username das zu ändern,
allerdings will es mir nicht gelingen, die container starten einfach nicht ( restarting )
wäre super wenn du das evtl anpassen könntest, der sicherheit wegen 🙂
mfg
Thomas
Hallo Christian,
auch ich darf dir ein großes Danke hier lassen!
Alles hat geklappt bis auf das ändern von Punk “3.3 docker-compose.yml anpassen”.
Der Zugang über die subdomain traefik.meinedomain.de klappt lediglich mit user/password – ein neustart von docker/docker-compose sowie ein löschen er alten images hat nichts bewirkt. Ich weiß nicht ob das damit zusammenhängt das mit der zweiten Anleitung “https://goneuland.de/traefik-v2-https-verschluesselung-sicherheit-verbessern/” auch keine Effekte eintreten..
Bin für jede Hilfe dankbar.
Liebe Grüße Omar