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,
Ich habe ein Problem bei der Anmelde makse.
Ich habe sowohl meinen eigenen String da eingetragen (Server:…)
als auch den der hier stand (user:$$apr1$$7ciH.Uzt$$DUqDgmpLmFE2Fm7Z7VaMe/)
aber immer wenn ich das Passwort angebe passiert nichts bzw ich soll die daten neu angeben.
Kann es eventuell an Portainer liegen ?
und als nächste frage habe ich wenn ich auf traefik.[Text].duckdns.org bekomme ich 1. unsichere Verbindung 2. Fehler 404.
Wenn ich auf [Text].duckdns.org gehe bekomme ich 1. unsichere Verbindung 2. Die endlose Anmeldemaske
Wenn ich es aber richtig verstanden habe sollte die Maske doch eigentlich auf traefik.[Text].duckdns.org kommen oder?
Ich hoffe man versteht mein Problem und kann mir eventuell Helfen.
Hallo,
ich bekomme immer folgende Fehler:
traefik | time=”2021-04-21T15:18:26+02:00″ level=info msg=”Configuration loaded from file: /traefik.yml”
traefik | time=”2021-04-21T15:18:26+02:00″ level=error msg=”The ACME resolver \”http\” is skipped from the resolvers list because: unable to get ACME account: unexpected end of JSON input”
traefik | time=”2021-04-21T15:18:27+02:00″ level=error msg=”the router traefik-secure@docker uses a non-existent resolver: http”
Ich bin recht neu auf dem Gebiet und wüsste gerne einen Rat ^^
Vielen Dank im Voraus!
Hi Christian,
vielen Dank für die vielen guten Anleitungen rund um Docker. Leider bleibe ich bei traefik bei der Erzeugung der Zertifikate hängen; die Seiten sind nicht zu erreichen.
Ich nutze einen Server hinter meiner Fritzbox; die Box ist über einen DynDNS Eintrag xxx.spdns.eu zu erreichen.
Folglich sind die Einträge in der docker-compose.yml
– “traefik.http.routers.traefik.rule=Host(`traefik.xxx.spdns.eu`)”
und
– “traefik.http.routers.traefik-secure.rule=Host(`traefik.xxx.spdns.eu`)”
Im log des traefik Containers findet sich die Fehlermeldung:
time=”2021-04-08T19:16:32+02:00″ level=error msg=”Unable to obtain ACME certificate for domains \”traefik.xxx.spdns.eu\”: unable to generate a certificate for the domains [traefik.xxx.spdns.eu]: error: one or more domains had a problem:\n[traefik.xxx.spdns.eu] acme: error: 400 :: urn:ietf:params:acme:error:dns :: DNS problem: NXDOMAIN looking up A for traefik.xxx.spdns.eu – check that a DNS record exists for this domain\n” rule=”Host(`traefik.xxx.spdns.eu`)” providerName=http.acme routerName=traefik-secure@docker
Das die Namesaufösung nicht klappt finde ich logisch – traefik.xxx.spdns.eu ist ja nur intern bekannt.
Lasse ich das traefik vor xxx.spdns.eu weg, dann klappt die Erzeugung des Zertifikats – das ist ja aber nicht Sinn der Sache.
Hast Du eine Idee, wie ich das Problem los werden kann?
Vielen Dank schon mal
Andreas
Guten Morgen,
mein Problem ist, dass ich nicht verstanden habe, in welcher Form ich jetzt neue Container einbinden kann. Traefik läuft ohne Probleme auf einer Subdomain, aber wie und wo füge ich neue Container hinzu? Packe ich den Service in dieselbe Datei oder erstelle ich dafür auch einen Container-Ordner?
Mit freundlichen Grüßen
Hallo Christian,
auf meinem Server laufen nach deiner Anleitung diverse Docker in Verbindung mit Taefik. Das funktioniert sehr gut und auf meiner Fritzbox habe ich lediglich die Ports 80 und 443 für Traefik geöffnet.
Ich würde jetzt gern verhindern, dass jemand von außen unberechtigt auf meine Docker zugreift. Siehst Du eine Möglichkeit, eine Firewall in das System einzbinden, die z. B. bestimmte Adressbereiche von außerhalb blockieren kann?
Ich habe schon UFW (ohne Docker) installiert, bekomme es damit aber nicht hin.
Viele Grüße und danke für deine Webseite
Werner
Hallo, super Anleitung! Aber braucht man immer auch einen A-Record für traefik.DOMAIN.TLD?
Wenn man Jitsi.DOMAIN.TLD und Ilias.DOMAIN.TLD auf verschiedenen Servern ausprobiert, muss man dann bei traefik.DOMAIN.TLD mit traefik-1.DOMAIN.TLD und traefik-2.DOMAIN.TLD usw arbeiten? Oder kann man für den Zugriff auf die Traefik-Oberfläche auch irgendwie Ports nutzen und nur A-Records für zB Ilias.DOMAIN.TLD und jitsi.DOMAIN.TLD vergeben und Traefik über Ilias.DOMAIN.TLD:12345 und jitsi.DOMAIN.TLD:12345 erreichen?
Hallo Christian,
wirklich eine sehr gute Anleitung. Der Docker-Container fährt auch hoch und wird im Traefik-Dashboard auch korrekt angezeigt.
Rufe ich die URL auf, kommt aber immer die Meldung:
curl https://nextcloud.yyyyyyyyy.duckdns.org -I
HTTP/2 504
content-type: text/plain; charset=utf-8
content-length: 15
date: Sat, 30 Jan 2021 14:23:53 GMT
Ich habe die docker-Netzwerke wie im Tutorial angegeben, konfigueriert.
Hast Du eine Idee, wie man da weiterkommt?
Beste Grüße, Klaus
Hi,
bis hier herr hat alles super geklappt. Bei wordpress ist der Wurm drin.
bekomme immer die Meldung: Error establishing a database connection
meine docker-compose.yml für wordpress sieht so aus:
version: ‘3’
services:
db:
image: mariadb:latest
volumes:
– /opt/containers/wordpress/db-daten:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: xxx
WORDPRESS_DB_NAME: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: xxx
MYSQL_INITDB_SKIP_TZINFO: 1
networks:
– default
restart: unless-stopped
wp:
image: wordpress:latest
volumes:
– /opt/containers/wordpress/wp-daten:/var/www/html
labels:
– “traefik.enable=true”
– “traefik.http.routers.wp.entrypoints=http”
– “traefik.http.routers.wp.rule=Host(`xxxx.duckdns.org`)”
– “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(`xxx.duckdns.org`)”
– “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”
networks:
– default
– proxy
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: xxx
WORDPRESS_DB_NAME: wordpress
MYSQL_USER: wordpress
restart: unless-stopped
networks:
proxy:
Jemand eine Idee ?
Hallo,
ich bin neu in dieser Materie. Nutze zu Hause einen neu aufgelegten Server mit Debian 10 und OMV5 (NGINX). Ich habe bei netcup eine de-Domain und würde gerne über eine Subdomain traefik erreichen. Gibt es dazu Anleitungen? Oder wer kann mir helfen?
Hallo,
ich bin jetzt zu Netcup gewechselt und weiss nicht, wo welche Eintragungen erfolgen müssen.
(Ich war zuvor bei ionos, da hat es wunderbar geklappt…).
Welche DNS-Einstellungen muss ich dort vornehmen?
Ich hatte zuvor getrennte Einstellmöglichekeiten für meinedomain.de sowie der Subdomain seite.meinedomain.de
Für meinedomain.de hatte ich das A record sowie das AAAA record gesetzt, für traefik.meinedomain.de die AAAA records für die Subdomain, das war´s und es lief problemlos.
Mich verwirrt das *, @ cname etc, diese gab es bei ionos nicht.
Muss ich im Webhosting Control Panel eine subdomain traefik.meinedomain.de einrichten und diese dann weiterleiten?
Momentan erhalte ich von traefik im log folgende Fehlermeldung:
2021/01/05 10:37:01 command traefik error: field not found, node: resolvers
Ich bin nach dem Wechsel völlig verwirrt und wäre für eine genaue Erklärung sehr dankbar.
Jürgen Dingslaken