IT Hype - Docker

Docker der Hype

Docker der Hype

Und schon wieder gibt es einen neuen Hype in der IT: Docker!

Was? Schon wieder etwas Neues? Das kann auch manchmal ganz schön nerven! Sich ständig in neue Dinge einarbeiten zu müssen... Und so bald man ein wenig Ahnung von der Materie hat, kommt das nächste neue Ding um die Ecke, welches vorgaukelt alle Probleme lösen zu können - und das Spiel geht von vorne los...

Nein! Das ist ja grade das schöne an der IT! Immer gibt es neue Sachen zu entdecken und es wird nie langweilig! Und durch den Einsatz neuer Technologien wird das Arbeiten zum Glück auch ständig effizienter und effektiver. So sind heutzutage auch kleine und mittelgroße Unternehmen problemlos in der Lage, große IT-Landschaften zu betreiben und aufwändige Applikationen zu entwickeln. Dabei kommen eine Vielzahl von Tools und Frameworks zum Einsatz, die Dinge automatisieren, übersichtlicher machen, nebenbei auch noch die Sicherheit erhöhen und ohne die IT heute nicht so unglaublich leistungsfähig wäre. Daher gilt stets: "Stay open-minded!" :-)

Zurück zu Docker: Die Sache ist ernst! Das Thema hypt nun schon seit über 2 Jahren und ist alles andere als eine Eintagsfliege. Alle Großen Cloud-Anbieter unterstützen inzwischen Docker und haben bereits viele Millionen Dollar in die Entwicklung und Unterstützung von Docker gesteckt. Da wir bei der Valiton immer ein wenig die Augen nach neuen Technologien offen halten, haben wir bereits vor gut 1 1/2 Jahren selbst damit angefangen, erste Gehversuche mit Docker zu unternehmen. Und wir waren schnell begeistert!

Doch was ist Docker jetzt eigentlich genau?

Docker ist eine "Container Virtualization Platform". Mit Docker ist es relativ komfortabel möglich, Anwendungen abgeschottet in Containern zu betreiben. Unter einem Container kann man salopp gesagt eine Art "Mittelding zwischen virtueller Maschine und Prozess" verstehen. Genauer gesagt, ist er ein Prozess, der sehr stark abgekapselt auf einem System läuft. Docker nutzt dazu Funktionen des Linux-Kernel, weshalb Docker-Container bis jetzt auch ausschließlich unter Linux laufen. Der Vorteile zu einer herkömmlichen virtuellen Maschine ist, dass der Overhead eines zusätzlich virtualisierten Betriebssystems entfällt. Der Vorteil gegenüber normalen System-Prozessen ist, dass ein Container vollständig in einem abgekapselten speziell für ihn definierten Bereich läuft, was die Sicherheit massiv erhöht. Container-Virtualisierung gibt es nicht erst seit Docker. Bereits im Jahre 2000 erhielt eine ähnliche Technologie namens "Jails" Einzug in FreeBSD. Auch der Linux-Kernel unterstützt seit 2008 Container (LXC) und es gibt noch eine Reihe proprietärer Lösungen auch für Windows. Docker macht die Handhabung und Konfiguration von Containern allerdings extrem leicht und stellt zudem eine Vielzahl von nützlichen Tools bereit. Wie bereits erwähnt: Docker ist also in dem Sinne keine Virtualisierungs-Technologie, sondern eine Plattform.

Docker setzt auf Funktionen des Linux-Kernel auf.

 

An dieser Stelle möchte ich auch gar nicht weiter auf die technischen Einzelheiten von Docker und seine Tools eingehen. Dazu gibt es bereits genügend Seiten im Netz, die dieser Aufgabe bereits mehr als gerecht werden, und von denen ein paar im Folgenden verlinkt sind:

Zunächst einmal die offizielle Webseite zu Docker mit viel Dokumentation: https://www.docker.com

  • Die offizielle Docker Registry, mit einer Vielzahl an vorgefertigten Containern mit allerlei Software, die einfach runtergeladen und angestartet werden können:  https://registry.hub.docker.com
  • Im Fall, dass man selbst kein Linux-Betriebssystem nutzt, eignet sich Boot2Docker, um Container mit Hilfe einer vorgefertigten virtuellen Maschine auch unter Windows oder Mac betreiben zu können: boot2docker.io
  • Und hier noch ein Link zu den Linux-Kernel-Funktionen, die u.A. von Docker für die Abschottung von Prozessen genutzt werden: en.wikipedia.org/wiki/Cgroups

Einsatz von Docker bei der Valiton

Spannender dürfte für den Leser, der Docker vielleicht auch schon kennt, sein, wie wir Docker bei der Valiton einsetzen, welche Probleme wir damit adressieren wollten und was wir durch den Einsatz von Docker verbessern konnten und wo es Probleme gibt.

Vollständige Auflösung von Abhängigkeiten im Container 

Eines der schlagkräftigsten Argumente für Docker ist, dass ein Container, neben der Anwendung selbst, alle Abhängigkeiten, wie bestimmte Version eine Programmiersprache, Programmbibliotheken und sonstige Assets beinhaltet. Ein Container ist damit vollständig eigenständig lauffähig. Einmal gebaut, kann er überall hin transferiert werden und sofort ohne weiteres in einer Docker-Umgebung angestartet werden. Diese Eigenschaft kann man sich auch zu Nutzer machen, wenn man z.B. zwei Applikationen mit unterschiedlichen Anforderungen auf einem Host betreiben werden sollen. Während für die eine Anwendung das Update noch in Arbeit ist und diese noch mit Node.js in der Version 0.10.x läuft, ist eine andere aber bereits mit Version 0.12.6 lauffähig. Nun packt man beide einfach in einen eigenen Container mit der jeweils passenden Node.js-Version. Da die Container vollständig voneinander getrennt sind, treten keinerlei Konflikte auf dem Host-System auf.

Auch lassen sich so ohne Probleme mehrere Datenbanksystem vom gleichen Typ auf einem Host schön getrennt von einander betreiben. So nutzen wir bei der Valiton an vielen stellen MongoDBs für die Benutzerverwaltung. Insbesondere zur Entwicklungszeit werden auf Stage-Systemen die Datenbanken regelmäßig komplett geleert und mit neuen Testdaten befüllt. Getrennte Datenbank-Container sorgen dafür, dass sich die Projekt-Teams gegenseitig nicht bei der Arbeit stören können.

So ist es uns bei der Valiton aktuell möglich, mehrere Staging-Systeme mit unterschiedlichsten Anforderungen in der gleichen Umgebung zu betreiben, was uns auch gleich zum nächsten Punkt bringt.

Bessere Ausnutzung von Cloud-Ressourcen

Wie zahlreiche andere Unternehmen, nutzen auch wir heutzutage zunehmen Cloud-Services, um flexibel und schnell auf Kundenwünsche reagieren zu können. Hier kann es durchaus vorkommen, dass man sich z.B. bei den Anforderungen an eine virtuelle Maschine verschätzt und eine viel zu große Maschine aufsetzt, oder die Load auf einer Maschine geht, warum auch immer, nach kurzer Zeit stark zurück. Der teure Server liegt brach und es freut sich in erster Linie der Cloud-Anbieter, der Geld für nicht genutzte Leistung kassiert. Server downsizen oder Applikationen auf neue Maschinen umziehen ist aber ebenfalls mit Aufwand verbunden. Hier ist es mit Docker viel leichter, erworbene Ressourcen auf Grund der Flexibilität von Containern mit deutlich weniger Planungs- und Verwaltungsaufwand voll auszunutzen.

Vereinheitlichung von Dev-, Test-, Stage- und Prod-Umgebung

Wie bereits erwähnt, ist ein Container - einmal gebaut - überall lauffähig. Da ist natürlich nichts naheliegender, als den gleichen Container für die Dev-, Test-, Stage- und Prod-Umgebung zu verwenden. In einigen unserer Projekte haben wir das auch fast schon so abgebildet. Leider nur fast, es fehlen noch Dev und Prod. Dafür kann sich der Test- und Stage-Teil mehr als sehen lassen. Hier läuft nämlich unter dem Einsatz der Continuous-Integration-Software Jenkins alles voll automatisiert! Sobald Jenkins eine Aktualisierung am Source-Code feststellt, baut er einen neuen Container, lässt in diesem Container einmal alle Tests der Applikation laufen, und tauscht im Erfolgsfall den alten Container auf Stage mit dem eben erstellten aus.

Ein weiterer Anwendungsfall wäre, einem Docker-affinen Kunden seine Applikation zum Testen direkt in einem Container bereit zu stellen. 

Schnelles Anstarten von neuen Maschinen

Docker-Container können im Vergleich zu herkömmlichen virtuellen Maschinen innerhalb von wenigen Sekunden angestartet werden. Unser Ziel ist es, mit Hilfe von Docker viel dynamischer auf schnelle Lastveränderungen bei Produktivsystemen reagieren zu können; ein besonders spannendes Thema im Bereich E-Commerce.

Aktuell sind wir noch damit beschäftigt unsere Standard-Shop-Software in Container zu verpacken, freuen uns jetzt aber schon auf die ersten Testläufe, wenn die Container fertig sind.

Probleme 

Natürlich bringt eine neue Technologie auch wieder neue Anforderungen mit sich, und es tauchen an einigen Stellen Probleme auf, wo es vorher keine gab. Die starke Kapselung von Containern erschwert z.B. die Interprozess-Kommunikation massiv. Aber auch dafür bietet Docker relativ komfortable Lösungen an.

Auch das Erstellen von Containern gestaltet sich oft als schwierig. Container werden Anhand sogenannter Dockerfiles gebaut, in denen der Container definiert und angepasst werden kann. Die Möglichkeiten hier sind im Vergleich zu denen von Chef oder Puppet doch sehr beschränkt.

Fazit

Nichts desto trotz bereitet uns Docker viel Freude, erleichtert uns die Arbeit in vielen Punkten und man kann nach einer gewissen Einarbeitungsphase sehr produktiv damit arbeiten. Unser Ziel ist es, Docker bei vielen weiteren Projekten einzusetzen, um so von den vielen Vorteilen Gebrauch machen zu können. Sehr nützlich ist auch die oben verlinkte Docker-Registry, die eine enorme Vielzahl von vorgefertigten Containern mit Standardsoftware enthält.

Zusammengefasst kann man sagen, Docker hilft uns

  • unsere Cloud-Infrastruktur bei Drittanbietern besser zu nutzen
  • die Stabilität unserer Software zu erhöhen, da Produktivsysteme in einer identischen Umgebung betrieben werden, wie zur Entwicklungszeit
  • den Overhead beim Provisionieren von Servern gering zu halten
  • und damit natürlich letztendlich unsere Kosten zu senken

Eine neue Technologie bringt auch neue Probleme mit sich,

  • so bedarf Docker einer gewissen Einarbeitungszeit
  • bei der Anwendungsentwicklung sind die Einschränkungen von Containern zu beachten
  • und bestehende Software in Container zu verpacken kann aufwendig sein

Ein weiterer wichtiger Schritt für uns in Richtung Docker, dem wir sehr entgegenfiebern, ist, wenn in ein paar Wochen endlich unsere ersten Produktiv-Systeme mit Docker live gehen.


Quick Links