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:
docker network create web
Traefik als Docker Container installieren
Apache Utils installieren und Benutzer-Passwort-Kombination generieren
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
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.
################################################################
#
# 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
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.