Jeder hat bestimmt schon mal von Docker gehört. Laut Wikipedia ist Docker eine Open-Source-Software, mit deren Hilfe Anwendungen mittels Betriebssystem-Virtualisierung in Containern isoliert werden kann. Zweck des Ganzen ist hauptsächlich die vereinfachte Bereitstellung von Anwendungen. Alles klar? Der Nicht-Informatiker wird nun große Augen machen, da das Ganze doch sehr schwammig klingt.

Der folgende Artikel soll daher in einfachen Worten erklären, was Docker eigentlich ist und wofür man es einsetzen kann. Anschließend wird die Installation von Docker Schritt für Schritt auf einem Ubuntu Server erklärt.

Was ist Docker?

Zunächst soll in einfachen Worten erklärt werden, was Docker eigentlich ist. Wer Docker bereits kennt, kann diesen Abschnitt getrost überspringen und direkt zur Installation unter Ubuntu Server springen.

Vereinfacht gesagt, adressiert Docker ein altes Problem der IT: Bei der Programmierung von Software ist man immer mit gewissen Abhängigkeiten konfrontiert. So wird beispielsweise zur Ausführung eines Java-Programms die Java-Laufzeitumgebung benötigt. Ein anderes Beispiel ist PHP: Ohne einen Webserver sind PHP-Skripte nahezu nutzlos. Dem Software-Entwickler sind diese Abhängigkeiten bekannt und er hat seine Entwicklungs-Maschine entsprechend eingerichtet. Wenn die erstellte Software nun an Kollegen oder Kunden verteilt wird, kann es passieren, dass benötigte Module, Laufzeitumgebungen oder Treiber nicht auf jedem System vorhanden sind. Hier müssen die Abhängigkeiten dann mühevoll aufgelöst und die entsprechenden Module/Laufzeitumgebungen/Treiber nachinstalliert werden, was durchaus lästig sein kann.

Eine mögliche Lösung des Problems ist die Virtualisierung von Systemen. Dazu ein Praxisbeispiel: Wer meinen Blog verfolgt, dem ist sicher aufgefallen, dass ich mich auch mit virtualisierten Systemen beschäftige. Artikel wie Ubuntu Server als Hyper-V Gastsystem installieren und optimal einrichten und Nextcloud auf Ubuntu Server mit nginx, MariaDB, PHP, Let’s Encrypt, Redis und Fail2ban lassen erahnen, dass ich eine virtuelle Linux-Maschine unter Windows betreibe, die für das Hosting meiner eigenen Cloud verantwortlich ist. Warum wähle ich diesen vermeintlich umständlichen Weg?
Nextcloud ist eine PHP-Anwendung. Für PHP benötige ich einen Webserver. Unter Windows gibt es im Prinzip nur IIS (ja, es gibt auch Installer für Apache oder nginx, allerdings ist das unter Windows kein Spaß, da diese Server aus dem Linux-Umfeld kommen und nicht wirklich unter Windows zu Hause sind). IIS arbeitet allerdings nur sehr schlecht mit PHP zusammen, was die Nextcloud-Entwickler dazu veranlasst hat, Windows als Server-Plattform nicht zu unterstützen. Also bestehen vereinfacht gesagt folgende Abhängigkeiten: Nextcloud > PHP > Webserver (Apache, nginx, etc.) > Linux. Um die eigenen Cloud zum Laufen zu bekommen, benötige ich also ein Linux-System, welches ich kurzerhand mittels Hyper-V unter Windows virtualisieren kann. Diese virtuelle Maschine dient dann ausschließlich zum Hosten der eigenen Cloud.

Allerdings bedeuten virtuelle Systeme einen erheblichen Aufwand. Siehe dazu folgende Abbildung, die den schematischen Aufbau eines Systems zur Virtualisierung zeugt:

Virtualisierung mittels virtueller Maschinen

Virtualisierung mittels virtueller Maschinen

Direkt auf der Server-Hardware läuft dabei das Host-Betriebssystem. Der sog. Hypervisor sorgt für die Abstraktion der eigentlichen Hardware für virtuelle Systeme. Darauf bauen dann VMs mit ihren jeweiligen Gast-Betriebssystemen auf. Auf diesen Gast-Systemen sind dann alle Abhängigkeiten (Libraries/Binaries) installiert, die die jeweiligen Anwendungen zur Ausführung benötigen.

Vorteil: Die virtuellen Maschinen sind voneinander und vom Host-Betriebssystem getrennt und können unterschiedliche Anwendungsfälle abdecken.

Nachteil: Der Betrieb von (mehreren) virtuellen Maschinen ist ressourcenintensiv. Auch wenn leistungsstarke Hardware zum Einsatz kommt und die VMs auf SSDs laufen, dauert es eine Zeit lang, bis eine virtuelle Maschine gebootet wurde und ihren Aufgaben nachgehen kann. Darüber hinaus ist ein erhöhter administrativer Aufwand notwendig, da neben dem Host-Betriebssystem auch die virtuellen Maschinen getrennt voneinander verwaltet werden müssen (z.B. Versorgung mit Updates).

Docker ist auch eine Art Virtualisierung, dennoch ist der Grundgedanke hier ein anderer: Software mitsamt allen Abhängigkeiten wird hier in einem „Container“ zusammengefasst. Einen Container kann man sich dabei wie eine Zip-Datei vorstellen, in der alles enthalten ist, was zur Ausführung der Software benötigt wird. Allerdings müssen die Inhalte nicht entpackt und installiert werden, sondern der Container kann als Einheit verwendet werden, der seine Aufgaben durch die Ausführung mit Docker einfach erledigen kann.

Folgende Abbildung zeigt schematisch den Einsatz von Containern:

Virtualisierung mittels Containern

Virtualisierung mittels Containern

Wie man sieht, sind hier weniger Komponenten im Einsatz: Es wird beispielsweise kein Hypervisor benötigt, da die Container direkt auf dem Host-Betriebssystem ausgeführt werden. Dies macht auch den Einsatz von Gast-Betriebssystemen überflüssig.

Vorteile: Ein Container ist sehr leichtgewichtig, da dieser direkt auf dem unterliegenden Betriebssystem ausgeführt wird. Lediglich alle Abhängigkeiten und die benötigten Anwendungen selbst sind in den Containern enthalten. Dies macht sich u.a. bemerkbar, dass Container nach dem Start über Docker sofort (innerhalb weniger Sekunden) einsatzbereit sind. Dennoch sind die einzelnen Container voneinander getrennt (Sandboxing).

Das ist eigentlich alles, was sich hinter der „Magie“ hinter Docker verbirgt. Am Ende des theoretischen Teils des Artikels sollen noch einige Begrifflichkeiten aus der Docker-Welt erklärt werden, auch die man immer wieder stoßen wird, wenn man sich mit dem Thema beschäftigt:

  • Image: Ein Image stellt eine Art Template dar. Dieses Template beinhaltet alle Abhängigkeiten der Software, die später ausgeführt werden soll. Dies könnte beispielsweise ein Betriebssystem mitsamt Webserver, PHP und WordPress sein. Ein Image ist vergleichbar mit einem ISO-Image einer DVD.
  • Dockerfile: Ein Dockerfile ist zunächst eine reine Textdatei, die deklarativ beschreibt, was in einem Docker-Image enthalten ist. Mehr Informationen zu Dockerfiles sind in der Dockerfile reference zu finden. Beispiele für Dockerfiles kann man sich in diesem GitHub-Repository ansehen.
  • Container: Ein Container ist eine lauffähige Instanz eines Images, oder besser gesagt ein Image, welches gerade ausgeführt wird. Dies ist vergleichbar mit einer DVD, die aus einem ISO-Image gebrannt wurde und in ein DVD-Laufwerk eingelegt wurde.
  • Docker Hub:  Ein Webdienst, der vorgefertigte Docker-Images enthält. Diese Images können später ganz einfach durch Docker heruntergeladen und ausgeführt werden.

Installation von Docker auf Ubuntu Server

Nun geht es an die Praxis: Die Installation von Docker unter Ubuntu Server. Als Basis dienst hier Ubuntu Server 16.04 LTS.

Docker ist zunächst in zwei Ausprägungen erhältlich: Die kostenlose Community Edition (CE) und die kostenpflichtige Enterprise Edition (EE). Wir beschäftigen uns hier mit der Community Edition.

Wenn alte Versionen von Docker bereits installiert sind, sollten diese zunächst entfernt werden:

Die empfohlene Vorgehensweise ist die Installation aus dem offiziellen Docker-Repositories. Dazu wird das System erst einmal auf den aktuellen Stand gebracht:

Als nächstes werden die Pakete installiert, die für den weiteren Verlauf benötigt werden:

Nun wird der GPG-Key von Docker dem System bekannt gemacht:

Anschließend wird das Docker-Repository für apt-get hinzugefügt. Zu beachten ist hier die Architektur des Systems. Der folgende Befehl fügt das Repository für 64 Bit Systeme hinzu. Wenn eine andere System-Architektur zum Einsatz kommt (z.B. bei einen Raspberry Pi), dann muss hier ein anderes Repository angegeben werden (siehe Get Docker CE for Ubuntu). Wir verwenden hier auch den Stable-Release, damit nur stabile Versionen von Docker zum Einsatz kommen:

Nach dem Hinzufügen des Repositories muss noch ein Update der Paketquellen durchgeführt werden:

Anschließend kann Docker in der Community Edition installiert werden:

Nach diesen Schritten ist Docker einsatzbereit. Testen kann man die Installation durch das Ausführen eines Test-Images, welches lediglich eine Statusmeldung über Docker ausgibt:

Docker ist einsatzbereit

Docker ist einsatzbereit

An dieser Stelle noch ein Hinweis: Wenn Docker Images heruntergeladen und ausgeführt werden, findet man diese im Verzeichnis /var/lib/docker. Auch wenn Docker später wieder deinstalliert werden sollte, bleiben auf dem System bereit gestellte Container in diesem Verzeichnis bestehen.

Fazit

In diesem Artikel wurden zunächst einmal die Grundlagen von Docker ermittelt. Anschließend wurde gezeigt, wie man Docker mit wenigen Schritten unter Ubuntu Server installieren kann.

Nach der Docker-Installation kann das System nun eingesetzt werden. In einem bald folgenden Artikel wird ein praktisches Beispiel folgen, wie Docker verwendet werden kann, um Nextcloud um sinnvolle Funktionen zu erweitern (Stichwort: Collabora).