Wie Sie Traefik 2.3 mit Docker 19.3 und Let’s Encrpyt SSL Zertifikaten auf Ubuntu Server 18.04 installieren und konfigurieren, erkläre ich in diesem Tutorial.
Bis hier hin war es für mich ein langer Weg. Im Internet kursieren viele verschiedene Tutorials über Traefik mit Docker und Docker Compose. Besonders die verschiedenen Version der docker-compose.yml Datei und das Vorhandensein einer alten traefik.toml bereiteten mir große Schwierigkeiten.

Ziel
Traefik soll als Docker Container laufen und mit Docker-Compose zu konfigurieren sein. Das Traefik-Dashboard soll mit einfacher Authentifizierung und dem Benutzer „agrundner“ abgesichert und unter https://traefik.example.net/dashboard/ erreichbar sein. Der Container „whoami“ wird als einfacher Test unter https://test.example.net erreichbar sein.

Voraussetzungen & Ausgangsbasis
- Rootrechte (zum Erlangen: sudo su –)
- Ubuntu 18.04 (zum Anzeigen der Version: lsb_release -a)
- Docker 19.03 (zum Anzeigen der Version: docker version) – Installationsanleitung
- Docker Compose 1.17 (zum Anzeigen der Version: docker-compose version) – Installationsanleitung
- Subdomain traefik.example.net und test.example.net welche mit A-Record auf den Ubuntu-Server zeigen
Docker Netzwerk erstellen
- Docker Netzwerke anzeigen: docker network ls
- Neues Docker Netzwerk „web“ anlegen:
1 | docker network create web |
Traefik als Docker Container installieren
Apache Utils installieren und Benutzer-Passwort-Kombination generieren
1 2 3 | sudo apt install apache2-utils -y htpasswd -nb agrundner ein-passwort --> agrundner:$apr1$JkX55ay9$.I /tzTmu38TYCZ3qReG3P0 |
Die Ausgabe des letzten Befehls speichern Sie irgendwo und dann werden alle $-Zeichen verdoppelt:
agrundner:$$apr1$$JkX55ay9$$.I/tzTmu38TYCZ3qReG3P0
Anlegen der Ordner und Dateien
1 2 3 4 | mkdir /opt/traefik cd /opt/traefik/ touch traefik.toml touch docker-compose.yml |
Der Ordner letsencrypt wird dabei automatisch angelegt

traefic.toml (statische Konfiguration)
Hier handelt es sich um die statische Konfiguration, in der ich fast alles kommentiert lasse, da ich die Änderungen in der dynamischen Konfiguration (docker-compose.yml) mache.
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | ################################################################ # # Configuration sample for Traefik v2. # # For Traefik v1: https://github.com/containous/traefik/blob/v1.7/traefik.sample.toml # ################################################################ ################################################################ # Global configuration ################################################################ [global] checkNewVersion = true sendAnonymousUsage = false ################################################################ # Entrypoints configuration ################################################################ # Entrypoints definition # # Optional # Default: [entryPoints] [entryPoints.web] address = ":80" [entryPoints.websecure] address = ":443" ################################################################ # Traefik logs configuration ################################################################ # Traefik logs # Enabled by default and log to stdout # # Optional # [log] # Log level # # Optional # Default: "ERROR" # level = "DEBUG" # Sets the filepath for the traefik log. If not specified, stdout will be used. # Intermediate directories are created if necessary. # # Optional # Default: os.Stdout # # filePath = "log/traefik.log" # Format is either "json" or "common". # # Optional # Default: "common" # # format = "json" ################################################################ # Access logs configuration ################################################################ # Enable access logs # By default it will write to stdout and produce logs in the textual # Common Log Format (CLF), extended with additional fields. # # Optional # # [accessLog] # Sets the file path for the access log. If not specified, stdout will be used. # Intermediate directories are created if necessary. # # Optional # Default: os.Stdout # # filePath = "/path/to/log/log.txt" # Format is either "json" or "common". # # Optional # Default: "common" # # format = "json" ################################################################ # API and dashboard configuration ################################################################ # Enable API and dashboard [api] # Enable the API in insecure mode # # Optional # Default: false # # insecure = true # Enabled Dashboard # # Optional # Default: true # # dashboard = false ################################################################ # Ping configuration ################################################################ # Enable ping [ ping ] # Name of the related entry point # # Optional # Default: "traefik" # # entryPoint = "traefik" ################################################################ # Docker configuration backend ################################################################ # Enable Docker configuration backend [providers.docker] # Docker server endpoint. Can be a tcp or a unix socket endpoint. # # Required # Default: "unix:///var/run/docker.sock" # # endpoint = "tcp://10.10.10.10:2375" # Default host rule. # # Optional # Default: "Host(`{{ normalize .Name }}`)" # # defaultRule = "Host(`{{ normalize .Name }}.docker.localhost`)" # Expose containers by default in traefik # # Optional # Default: true # # exposedByDefault = false |
docker-compose.yml (dynamische Konfiguration)
Diese Datei enthält die dynamische Konfiguration von Traefik. Achten Sie besonders auf die Einrückungen und Anführungszeichen! Manche Dokumentation im Internet sind in einer älteren Version als „3.3“ und dort sind keine Anführungszeichen notwendig. Docker Compose Dateiversionen
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | version: '3.3' services: traefik: # The official v2 Traefik docker image image: "traefik:v2.2" container_name: "traefik" # Enables the web UI and tells Traefik to listen to docker command: - "--api=true" - "--api.dashboard=true" - "--log.level=DEBUG" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--providers.docker.network=web" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.myresolver.acme.httpchallenge=true" - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web" # für Testzwecke geeignet, da Let's Encrypt "rate limiting" einsetzt # - "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" - "--certificatesresolvers.myresolver.acme.email=webmaster@example.net" - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" ports: - "80:80" - "443:443" volumes: - "./letsencrypt:/letsencrypt" - "/var/run/docker.sock:/var/run/docker.sock:ro" labels: - "traefik.enable=true" - "traefik.http.routers.api.rule=Host(`traefik.example.net`)" - "traefik.http.routers.api.service=api@internal" - "traefik.http.routers.api.middlewares=auth" - "traefik.http.middlewares.auth.basicauth.users=agrundner:$$apr1$$JkX55ay9$$.I/tzTmu38TYCZ3qReG3P0" - "traefik.http.routers.api.entrypoints=websecure" - "traefik.http.routers.api.tls.certresolver=myresolver" networks: - "web" whoami: image: "containous/whoami" container_name: "simple-service" labels: - "traefik.enable=true" - "traefik.http.routers.whoami.rule=Host(`test.example.net`)" - "traefik.http.routers.whoami.entrypoints=websecure" - "traefik.http.routers.whoami.tls.certresolver=myresolver" networks: - "web" networks: web: external: true |
Traefik starten mit Docker Compose
- Ins Verzeichnis wechseln, welches die Datei docker-compose.yml enthält
- Traefik im Vordergrund starten: docker-compose up
- Traefik im Hintergrund starten: docker-compose up -d
- Logs eines im Hintergrund gestarteten Containers anzeigen: docker-compose logs
- traefik.example.net/dashboard/ im Browser öffnen und Zugangsdaten eingeben
Fragen?
Ich hoffe es hat bei Ihnen geklappt! Falls nicht, schreiben Sie bitte einen Kommentar wo es Probleme gab. Ich werde gerne helfen und die Traefik Dokumentation anpassen und erweitern.
Guten Tag
mein Problem ist wie Folgt:
ich habe mein Proxmox Umgebung.
in Proxmox habe ich unterschiedliche Container am laufen, eins davon ist traefik.
ich kann die Container’s nicht via Labels mit dem Traefik-Container verbinden. Traefik hat für sich ein Container und in der Docker-compose.yml habe ich diese einstellungen
version: „3.3“
services:
traefik:
image: „traefik:latest“
container_name: „traefik“
restart: „unless-stopped“
command:
#- „–log.level=DEBUG“
– „–api.insecure=true“
– „–providers.docker=true“
– „–providers.docker.exposedbydefault=false“
– „–entrypoints.web.address=:80“
– „–entrypoints.websecure.address=:443“
– „–certificatesresolvers.le.acme.httpchallenge=true“
– „–certificatesresolvers.le.acme.httpchallenge.entrypoint=web“
#- „–certificatesresolvers.le.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory“
– „–certificatesresolvers.le.acme.email=postmaster@example.com“
– „–certificatesresolvers.le.acme.storage=/letsencrypt/acme.json“
ports:
– „80:80“
– „443:443“
– „8080:8080“
volumes:
– „./letsencrypt:/letsencrypt“
– „/var/run/docker.sock:/var/run/docker.sock:ro“
in der anderen Container’s habe ich in die docker-compose.yml folgende Einstellung erweitert:
z.B
version: ‚3.9‘
services:
whoami:
image: „traefik/whoami“
container_name: „simple-service“
labels:
– „traefik.enable=true“
– „traefik.http.routers.whoami.rule=Host(`whoami.example.com`)“
– „traefik.http.routers.whoami.entrypoints=websecure“
– „traefik.http.routers.whoami.tls.certresolver=le“
aber die Container komunizieren nicht mit einander.
hast du hier eine Lösung
Danke im voraus
Very great post I simply stu m bled upon your weblog and wished to say that I have really enjoyed surfing around your weblog posts
Oh, davon hatte ich noch nie etwas gehört, also danke für den Hinweis! Ich freue mich auf Ihre neuen Artikel.
Hallo zusammen,
ich würde traefik gern auf einem anderen Port laufen lassen, da 80 und 443 schon von einem anderen Container verwendet werden und es zu kompliziert wäre das umzustellen.
Ich habe in der toml und in der docker compose jeweils die Ports angepasst. Bekomme aber trotzdem noch folgenden fehler:
time=“2021-12-08T21:08:51+01:00″ level=info msg=“Configuration loaded from file: /traefik.yml“,
time=“2021-12-08T21:09:00+01:00″ level=error msg=“Unable to obtain ACME certificate for domains \“traefik.meinedomain.de\“: unable to generate a certificate for the domains [traefik.kerschenlohr.de]: error: one or more domains had a problem:\n[traefik.meinedomain.de] acme: error: 403 :: urn:ietf:params:acme:error:unauthorized :: Invalid response from http://traefik.meinedomain.de/.well-known/acme-challenge/vnj6-A_jkIlX_OjPi5L6hm0xV1JnFHcI5CGCKZAcrQM [79.254.114.150]: \“\\r\\n502 Bad Gateway\\r\\n\\r\\n502 Bad Gateway\\r\\nnginx</cente\"\n" providerName=http.acme rule="Host(`traefik.mainedomain.de`)" routerName=traefik-secure@docker
Ist es überhaupt möglich andere Ports zu verwenden?
VG
Sebastian
Hallo,
ich glaube die automatische Erstellung des SSL-Zertifikats mit ACME geht nur über SSL und Port 443.
Danke Andreas, ich habe bereits mit Hilfe ca. 5 diversen Tutorials ausprobiert mein Projekt von nginx auf Traefik umzusiedeln. Erst mit deinem hat es endlich geklappt
Hallo zusammen,
Installation usw. hat wunderbar funktioniert. Leider komm ich aber nicht über die AUTH hinaus. Egal wie ich es versuche. Das Eingabefenster kommt immer und immer wieder.
Hello.
Du verwendest ja die Traefik Version 2.2.11. Wie kann ich denn hier dann updaten auf eine neuere Version? Einfach im docker-compose file „image: „traefik:v2.2″“ auf traefik:latest stellen?
Danke.
Hi Marc,
richtig! traefik:latest in der docker-compose-Datei hinterlegen und den Container neu starten. Ev. mit „docker-compose up –force-recreate“ neu starten, nachdem der Container mit „docker-compose down“ gestoppt wurde.
Hallo,
leider scheitert es bei mir immer an der Zertifikatsgenerierung. Ich habe die entsprechenden Log Auszüge angefügt:
traefik | time=“2021-01-30T19:09:48Z“ level=error msg=“Unable to obtain ACME certificate for domains \“traefik.example.net\“: unable to generate a certificate for the domains [traefik.example.net]: error: one or more domains had a problem:\n[traefik.example.net] acme: error: 400 :: urn:ietf:params:acme:error:dns :: DNS problem: NXDOMAIN looking up A for traefik.example.net – check that a DNS record exists for this domain, url: \n“ providerName=myresolver.acme routerName=api@docker rule=“Host(`traefik.example.net`)“
traefik | time=“2021-01-30T19:09:52Z“ level=error msg=“Unable to obtain ACME certificate for domains \“test.example.net\“: unable to generate a certificate for the domains [test.example.net]: error: one or more domains had a problem:\n[test.example.net] acme: error: 400 :: urn:ietf:params:acme:error:dns :: DNS problem: NXDOMAIN looking up A for test.example.net – check that a DNS record exists for this domain, url: \n“ rule=“Host(`test.example.net`)“ providerName=myresolver.acme routerName=whoami@docker
Trotz diverser Versuche und Nachforschungen kann ich das Problem nicht beheben.
Es wäre klasse wenn hier jemand eine Idee hat.
VG
Kili
Hallo! Du versuchst ein Zertifikat für traefik.example.net zu generieren? Bist du sicher, dass diese Domain auf deinen Server zeigt?
Vielen Dank für den Artikel. Bin zufällig über Google darauf gestoßen, da ich meine Docker Microservices Applikation unter Linux mit einem Let’s Encrypt Zertifikat schützen wollte und nach einer Lösung gesucht habe. Ich kannte Traefik vorher noch nicht, aber da ich weder mit Nginx noch mit Kestrel weit gekommen bin hab ich dem mal eine Chance gegeben…und hat auf anhieb geklappt. Dein Artikel beendet 2 Tage Recherche und probieren.
Hey,
du hast echt ein schönes Tutorial geschrieben. Ich bin heute zum ersten mal mit Traefik in Berührung gekommen und nun hab ich in 1,5 Stunden schon mein erstes Docker Setup samt Gitlab + Docker Repository laufen. Danke ;-)
Hat super funktioniert, danke!!!
Weißt du auch wie htttp auf https weitergeleitet werden kann?
LG Victor
Hallo Andreas,
die Antwort kam aber fix :).
Habe es nun nochmal mit dem / am Ende probiert und siehe da, er lädt das Dashboard. Für deine Anleitung hier fände ich z.B noch einen möglichen Entrypoint eine nützliche Ergänzung. BIn gerade dabei mir einen Gitlab Container aufzusetzen, welchen ich dann über Traefik veröffentlichen will.
Die Doku von Traefik ist da leider auch wieder etwas listig…
https://docs.traefik.io/v2.2/routing/overview/
Das aber nur als kleiner Anreiz
Lieben Gruß
Erst einmal vielen Dank für die Anleitung. Finde ich echt Top.
Ich hänge jedoch an dem Punkt, dass ich das Dashboard nicht angezeigt bekomme, sondern nur 404-Not Found.
Die Logs hätte ich gerne mit dran gehangen, aber dann wird die Nachricht zu lang und ich darf nicht mehr abschicken :(
Hi Marius,
habe die maximale Kommentarlänge auf 10.000 Zeichen geändert. Vielleicht magst du deine Logfiles anhängen oder sonst Pastebin verwenden.
Vielen Dank, dass Sie Ihr Wissen durch diesen Artikel mit uns teilen. Ich freue mich darauf, mehr aus Ihrem Blog zu lesen.