Interne Namensauflösung bei Docker mit Traefik

Traefik nutze ich primär um als reverse proxy von extern auf meine Docker Container zugreifen zu können. Dies natürlich SSL terminiert. Verschiedene Dienste sollen allerdings nicht extern erreichbar sein und benötigen auch – aus meiner Sicht – nicht zwingend eine verschlüsstele Verbindung.

Aus diesem Grund habe ich auf meinem internen Docker Server Traefik als reverse proxy laufen, welcher den verschiedenen Diensten via netzwerkinterner DNS-Auflösung ein DNS Namen verpasst. So kann ich z. B. via http://phpipam.docker.domain.local auf mein PHPIPAM Dienst zugreifen.

Voraussetzungen

  • Docker Host
  • Bereits eingerichtet Services (ich empfehle die Services intern immer erst mal rudimentär zu testen und dann zu erweitern)
  • internen DNS Server (ich nutze hier Windows DNS)

Auf meinem Windows DNS Server lege ich im DNS eine neue primäre Zone mit dem Namen „docker.domain.local“ (entsprechend an deine Bedürfnisse anpassen). Diese erhält dann einen einzigen A-Record der als Wildcard auf den Docker-Host zeigt.

Screenshot aus dem Windows DNS

Traefik einrichten

Um Traefik dann nutzen zu können, bediene ich mich zum Teil meiner vorhandenen Docker-Compose Sammlung auf Github. Den Traefik Container und die traefik.toml Datei wird dabei ein wenig angepasst.

traefik.toml:

 [log]
   level = "DEBUG"
 
 [providers]
   [providers.docker]
      exposedByDefault = false
      endpoint = "unix:///var/run/docker.sock"
      network = "traefik_proxy"
 
 [entryPoints]
   [entryPoints.web]
     address = ":80"

docker-compose.yaml

 ---
 version: '3.3'
 
 services:
   traefik:
     image: traefik:latest
     container_name: traefik
     volumes:
       - /var/run/docker.sock:/var/run/docker.sock
       - $PWD/config:/etc/traefik
       - /etc/localtime:/etc/localtime
     ports:
       - "80:80"
     restart: always
     networks:
       - default
       - traefik_proxy
 
 networks:
   traefik_proxy:
     external:
       name: traefik_proxy
   default:
     driver: bridge

Anschließend lässt sich der Container starten und ist bereit um Container als reverse proxy anzubieten.

Bei den anzubietenden Services müssen wir dann natürlich auch noch die Compose Datei anpassen. Beispielhaft hier meine zu phpIPAM:

---
version: '3'

services:
  phpipam-mysql:
    image: mysql:5.7
    container_name: phpipam-mysql
    restart: unless-stopped
    volumes:
      - $PWD/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=ROOTPASSWORD

  phpipam-phpipam:
    image: pierrecdn/phpipam:latest
    container_name: phpipam-phpipam
    restart: unless-stopped
    environment:
      - MYSQL_ENV_MYSQL_USER=root
      - MYSQL_ENV_MYSQL_ROOT_PASSWORD=ROOTPASSWORD
      - MYSQL_ENV_MYSQL_HOST=phpipam-mysql
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.phpipam-http.entrypoints=web"
      - "traefik.http.routers.phpipam-http.rule=Host(`phpipam.docker.domain.local`)" #Domain anpassen
      - "traefik.http.services.phpipam.loadbalancer.server.port=80"
    depends_on:
      - phpipam-mysql
    networks:
      - traefik_proxy
      - default
 
 networks:
   traefik_proxy:
     external:
       name: traefik_proxy
   default:
     driver: bridge

Anschließend auch noch diese Compose Datei starten und nun lässt sich, wenn alles korrekt eingerichtet wurde, der Service als URL öffnen. So ist es wesentlich einfacherer als ich für jeden Service einen neuen Port überlegen zu müssen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.