Alles schön verpackt: Meine Docker-Sammlung

Auf meinem Server betreibe ich eine Reihe von Anwendungen für meinen privaten Gebrauch. Nach anfänglicher Lernkurve ist jetzt alles in Docker-Container verpackt. Das hat für mich den Vorteil, dass ich Aktualisierungen sehr leicht einspielen kann und fast alle Nutzdaten auf meinem Server konzentriert unter einem Pfad liegen. Das macht die Datensicherung einfach.

Aktuell betreibe ich:

Die Docker Compose Konfigurationen findest du hier:

https://git.software-berater.net/christian/dockerfiles

Ich versuche, die Konfigurationen gleichförmig aufzubauen, was nicht zuletzt für mich den Merkaufwand reduziert. (Von wegen Kopf wie Sieb und so…) Also

  1. liegen alle Anwendungen in jeweils einem eigenen Unterverzeichnis
  2. verwende ich .env Dateien zur Ablage von vertraulichen Daten wie Passworten oä
  3. verwende ich ein systemd Template um die Anwendungen als Systemdienst zu etablieren

Alle Applikationen verwenden host-interne Ports, zur Benutzung muss als noch ein Reverse-Proxy (zB Nginx) vorgeschaltet werden. Dessen Aufgabe ist dann auch zB. das SSL-Handling, die Konfiguration schaut etwa so aus:

upstream software-berater {
  server 127.0.0.1:8005 fail_timeout=0;
}

server {
  # ...

  # reverse proxy
  location / {
    proxy_pass http://software-berater;
  }
}

Was ist nicht dockerisiert?

  1. Der lokale SMTP/IMAP-Mailserver ist nicht containerisiert. Gerade die SMTP-Binaries werden verwendet, um Nachrichten vom System zu bekommen. Auch wenn es mehr als 1.200 Images für Postfix auf Docker Hub gibt.
  2. Der Frontend-Webserver ist ebenfalls nicht containerisiert. Ich hab das Gefühl, zuviel individuelle Konfigurationen zu verwenden.

Zwei ungelöste Fragen

Zwei Fragen sind für mich aktuell noch offen, die mein Docker-Erlebnis wesentlich beeinflussen könnten.

  1. Die Zuteilung der internen Ports erfolgt im Moment ganz manuell. Ich muss das dann in der Nginx-Konfiguration entsprechend übernehmen. Ein besseres Verfahren könnte https://github.com/jwilder/docker-gen ermöglichen, indem die Ports aus der Docker-Engine ausgelesen und die Nginx-Konfiguration dann dynamisch geschrieben wird.
  2. Bei Aktualisierung der eigenen Anwendungen per Drone CI/CD muss ich anschließend noch einmal den Service neu starten, um das Ergebnis zu übernehmen. Das könnte ich mit dem Drone SSH Plugin automatisieren, indem ich aus der CI-Umgebung per ssh ein Kommando zum Neustarten absetze. Aber schön ist das nicht…