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

## Kommentare: