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