Der Hype Docker

Der Hype Docker

Der Hype Docker

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

Die IT hält ständig neue Trends bereit. Sobald man sich eingearbeitet hat, kommt die nächste Neuheit auf den Markt, welche vorgibt alle Probleme zu lösen – und das Spiel geht von vorne los. Auf den ersten Blick kann das schon manchmal nerven…

Aber das ist ja gerade das Schöne an der IT! Immer wieder gibt es neue Dinge zu entdecken und es bleibt immer spannend. Und durch den Einsatz neuer Technologien wird das Arbeiten auch ständig effizienter und effektiver. So sind heutzutage schon 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 an Tools und Frameworks zum Einsatz, die Prozesse automatisieren, übersichtlicher machen, nebenbei auch noch die Sicherheit erhöhen und ohne die die IT heute nicht so unglaublich leistungsfähig wäre. Daher gilt stets: „Stay open-minded!“

Doch zurück zu Docker. Das Thema hypt nun schon seit über zwei Jahren und ist alles andere als eine Eintagsfliege. Die 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 die Augen nach neuen Technologien offen halten, haben wir bereits vor gut eineinhalb 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 komfortabel möglich, Anwendungen abgeschottet in Containern zu betreiben. Unter einem Container versteht man eine Art „Mittelding“ zwischen virtueller Maschine und Prozess. 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 Vorteil zu einer herkömmlichen virtuellen Maschine ist, dass der Overhead eines zusätzlich virtualisierten Betriebssystems entfällt. Im Vergleich zu normalen System-Prozessen läuft ein Container vollständig in einem abgekapselten, sepziell für ihn definierten Bereich, was die Sicherheit massiv erhöht. Container-Virtualisierung gibt es nicht erst seit Docker. Bereits im Jahre 2000 hielt eine ähnliche Technologie namens „Jails“ Einzug in FreeBSD. Auch der Linux-Kernel unterstützt seit 2008 Container (LXC) und es gibt darüber hinaus eine Reihe proprietärer Lösungen auch für Windows. Docker gestaltet die Handhabung und Konfiguration von Containern allerdings sehr leicht und stellt zudem eine Vielzahl von nützlichen Tools bereit. Wie bereits erwähnt: Docker ist also eine Plattform und keine Virtualisierungstechnologie im eigentlichen Sinne.

Docker setzt auf Funktionen des Linux-Kernel auf

Docker setzt auf Funktionen des Linux-Kernel auf

An dieser Stelle soll nicht näher auf die technischen Einzelheiten von Docker und seine Tools eingegangen werden. Es gibt bereits genügend Seiten im Netz, die dieser Aufgabe mehr als gerecht werden und von denen ein paar im Folgenden aufgezeigt werden:

  • Die offizielle Webseite zu Docker mit viel Dokumentation
  • Die offizielle Docker Registry mit einer Vielzahl an vorgefertigten Containern mit allerlei Software, die einfach heruntergeladen und gestartet werden kann
  • Für den Fall, dass man selbst kein Linux-Betriebssystem nutzt, eignet sich Boot2Docker, um Container mit Hilfe einer vorgefertigten virtuellen Maschine auch unter Windows oder Mac zu betreiben
  • Und hier noch ein Link zu den Linux-Kernel-Funktionen, die u.a. von Docker für die Abschottung von Prozessen genutzt werden

Einsatz von Docker bei der Valiton
Spannender dürfte für den Leser, der Docker vielleicht auch schon kennt, der Einsatz von Docker bei der Valiton sein. Welche Probleme wollten wir damit adressieren? Was konnten wir durch den Einsatz von Docker verbessern? Und wo gibt es noch Probleme?

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 Versionen einer Programmiersprache, Programmbibliotheken und sonstige Assets beinhaltet. Ein Container ist damit eigenständig lauffähig. Einmal gebaut, kann er überall hin transferiert und sofort in einer Docker-Umgebung gestartet werden. Diese Eigenschaft kann man sich auch zunutze machen, wenn z.B. zwei Applikationen mit unterschiedlichen Anforderungen auf einem Host betrieben 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 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 problemlos mehrere Datenbanksysteme vom gleichen Typ auf einem Host getrennt voneinander betreiben. Wir nutzen 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 nicht gegenseitig bei der Arbeit stören. Deshalb ist es uns bei der Valiton aktuell möglich, mehrere Staging-Systeme mit unterschiedlichsten Anforderungen in der gleichen Umgebung zu betreiben.

Bessere Nutzung von Cloud-Ressourcen
Wie zahlreiche andere Unternehmen nutzen auch wir heutzutage zunehmend Cloud-Services, um flexibel und schnell auf Kundenwünsche zu reagieren. Hier kann es durchaus vorkommen, dass man sich z.B. bei den Anforderungen an eine virtuelle Maschine verschätzt und eine zu große Maschine aufsetzt oder die Load auf einer Maschine nach kurzer Zeit stark zurück geht. 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 jedoch ebenfalls mit Aufwand verbunden. Hier ist es mit Docker viel leichter, erworbene Ressourcen aufgrund 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 nahezu so abgebildet. Aber leider nur fast, denn es fehlen noch die Dev- und Prod-Umgebung. 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 der Stage-Umgebung mit dem eben erstellten aus.

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

Schnelles Starten neuer Maschinen
Docker-Container können im Vergleich zu herkömmlichen virtuellen Maschinen innerhalb weniger Sekunden gestartet werden. Unser Ziel ist es, mit Hilfe von Docker viel dynamischer auf schnelle Lastveränderungen bei Produktivsystemen zu reagieren; 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 aber jetzt schon auf die ersten Testläufe, sobald die Container fertiggestellt sind.

Herausforderungen
Natürlich bringt eine neue Technologie immer auch 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.

Zusätzlich gestaltet sich das Erstellen von Containern oft als schwierig. Container werden anhand sogenannter Dockerfiles gebaut, in denen der Container definiert und angepasst werden kann. Die Möglichkeiten hierfür sind im Vergleich zu denen von „Chef“ oder „Puppet“ jedoch sehr beschränkt.

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

Zusammengefasst lässt sich sagen, dass Docker uns hilft

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

Eine neue Technologie bringt auch neue Herausforderungen 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 zeigt sich aufwendig.

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

 

Johannes Stark

Software Engineer, Valiton