| OVFACTS |

DIE CONTAINERTECHNOLOGIE DOCKER: THEORIE UND PRAXIS

FRAGEN ZU DOCKER? SPRECHEN SIE UNS AN!
| OVFACTS |

DIE CONTAINER-
TECHNOLOGIE DOCKER: THEORIE UND PRAXIS

FRAGEN ZU DOCKER? SPRECHEN SIE UNS AN!

SOFTWARE IN CONTAINERN MIT DOCKER

Die Idee ist eigentlich ganz einfach. Wie bei einer App wird eine Anwendung zusammen mit allen notwendigen Ressourcen in ein Paket, den sogenannten “Container”, gepackt. Anders als bei einer VM fehlt jedoch das Betriebssystem. Eine der am weitesten verbreiteten Container Engines ist „Docker“.

Bei der Entwicklung und dem Betrieb einer Web-Anwendung sind viele verschiedene Aufgaben von den beteiligten Entwicklern und Administratoren zu bewerkstelligen. Diese betreffen die unterschiedlichsten Bereiche. Sehr zentral – und oft auch komplex – ist dabei die Einrichtung und Konfiguration des zugrunde liegenden Host-Systems. Hier muss im Rahmen der Konfiguration alles bereitgestellt werden, was für den Betrieb der Anwendung notwendig ist. Hinzu kommen oftmals jene Ansprüche an das Host-System, die über den einfachen Betrieb der Anwendung hinausgehen. Unter anderem soll die Anwendung natürlich möglichst effizient laufen. Sie soll gleichzeitig transparent sein mit einer nachvollziehbaren Konfiguration.

Betrifft die Einrichtung dann nicht nur ein System sondern mehrere, zum Beispiel ein oder zwei Produktivsysteme und ein zusätzliches Testsystem, dann stellen sich Entwickler und Administratoren zu Recht die Frage nach einer einfacheren Lösung. Die Antwort darauf lautet: Die gibt es, und zwar in Form der Software Docker.

Docker erlaubt es, Anwendungen durch sogenannte „Container“ in einzelne und größtenteils voneinander unabhängige Pakete aufzuteilen. Die eingesetzten Container sind dabei eine Form der Virtualisierung, die auch dazu dienen soll, möglichst ressourceneffizient zu arbeiten. Mit Hilfe von Containern ist es zudem möglich, eine Anwendung leicht von einem System zum nächsten zu transportieren.

 

WAS IST DOCKER?

Docker ist ein Open Source Projekt, welches erstmals im Jahr 2013 für Linux zur Verfügung gestellt wurde. Dabei wurde die initiale Version durch die gleichnamige Docker Inc. entwickelt. Auch heute liegt noch ein Großteil der Weiterentwicklung von Docker bei Docker Inc. Das Projekt an sich ist jedoch weiterhin Open Source und erlaubt somit jedem die Mitarbeit.

In seiner initialen Version nutzte Docker die bereits damals vorhandene LXC-Technologie des Linux-Kernels, um mehrere virtualisierte Instanzen (Container) zu starten. Nach kurzer Zeit entschied man sich jedoch dazu, ein eigenes Verfahren zur Virtualisierung auf Basis der Programmiersprache Go zu entwickeln, welches ab diesem Zeitpunkt stetig weiterentwickelt wurde. Auch der Support für weitere Betriebssysteme wurde im Laufe der Jahre immer weiter ausgebaut, sodass mittlerweile Docker Versionen für Windows und Mac OS verfügbar sind.

Ziel von Docker ist es, Anwendungen in sinnvolle und voneinander unabhängige Teile aufzuspalten. Diese kleineren Anwendungsteile – Container – sind im Gegensatz zu einer einzelnen großen Anwendung leichter zu transportieren und zu konfigurieren. Sie lassen sich zudem getrennt voneinander ausführen, transportieren, updaten oder anpassen.

DIE BASICS

Wie bereits erwähnt handelt es sich bei Docker um eine Software, mit der Anwendungen virtualisiert aufgeteilt werden. Die einzelnen Teile lassen sich anschließend getrennt voneinander ausführen, verschieben, updaten oder anpassen. Ziel dieser Vorgehensweise ist es, Anwendungen in sinnvolle und voneinander unabhängige Teile aufzuspalten. Diese kleineren Anwendungsteile – Container – sind im Gegensatz zu einer einzelnen großen Anwendung wesentlich leichter zu transportieren und zu konfigurieren.

Aber wie teilt man mit Docker eine Anwendung in einzelne, möglichst voneinander unabhängige Teile auf? Dafür ist es wichtig, zunächst einmal die wichtigsten Begriffe und Werkzeuge Dockers zu kennen und zu verstehen.

/ IMAGE

Docker Images sind Dateien, die alles beinhalten, was für die Ausführung einer zu kapselnden Anwendung bzw. eines Anwendungsteils benötigt wird. Das können unter anderem Laufzeitumgebungen, Umgebungsvariablen, zusätzliche Softwaretools oder auch die kompilierte Form der Anwendung oder des Anwendungsteils selber sein. Im Internet sind auf der Plattform „Docker Hub“ (https://hub.docker.com/) bereits eine Vielzahl von vorgefertigten Docker Images vorhanden, die die gängigsten Softwarevoraussetzungen erfüllen. Diese Images lassen sich direkt nutzen und leicht für einen bestimmten Zweck erweitern. Docker Inc. bietet darüber hinaus auf Docker Hub ein Zertifizierungsprogramm an, über das verifizierte Publisher ihre kommerziellen Produkte in Docker Image Form vertreiben können.

/ CONTAINER

Im Grunde handelt es sich bei einem Container um einen auf einem Docker Image basierende Prozess auf dem Host-System. Im Gegensatz zu normalen Prozessen werden die Prozesse in Docker jedoch abgeschirmt vom restlichen System gestartet. So nutzt jeder Prozess ein eigenes Dateisystem. Zudem kann aus dem Container heraus nicht ohne Weiteres auf das Host-System zugegriffen werden. Der Container wird automatisch beendet, sobald er alle im Docker Image definierten Aufgaben erledigt hat.

/ DOCKERFILE

Zur Definition von Images werden sogenannte Dockerfiles erstellt. Ein Dockerfile ist eine Text-Datei, die einer bestimmten Syntax folgt. Die Datei definiert hierbei, welche Bestandteile das fertige Image enthalten soll. So kann ein Dockerfile beispielsweise den Download und die Installation eines bestimmten Betriebssystems enthalten und darüber hinaus anschließend noch ausgewählte Umgebungsvariablen setzen. Alle Container, die auf Basis dieses Images gestartet werden, haben Zugriff auf die definierten Ressourcen.

/ VOLUME

Dateien, die im Dateisystem eines Containers abgelegt werden, sind stets vom Status des Containers abhängig. Sie sind also nur verfügbar, wenn der Container gerade läuft und werden gelöscht, wenn der Container gelöscht wird. Damit Dateien über den Lebenszyklus eines Containers hinaus persistent abgespeichert werden können und ihre Verfügbarkeit gewährleistet ist, gibt es sogenannte Volumes. Wurde ein Volume für einen Container definiert, so können Dateien aus dem Container in das Volume abgespeichert oder Dateien im Volume vom Container ausgelesen werden. Ein Volume kann dabei von mehreren Containern gleichzeitig genutzt werden.

/ NETWORK

Betreibt man eine Anwendung, die auf mehrere Container verteilt wurde, so müssen diese Container in der Regel miteinander kommunizieren können. Hierzu kann ein Docker Network definiert werden. Das Docker Network wird lokal im Docker-Kontext bereitgestellt und erlaubt das Anbinden von Containern. Alle Container, die in das Network eingebunden wurden, können anschließend miteinander kommunizieren.

/ DOCKER COMPOSE

Docker Compose ist ein Werkzeug, mit dessen Hilfe sich Multi-Container- Anwendungen definieren und verwalten lassen. Im Rahmen von Docker Compose werden sogenannte YAML-Dateien erzeugt. In diesen wird definiert, welche Container – hier auch „Services“ genannt – die Anwendung insgesamt umfasst. Das können beispielsweise das zu nutzende Image oder Docker Network sein oder auch die Information, welche Ports freizugeben sind. Die Eigenschaften jedes Containers/Service sind dabei einzeln konfigurierbar. Mit Docker Compose lässt sich anschließend die in der YAML-Datei definierte Anwendung starten und damit auch alle im Rahmen der vorgegebenen Konfiguration angegeben Container.

Mithilfe der hier genannten Strukturen und Tools lassen sich typische Webanwendungen, die bspw. aus einer Datenbank, einem Frontend und einer API bestehen, auf mehrere Container verteilen.

WARUM DOCKER?

Die Nutzung von Docker bietet Entwicklern und Administratoren viele Vorteile gegenüber einer nicht containerisierten Anwendung, zum Beispiel im Hinblick auf Portierbarkeit, Sicherheit, Transparenz, Updates sowie Lizenz und Kosten.

/ PORTIERBARKEIT

Eine mit Docker betriebene Anwendung lässt sich leicht von einem Server zum nächsten portieren oder auf mehrere Systeme ausrollen. So wird alles, was für die Ausführung der Anwendung notwendig ist, durch die Images und Container bereitgestellt. In den meisten Fällen bedeutet dies, dass auf einem neuen System lediglich Docker installiert, die Images aus einer Registry (bspw. Docker Hub) heruntergeladen und die Container gestartet werden müssen. Bei Anwendungen, die mehrere Systeme benötigen, werden Betrieb und Wartung mit Docker deutlich erleichtert. Alle Systeme nutzen die gleiche Docker Konfiguration und die Anwendung kann leicht von einem System zu anderen geschoben werden. Durch Plattformen wie Kubernetes ermöglicht Docker auch meist einen leichten Umzug in die Cloud.

/ SICHERHEIT

Durch das Konzept der standardmäßig stark restriktiven Container bietet die Nutzung von Docker auch im Rahmen von Sicherheitsaspekten zusätzliche Vorteile. Sollte es beispielsweise einem Angreifer gelingen, Zugriff auf einen Container zu erlangen, dann verhindert die Trennung von Container und Host-System, dass der Angreifer auf das letztere zugreifen kann. In der Regel ist der Schaden, den der Angreifer schlimmstenfalls anrichten kann, so auf den übernommenen Container begrenzt.

/ TRANSPARENZ

Die Aufteilung der zentralen Teile einer Anwendung auf einzelne Container sorgt in mehrfacher Hinsicht für eine verbesserte Transparenz. Durch die Konfiguration von Images mit Hilfe von Dockerfiles lässt sich zum einen direkt aus den Konfigurationsdateien erkennen, welche Komponenten und Einstellungen für die Ausführung des jeweiligen Anwendungsteils benötigt werden. Auf eine zusätzliche Dokumentation zur Infrastruktur kann damit meist verzichtet werden. Zum anderen ermöglicht es Docker, den Status einzelner Container und so auch einzelner Anwendungsteile einzusehen und zu überwachen. Dies führt dazu, dass bei ggf. auftretenden Problemen direkt der passende Container analysiert werden kann.

/ UPDATES

Über Docker betriebene Anwendungsteile lassen sich zudem meist leicht updaten. Updates werden per Dockerfile in die jeweiligen Images übernommen und sind gezielt für einzelne Images/Container durchführbar. Dabei können Updates zunächst ohne Auswirkungen auf das Produktivsystem intensiv getestet und geprüft werden. Vor einem Update auf der Produktivumgebung werden dazu die betroffenen Container einer Anwendung lokal oder auf einem Testsystem upgedatet und auf mögliche Probleme untersucht. Da die Container im Rahmen der Testumgebung genauso konfiguriert sind wie jene auf der Produktivumgebung, erfolgen Überprüfung und Test der Updates unter den gleichen Voraussetzungen, aber ohne Nebenwirkungen für das Produktivsystem.

/ LIZENZ/KOSTEN

Die Nutzung von Docker ist grundsätzlich kostenlos. Alle in diesem Artikel beschriebenen Funktionalitäten sowie ein Großteil von Docker sind im Rahmen einer Community Edition ohne weitere Lizenzkosten nutzbar. Lediglich die Nutzung der Docker Enterprise Edition (https://www.docker.com/products/docker-enterprise) setzt den Kauf einer Lizenz voraus. Sie ist insbesondere für Teams und Unternehmen interessant, die den offiziellen Docker Support in Anspruch nehmen wollen, der in der frei verfügbaren Community-Variante nicht enthalten ist. Als weitere Vorzüge bietet die Enterprise Edition außerdem das Container Management via User-Interface (Universal Control Plane), Security-Scans für Images sowie eine private Image Registry.

OVS PROJEKT-ERFAHRUNGEN MIT DOCKER

Bei der OVSoftware GmbH wird Docker mittlerweile seit mehreren Jahren eingesetzt. Im ersten Projekt, welches zu Docker migriert wurde, haben vor allem

  • die komplexe Projektstruktur,
  • die vielen dazugehörigen Einzelkomponenten und
  • eine lückenhafte Dokumentation
 

dazu geführt, dass die Systeme und die Anwendung selbst schwierig zu warten waren. Aufgrund eines anstehenden Server-Umzugs entschloss sich das OVS Entwickler-Team, die Konfiguration noch einmal vollständig zu überarbeiten. Bei der Suche nach einem geeigneten Werkzeug fiel die Wahl auf Docker.

Bereits nach kurzer Einarbeitungszeit wurden die ersten Teile der Anwendung auf Docker umgezogen und die ersten Container definiert. Relativ schnell erkannten die beteiligten Entwickler, wie einfach sich die Anwendung mit Hilfe von Docker auf mehrere Systeme ausrollen ließ. Grund dafür war die Tatsache, dass Container und Images größtenteils unabhängig vom darunterliegenden System betrieben werden konnten und dabei alle auf die gleiche Konfiguration zurückzuführen waren.

Abgesehen von der gesteigerten Portabilität der Anwendung trat auch ein anderer bereits erläuterter Vorteil Dockers schnell zu Tage – die gesteigerte Transparenz. Durch die Nutzung von Dockerfiles sowie YAML-Dateien in Verbindung mit Docker Compose wurden die ehemals bestehenden Lücken in der Dokumentation geschlossen. Vielmehr noch: Die Dockerfiles sowie YAML-Dateien waren so selbsterklärend, dass keine weitere Dokumentation der Infrastruktur in anderer Form mehr notwendig war. Auch gab es nun aufgrund der neuen Konfigurationsdateien eine zentrale Anlaufstelle für mögliche Konfigurationsfehler. Im weiteren Projektverlauf wurde das Docker-Wissen vertieft und weitere Vorteile der neuen Docker-Struktur herausgearbeitet.

Ein Vorteil lag beispielsweise in der Verbesserung der sogenannten „time to market“, also der Zeit, die zum Bereitstellen neuer Programmversionen auf den Test- und Produktivservern benötigt wird. Dies konnte mithilfe einer internen Docker Registry in Verbindung mit einer Jenkins Build-Pipeline erreicht werden, sodass stets die neuesten Docker Images inklusive des aktuellen Entwicklungsstands in die Registry hochgeladen wurden. Auf den Servern mussten nun für ein Deployment lediglich die neuesten Images aus der Registry geladen und anschließend die Docker Container neu gestartet werden. Damit gehörten auch aufwändige Deployments der Vergangenheit an.

Neben der Umstellung der Test- sowie Produktivsysteme auf Docker wurden letztlich auch die lokalen Entwicklungsumgebungen der Entwickler auf Docker umgestellt. So erfolgte der Betrieb der Anwendung dort nun mit der gleichen Konfiguration wie auf dem Produktivsystem. Fehler konnten schneller gefunden werden, da bestimmte Fehlerursachen aufgrund von unterschiedlichen Konfigurationen bereits ausgeschlossen waren.

Nach den durchweg positiven Erfahrungen in diesem ersten Projekt wurden nach und nach auch andere Projekte auf Docker umgestellt. Mittlerweile ist Docker zu einem festen Bestandteil unserer Infrastruktur geworden, sodass neue Projekte meist direkt auf Basis Dockers gestartet werden. Auch im Rahmen einer Reihe von Vorträgen, die Andreas Haack als OVSoftware Entwickler und Docker Enthusiast 2019 beispielsweise im Digital Hub münsterLand oder an der Fachhochschule Münster gehalten hat, stieß das Thema auf großes Interesse.

Genossenschaftsverband

BANKENPORTAL VR-WORKS

Agiles Docker-Projekt zur Weiterentwicklung eines Marketingportals für bessere Performance und mobile Nutzbarkeit.

LOHNT SICH DER EINSATZ VON DOCKER?

Allgemeingültig lässt sich diese Frage nicht beantworten. Ob sich die Einführung einer neuen Technologie wie Docker in den alltäglichen Arbeitsprozess lohnt, muss jedes Team oder Unternehmen vor dem Hintergrund des jeweiligen Projekts für sich entscheiden. Selbstverständlich ist die Einführung von Docker zu Beginn mit einer gewissen Einarbeitungszeit verbunden. Auch müssen bestehende Anwendungen, Konfigurationen und Systeme auf Docker umgestellt werden.

Sobald jedoch die ersten Schritte gemacht wurden und die ersten Container einer Anwendung laufen, sollten die vielen positiven Aspekte von Docker schnell sichtbar werden.  Vorher teilweise komplexe Arbeitsschritte gehen schneller von der Hand gehen. Anhand der bisherigen Erfahrungen mit Docker bei OVSoftware können wir deshalb für uns das Fazit ziehen: 

Ja, Docker lohnt sich!

HABEN SIE FRAGEN?
BRAUCHEN SIE BERATUNG ODER UNTERSTÜTZUNG?

Wir helfen gern!