In der folgenden Anleitung werde ich darauf eingehen, wie man eine VM mit alpine Linux aufsetzt, darauf Docker installiert und dann als Container einen Traefik 2 reverse Proxy.

Als erstes muss eine neue VM erstellt werden und als Boot Medium Alpine Linux eingelegt werden. Wenn die ISO gebootet ist kommt ein Login Fenster, hier einfach mit dem Benutzer root anmelden. Danach sollte ein Terminal Prompt kommen. Um Alpine zu installieren muss der Befehl setup-alpine eingegeben werden. Hierbei gilt es zu beachten, dass die ISO ein englisches Tastaturlayout benutzt. Der Bindestrich liegt hier auf dem ß. Als erstes muss nun im Setup das Tastaturlayout angegeben werden, um dieses auf Deutsch festzulegen zwie mal de eingeben. Nachdem die Tastatur geändert wurde muss der Hostname festgelegt werden, meine VM heißt einfach docker. In der darauffolgenden Netzwerkkonfiguration muss als erstes der Name des zu konfigurierendes Netzwerkinterfaces angegeben werden (meist eth0) Im darauffolgenden Schritt wird die Methode der IP konfiguration angegeben. Im Folgenden setze ich hier auf DHCP. Nachdem das root Passwort (welches mit einem Passwortgenerator generiert wurde) festgelegt wurde muss die Zeitzone angegeben werden. Für Deutschland ist diese Europe/Berlin. Einen Proxy brauchen wir nicht, genauso wie beim mirror können wir einfach mit enter bestätigen. Der SSH Server kann auch bei openssh belassen werden. Nachdem nun die Grundkonfiguration im Installer abgeschlossen ist, muss noch die Festplatte angegeben werden. Dafür wird eine Liste an erkannten Platten angezeigt. In meinem Fall war dies sda und danach noch der Typ. Dies ist sys, da das System auf die Platte installiert wird. Nach der Installation muss das System nochmal neugestartet werden.

Wenn das System nun von der Festplatte gebootet hat kann man sich mit dem Benutzer root und dem zuvor gewählten Passwort anmelden. Danach muss als erstes das System auf den neuesten Stand gebracht werden und ein paar tool installiert werden. Dazu die beiden unten ausfgeführten Befehle eingeben.

apk update
apk upgrade
apk add nano htop git
Um nun Docker zu installieren muss als erstes die Community repo aktiviert werden. Dazu mit nano die Datei /etc/apk/repositories öffnen und in der Zeile, welche mit community endet das # am Anfang entfernen. (Nicht in den Zeilen mit edge im URL) Danach kann Docker installiert werden.

nano /etc/apk/repositories
apk update
apk add docker docker-compose
rc-update add docker
/etc/init.d/docker start

Nun ist Docker auf unserem System installiert und kann eingesetzt werden. Um Traefik 2 nun einzusetzen muss als erstes meine Vorlage von hier heruntergeladen werden. Danach muss in der Datei config/traefik.yml unter letsencrypt => acme => email die E-Mail Adresse festgelegt werden, welche für letsencrypt verwendet werden soll. Danach noch die Berechtigungen von der Zertifikatsdatei einschränken. Bevor wir traefik starten könenn müssen wir noch ein Netzwerk namens web angelegt werden. Nachdem nun alles vorbereit wurde kann dieser mit docker-compose up gestartet werden.

git clone https://gitlab.jonasled.de/jonasled/traefik-config
cd traefik-config
nano config/traefik.yml
chmod 600 letsencrypt/acme.json
docker network create web
docker-compose up
# Wenn alles läuft strg und c drücken
docker-compose up -d

Traefik ist nun installiert und sollte von außen erreichbar sein. Als Antwort sollte bei nicht bekannten Domains immer ein 404 Fehler kommen. Zum testen setzen wir als nächstes den whoami Docker Container auf, dieser ist nur wenige kb groß und bietet einen minimalen Webserver. Dazu muss als erstes die unten angehängte docker-compose auf dem Host in einem neuen Ordner unter dem Namen docker-compose.yml abspeichern und den Host anpassen. Danach kann der Container mit docker-compose up gestartet werden. Nun sollte nach 1-2 Minuten auf dem zuvor angegebenen Domain die 404 Meldung durch eine Seite ersetzt werden. Falls dies nicht der Fall ist kann im Ordner, in dem der Traefik abgelegt wurde der Befehl docker-compose logs -f ausgeführt werden um den Fehlerlog zu überprüfen.

version: "3.2"
services:
    whoami:
    image: containous/whoami
    restart: unless-stopped
    networks:
        - web
    labels:
        - traefik.http.routers.whoami-https.rule=Host(`whoami.jonasled-test.xyz`)
        - traefik.http.routers.whoami-https.entrypoints=https
        - traefik.http.routers.whoami-https.tls=true
        - traefik.http.routers.whoami-https.tls.certresolver=letsencrypt
        - traefik.http.services.whoami.loadbalancer.server.port=80

networks:
    web:
    external: true

Um die Konfigurationen für den Traefik Server zu erstellen verwende nutze ich ein kleines selber geschriebenes Tool, welches hier erreichbar ist.

Verbesserungen

HTTP auf HTTPS weiterleiten

Ich empfehle diesen Schritt für alle, da dadurch traefik den Nutzer automatisch von einer unverschlüsselten HTTP Verbindung auf eine verschlüsselte HTTPS verbindung weiterleitet. Dies verhindert das mitlesen der Daten durch dritte. Um die Weiterleitung einzurichten muss unter config/providers eine neue Datei mit der Endung .yml angelegt werden. (also z.B. nano config/providers/http.yml) Danach muss in die Datei der unten angeführte Snippet eingefügt werden und danach gescpeichert werden (strg + x und dann mit y und enter bestätigen)

http:
    routers:
      http-redirect:
        rule: HostRegexp(`{any:.+}`)
        middlewares: redirect
        service: dummy
  
    middlewares:
      redirect:
        redirectscheme:
          scheme: https
  
    services:
      dummy:
        loadBalancer:
          servers:
            - url: "http://0.0.0.0/"
          passHostHeader: true

Nicht Docker Services einbinden

Das Einbinden von Diensten, die nicht auf dem Docker Host laufen ist auch ziemlich einfach. Dafür muss nur eine Provider yaml Datei (Dateiendung .yml) im config/providers Ordner mit dem nachfolgenden Inhalt angelegt werden. Um den Router zu nutzen muss servicename und routername durch Namen ersetzt werden. Zusätzlich muss im Router der Hostname und im Service der interne URL zu dem dienst, der von außen erreichbar sein soll gesetzt werden.

http:
    # Add the router
    routers:
      routername:
        service: servicename
        rule: Host(`whoami.jonasled-test.xyz`)
        tls:
          certresolver: letsencrypt
  
    # Add the service
    services:
      servicename:
        loadBalancer:
          servers:
          - url: http://10.0.0.1
          passHostHeader: true