Dockercontainer über subdomains erreichen

Über Docker lassen sich Webservices komfortabel auf einem NAS von zu Hause aus hosten. Wenn man zusätzlich ein VPN
einrichtet, kann man auf alle selbstgehosteten Webservices komfortabel und sicher von überall auf der
Welt darauf zugreifen. Wenn man nun aber – wie ich – damit begonnen hat, intensiv auf solche selbstgehosteten
Webservices zu setzen (nur als Beispiel, gitlab, nextcloud, bitwarden, teamspeak) muss man sich mit der Zeit
einige Ports merken, um auf die Webservices zuzugreifen. Schließlich läuft jeder Webservice in einem eigenen Dockercontainer
und besitzt einen eigenen Port. Hier die Übersicht zu behalten, ist mit der Zeit unmöglich. Vielleicht weiß man beim Einrichten
noch, welchen Port man einem Webservice gegeben hat, aber nach spätestens nach 1-2 Monaten hat man den Port vergessen. Bookmarks helfen
hier zwar, aber deutlich eleganter ist es Subdomains für die Webservices einzurichten.

Um Subdomains im lokalen Netzwerk einzurichten, kann man im Prinzip jeden Webserver verwenden und konfigurieren (z.B. nginx oder apache), aber ich bin nun – besonders in der
Kombination mit Docker – auf einen komfortableren Weg gestoßen einen reverse proxy einzurichten: Traefik ist ein sogenannter Edge
Router, der genau für Services wie Docker, Docker Swarm, Kubernetes (etc.) entwickelt worden ist. Einmal eingerichtet, erkennt
Traefik automatisch alle Dockercontainer, die gerade laufen. Die Dockercontainer kann man über Labels bei der Erstellung so
einstellen, dass Traefik automatisch Subdomains dafür einrichtet. Außerdem sieht man über ein Webinterface sofort den Status der so
verfügbaren Container.

Hier eine kurze Anleitung dazu, wie man Traefik installiert, konfiguriert und anschließend einen Dockercontainer über eine
Subdomain erreichen kann. Die Anleitung setzt die vorige Installation von Docker und Kenntnis darüber voraus.
Zunächst muss das offizielle Traefik Dockerimage gepulled werden und ein Container damit angelegt werden.

docker pull traefik:latest
docker create -p 443:443 
              -p 80:80 
              -p 8080:8080
              -v /volume1/docker/traefik-config/traefik.yml:/etc/traefik/traefik.yml
              -v /var/run/docker.sock:/var/run/docker.sock
              --name traefik1 traefik:latest

Der Container ist eingerichtet, dass https und http einfach weitergeleitet werden. Falls man auf seinem Heimserver schon einen
apache oder Ähnliches laufen hat, oder man einfach nicht die Standardports verwenden will, kann man natürlich auch andere Ports verwenden.
Im yml File auf das verwiesen wird, steht die Konfiguration von Traefik. Im einfachsten Fall kann diese wie folgt lauten:

# /volume1/docker/traefik-config/traefik.yml

providers:
  docker:
    exposedByDefault: false
api:
  insecure: true

Der Pfad in den “docker create” Parametern muss natürlich angepasst werden. Diese Konfiguration stellt sicher, dass nicht alle,
sondern nur speziell angegebene Dockercontainer über Subdomains erreichbar sind – Mir ist es lieber hier die Kontrolle zu haben,
außerdem muss man bei der Erstellung ohnehin Labels für Traefik anlegen.
Das wars auch schon mit der Konfiguration von Traefik. Natürlich kann man noch SSL Zertifikate usw. angeben, aber das wäre dann ein
Thema für einen anderen Eintrag. Traefik muss nun nur noch gestartet werden.

docker container start traefik1

Über localhost:8080 kommt man auf das Webinterface. Jetzt, wo noch keine Dockercontainer für Traefik freigegeben sind, ist dieses zwar hübsch
anzusehen, aber noch relativ leer. Um einen Container für Traefik verfügbar zu machen, muss die Erstellung eines Containers um Labels erweitert
werden.

docker create [...] \
              -l "traefik.enable=true" \
              -l "traefik.http.routers.<CONTAINER_NAME>.rule=Host(\"container.example.com\")" \
              -l "traefik.http.services.<CONTAINER_NAME>-service.loadbalancer.server.port=80" \
              [...] 

Diese 3 Labels reichen im Normalfall aus, um einen Container über eine Subdomain im lokalen Netzwerk verfügbar zu machen. Durch die angegebenen
Labels, leitet Traefik über reverse-proxy auf den Container um. Die Angabe des Port ist nicht unbedingt nötig, sollte ein Container nur
einen Port verwenden, erkennt Traefik diesen automatisch. Einige Webservices verwenden aber mehrere Ports und hier muss der Port dann explizit
angegeben werden.