Suche
  • Homelab Tutorials & Reviews
  • mail@teqqy.de
Suche Menü

Reverse Proxy mit Traefik unter Docker

Um mehrere Webseiten unter einer IP und einer Domain zu veröffentlichen, ist es am einfachsten, wenn man sich ein sogenannten reverse proxy einrichtet. Die wohl bekannte Variante dazu ist von NGINX. Hierfür gibt es auch diverse Tutorials im Internet.

Meine ganzen Services, die ich extern verfügbar machen möchte, laufen allerdings als Docker Container. Entsprechend bietet es sich an, auch den reverse proxy Traefik unter Docker als Container laufen zu lassen.

Auch hier gibt es für NGINX – auch in Kombination mit Let’s encrypt Zertifikaten – reichlich Tutorials. Ich hatte mich damals allerdings für einen anderen Weg entscheiden und Traefik als reverse proxy genommen.

Traefik Architecture

Wichtig ist natürlich, dass ihr in eurer Firewall bzw. Router ein NAT auf euren Docker Host einstellt. Port 80 (HTTP) und 443 (HTTPS) sollten entsprechend reichen.

Docker Container mittels Compose

Ich gehe erst mal davon aus, dass ihr Docker in einer der letzten Versionen installiert habt und eure Services, zumindest intern, vollständig funktionieren. Zudem nutze ich Docker Compose zum Verwalten meiner Container. Eine Adaption zu einem docker run command sollte kein Problem darstellen.

version: '3'

services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: always
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik:/etc/traefik
    environment:
      - "TZ=Europe/Berlin"
    networks:
      - traefik_proxy
      - default

networks:
  traefik_proxy:
    external:
      name: traefik_proxy
  default:
    driver: bridge

Ports 80 und 443 werden benötigt, um die entsprechenden Seiten dann auch weiterzuleiten. Port 8080 verwenden wir für das Webfrontend von Traefik. Ihr müsst also aufpassen, dass keine anderen Container diese Ports verwenden. Den Traefik Webport könnt ihr auch durch einen anderen ersetzen.

Zudem mounten wir als Volumes den Docker Socket, um Zugriff auf die laufenden Container zu haben. Als zweites Volume nutzen wir für die Konfigurationsdateien für Traefik.

Netzwerke legen wir an, um Traefik von außen erreichbar zu machen (default Netzwerk) und für das interne Routing zu Containern (traefik_proxy).

Traefik Konfiguration

Im Verzeichnis traefik legen wir nun noch die Datei traefik.toml an, welche folgenden Inhalt bekommt:

logLevel = "INFO"
  defaultEntryPoints = ["http", "https"]

[web]
  address = ":8080"

[docker]
  domain = "example.com"
  watch = true
  exposedbydefault = false

 # Force HTTPS
[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

 # Let's encrypt configuration
 [acme]
   email="youremail.address@example.com"
   storage="/etc/traefik/acme/acme.json"
   entryPoint="https"
   acmeLogging=true
   OnHostRule=true
   [acme.httpChallenge]
     entryPoint = "http"

Wichtig ist, dass ihr eure Domain unter [docker] und eure Email Adresse unter [acme] richtig anpasst. Die Email Adresse wird für die Let’s encrypt Zertifikate benötigt.

Im Grundsätzlichen war es das schon für das Setup. Um jetzt Docker Container auch dazu zu bringen, auf die entsprechenden Domains zu hören, müssen wir die Konfiguration der einzelnen Container auch anpassen. Hier mal ein Beispiel von „The Lounge“ (einem IRC Frontend)

version: '3'

services:
  thelounge:
    image: thelounge/lounge:latest
    container_name: thelounge
    volumes:
      - /var/docker/thelounge:/home/lounge/data
    labels:
      - "traefik.backend=thelounge"
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:subdomain.example.com"
      - "traefik.port=9000"
      - "traefik.docker.network=traefik_proxy"
    networks:
      - traefik_proxy

networks:
  traefik_proxy:
    external:
      name: traefik_proxy
  default:
    driver: bridge

Folgende Werte müsst ihr pro Container anpassen:

  • traefik.backend (Name des Backends – könnt ihr frei vergeben)
  • traefik.frontend.rule (die URL, auf dem der Service hören soll)
  • traefik.port (der Port, auf dem eure Anwendung hört)

Der Rest kann jeweils übernommen werden. Sollte ihr euren Container schon gestartet haben, solltet ihr diesen beenden, evtl. den Container löschen und neu starten. Ein paar Sekunden später ist der Service dann extern verfügbar.

15 Kommentare Schreibe einen Kommentar

    • No, it seems thats a new thing, that the web provider is deprecated.

      Antworten

  1. Vielen Dank für den Artikel und das Video. Kann mir vorstellen, dass das Ganze zu machen ziemlich aufwendig ist. Lustigerweise machst du die ganzen Dinge, dich ich auf meiner Homelab-To-Do-Liste gesammelt habe. Leider fehlt mir aktuell die Zeit für die Abarbeitung.

    Antworten

    • Das freut mich zu hören!

      Der YouTube Kanal ist ja genau aus der Motivation heraus entstanden anderen Leuten bei ihren Vorhaben zu unterstützen. Ich merke es ja immer selbst, dass ich das einfuchsen in verschiedene Themen nicht immer so leicht ist. Da ist es ein Vorteil wenn es jemand einigermaßen verständlich erklärt.

      Antworten

  2. Vielen Dank für Deine hilfreichen Videos und Blogbeiträge.
    Zum Thema „Reverse Proxy mit Traefik“ würde mich noch interessieren wie ich Traefik zusammen mit „Non-Docker“ Services nutzen kann? Welche Einstellungen muss ich in Traefik vornehmen um sowohl Services die in Docker Containern laufen als auch Services die nicht in Docker Containern laufen aus dem Internet aufzurufen?

    Antworten

    • Komplett ohne Docker wäre Traefik etwas sinnfrei, weil seine Stärken einfach bei Containern liegen. Wenn man aber einen Mischbetrieb nutzen möchte, muss man für Nicht-Docker-Services einzelne Backends definieren. Hier bei Reddit ist ein Beispiel.

      Antworten

  3. hi,
    ich habe deine vorlage exakt befolgt (domain/email angepasst), bekomme aber nur ein:

    404 page not found

    wenn ich traefik im browser aufrufen möchte.

    portainer-oberfläche komme ich rauf.

    vg hardy

    Antworten

    • Also 100 %ig exakt wäre nicht gut, weil dir sicherlich nicht die Domain example.com gehört. Ich gehe aber mal davon aus, dass du das angepasst hast?
      Docker Container hast du mit den environment variables auch richtig angepasst? Port etc richtig angegeben?

      Antworten

  4. ok – bin nun im traefik-dashboard 🙂
    hab eine andere proxmox-bridge genommen. (vmbr0 statt vmbr1) – muss mal gucken was ich da in opnsense noch ändern muss…

    dann mache ich mal weiter 🙂

    vg hardy

    Antworten

  5. ich hab da noch n paar fragen:
    habe auf meinem strato-vserver eine subdomian „whoami.domain.de“ angelegt.
    habe eine c-name-weiterleitung eingerichtet.
    auf welche ip muss ich zuhause die weiterleitung einrichten? auf die docker-vm oder auf die traefik-ip incl. portnummer?

    gruss hardy

    Antworten

    • Auf die Docker VM. Traefik sollte hier auf Port 80 und 443 exklusiv lauschen. Traefik übernimmt dann das routing auf andere Webanwendungen.

      Antworten

  6. habe die weiterleitung http und https auf die ip der docker-vm eingerichtet.
    portainer zeigt dies an:

    traefik /running /traefik/traefik:latest/2019-04-29 16:20:18/172.21.0.3/443:443 80:80 8080:8080

    whoami-1/running/traefik/jwilder/whoami/2019-04-29 16:20:18/172.21.0.2 –

    portainer/running/- portainer/portainer/2019-04-03 09:10:14/172.17.0.2/9000:9000

    wenn ich im browser whoami.meinedomain.de eingebe, ist die seite nicht erreichbar.
    hast du noch n tipp?
    und wie richtet man ein passwort für traefik ein? bin kompletter docker-anfänger…:-)
    kann ich dir scrennshots an deine mailadresse senden?

    vg hardy

    Antworten

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.