Docker

Docker ist eine gute Wahl um Anwendungen auf einem NAS zu deployen und zu betreiben. Dieser Artikel erklärt was es ist und warum es so praktisch ist.

Was ist Docker?

Docker ist eine freie Software zur Isolierung von Anwendungen auf Basis einer Containervirtualisierung. Man kann IT-Systeme, Applikationen und Programmiersprachen auf verschiedene Weisen virtualisieren. Virtuelle Maschinen auf Basis von VMWare vSphere sind eine Möglichkeit, die einen kompletten Rechner virtualisieren. Die Java Virtual Machine (VM) dagegen virtualisiert nur die Ausführungsumgebung von Java Programmen. Ganz grob ausgedrückt liegt die Containervirtualisierung hier dazwischen.

Containervirtualisierung mit Docker
Die Virtualisierung mit Docker ist leichtgewichtiger als eine echte virtuelle Maschine aber etwas schwerer als die VM einer Programmierumgebung

Containervirtualisierung

Das System der Containervirtualisierung “verpackt” Software in Container. Dies sind standardisierte Entitäten, die alles beinhalten, was zum Ausführen einer Applikation notwendig ist. Sie umfassen alle Bibliotheken, Systemwerkzeuge, den Code der Anwendung sowie die Laufzeitumgebung. Auf diese Weise in Container verpackte Software kann auf jeder Plattform, die ebenfalls Docker unterstützt, bereitgestellt und betrieben werden. Anders als eine zip-Datei, die ebenfalls alle diese Dinge enthalten kann, kann ein Container auf einer entsprechenden Umgebung direkt ausgeführt werden. Im Gegenteil zu einer virtuellen Maschine, ist der Umfang eines Containers viel geringer, weil er auf das Betriebssystem aufsetzt und es nicht selbst mitbringt.

Container vs. VMs
Ebenen der Virtualisierung bei Containern und virtuellen Maschinen.

Registry, Images und Container

Im Umfeld der Containervirtualisierung ist immer wieder von der Registry (deutsch: Registrierung), den Images (deutsch: Abbildern) und den Containern die Rede. Was hat es damit auf sich?

  • Ein Image, bzw. Abbild ist “die Bauanleitung” eines Containers. Das Image wird beschrieben durch das Dockerfile. Dieses Dockerfile enthält alle Anweisungen, die notwendig sind, um einen Docker Container zu bauen.
  • Ein Container ist eine laufende Software, die auf Basis der Beschreibung im Image ausgeführt wird. Dabei ist es absolut üblich, dass mehrere Container mit demselben Image starten. Werden in einem Rechenzentrum zum Beispiel mehrere Webserver benötigt, so starten mehrere Container mit dem Image des Webservers. Durch Umgebungsvariablen werden die einzelnen Container konfiguriert. Auf diese Weise teilen sich beispielsweise mehrere Container dieselbe Datenbank.
  • Die Registry ist ein Verzeichnis von Images. Größere Firmen betreiben eigene Registries für die Images des eigenen Bedarfs. Die größte Registry ist jedoch Docker Hub. Im Hub liegen tausende vorkonfigurierte Images, die oft frei verwendet werden können.
Registry - Image - Container
Das Bild zeigt die Beziehungen von Registry, Image und Container im Docker Ökosystem

Warum ist es so praktisch?

Möchte man auf einem NAS eine Anwendung installieren (z.B. Nextcloud, PiHole oder ähnliches), dann funktioniert das auf jedem NAS anders. Bei einem NAS von Synology oder QNAP gibt es vorgefertigte Pakete, die aber nicht immer aktuell sind und nicht immer gewartet werden. Bei einem Selbstbau-NAS mit einem einfachen Linux muss man alles von Hand einrichten (Datenbanken, Webserver, etc.). Weiterhin gibt es verschiedene Anwendungen nicht für alle NAS Plattformen.

In diesem Punkt kommt jetzt Docker ins Spiel: Die Container laufen auf jeder Plattform, die die Docker Engine unterstützt. Das sind Linux, Windows 10 und macOS (auf Intel). Daher kann man auf einem NAS, das Docker Container unterstützt, auch nahezu alle Images aus dem Hub laden und ausführen. Dies erweitert das Anwendungsspektrum eines NAS erheblich: Immerhin sind auf dem Docker Hub über 100.000 Container Images verfügbar. Das schließt selbstgebastelte Images genauso ein, wie die offiziellen Images für zum Beispiel den nginx, die mongoDB, alpine Linux, MariaDB oder Ubuntu. Es gibt einzelne Komponenten als Image, wie die genannten Datenbanken und Webserver, aber es sind auch komplette Anwendungen verfügbar. Zum Beispiel WordPress, Solr, Joomla oder das eingangs schon erwähnte Nextcloud.

Alles wird über dieselbe Engine ausgeführt. Hat man also einmal verstanden wie Docker funktioniert, öffnet man sich eine sehr große, flexible Welt der Anwendungen auf einem NAS!

Was benötigt man dafür?

Wie oben beschrieben ist die Containertechnologie eine dünne Schicht über dem eigentlichen Betriebssystem. Die Systemanforderungen sind also im Vergleich zu echten virtuellen Maschinen viel geringer. Als absolutes Minimum kann man 2 GByte RAM annehmen. Damit sind aber keine großen Sprünge und nur einzelne Container möglich. Ich würde empfehlen, ein NAS mit mindestens 8GBye RAM auszustatten um die Software sinnvoll nutzen zu können. Der Container-Dauerläufer in meinem Netzwerk ist eine Synology Diskstation DS216+II, die ich von 2 auf 8 GByte RAM aufgerüstet habe. Damit läuft alles problemlos. Bei einem Selbstbau-NAS ist es natürlich noch einfacher, mehr RAM einzubauen.