Reverse Proxy mit Traefik unter Docker

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.

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.

<pre class="wp-block-code">```
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      - defaultnetworks:  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:

class="wp-block-code">``` 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="[email protected]" 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](https://teqqy.de/nginx-reverse-proxy-mit-lets-encrypt-und-cloudflare/) 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_proxynetworks:  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.