Docker im Hinblick auf DevOps

Definition DevOps

Für die Definition des Begriffs DevOps werden unterschiedliche Definitionen benannt, die jedoch selbe Ziele verfolgen. DevOps beschreibt prinzipiell den Ansatz der Zusammenführung zweier Begrifflichkeit bzw. Abteilungen, die innerhalb der zunehmenden Vernetzung in prozessgetriebenen Unternehmen immer mehr verschmelzen. Dieser setzt sich aus der Softwareentwicklung (dem Development) und der Systemadministration (den Operations) zusammen. Hintergrund ist die steigende Notwendigkeit, den immer kürzer werdenden Entwicklungszyklen innerhalb der Softwareentwicklung bei gleichzeitiger Erhaltung des Qualitätsstandards gerecht zu werden.[3]

DevOps wird häufig in Zusammenhang mit agiler Softwareentwicklung gebracht, die einen Wandel innerhalb der Art und Weise der Software Entwicklung darstellt. Der Begriff beschreibt jedoch auch Veränderungen innerhalb der Unternehmenskultur sowie der Rollenverteilung bzw. den Deployment Chains, die durch diesen Ansatz resultieren [4].
Mit Deployment Chains wird ein Deploymentzyklus beschrieben, der alle notwendigen Schritte von der Anforderungsdefinition bis hin zum Deployment in das Produktivsystem beinhaltet.

Der entstehende Zielkonflikt innerhalb der Zusammenführung beider Abteilungen wurde vom belgischen Systemadministrator Patrick Debois erkannt, der durch grundlegende Ansätze und Maßnahmen den Grundstein für die 2009 erstmalig stattfindende DevOpsDays-Konferenz in Ghent legte. Hier wurden grundlegende Anregungen erstmalig öffentlich geäußert.

Zusammenfassend versucht der Ansatz von DevOps, entstehende Zielkonflikte innerhalb der Zusammenführung von Entwicklung (Development) und Administration (Operations) zu lösen, und stellt hierfür Anregungen und Tools zur Verfügung.

Ziele von DevOps:

  • effektivere Zusammenarbeit zwischen Development, Operations und dem Qualitätsmanagement
  • Erhöhung der Softwarequalität, durch Nutzung von Dev-Ops Tools wie z.B. Docker oder Vagrant, oder auch automatisierter Tests (Erfüllung hoher Sicherheitsstandards, Funktionalität und Usability) [7]
  • Erhöhung der Geschwindigkeit innerhalb der Entwicklung, begünstig durch Tools wie z.B. Docker, sowie automatisierte Build und Deployment-Prozesse durch z.B. Jenkins
    • Basic Development (Deployment von Neu-Code)
    • Deploying Code in Production [8]
  • Minimieren der Komplexität innerhalb des Deployments und der Builds durch bereits definierte DevOps-Tools [9]
Bild:DevOps life cycle processes small.png

Abb. 1 Prozesse innerhalb des DevOps Lebenszyklus

 

Definition Docker

Docker wurde erstmalig im März 2013 im Hause dotCloud veröffentlicht. Docker macht es möglich, Anwendungen in Containern zu betreiben und damit voneinander zu kapseln.
Während dies grundsätzlich auch mit jeder beliebigen Virtualisierungstechnologie (VMWare, KVM, Hyper-V) möglich ist, so bringt Docker entscheidende Vorteile mit.

Virtualisierungen in Virtual Machines (VMs) haben grundsätzlich den Nachteil, dass jede VM auch ein eigenes Gastbetriebssystem mitbringt, was neben erhöhtem CPU und Arbeitsspeicher-Verbrauch in einem großen Image resultiert. Es ist daher nicht so einfach, eine VM mit jemandem zu teilen.

 

 

Abb. 2 Funktionsweise VM

Abb. 2 Funktionsweise VM

 

 

 

 

 

 

Dieses Problem löst Docker dadurch, dass sich alle Container einen Kernel teilen und daher lediglich die Anwendung Teil des Containers ist.

 

 

Abb. 3 Funktionsweise Docker

Abb. 3 Funktionsweise Docker

 

 

 

 

 

 

 

Grundkonzept Docker

“Docker is an open platform for developing, shipping, and running applications” [10]

Docker ermöglicht es nun, die eigentliche Applikation von der Infrastruktur zu separieren und diese wie eine Managed Application zu behandeln. Das eigentliche DevOps Ziel, schnellere Entwicklungszyklen zu ermöglichen, wird durch Docker ermöglicht. Durch den definierten Einsatzzweck den Code schneller zu delivern, ermöglicht es ein schnelleres, automatisiertes Testing, ein schnelleres deployment und verkürzt somit den Zyklus zwischen der Entwicklung und Implementierung im Produktivsystem.[11]

 

Ein weiteres Ziel Dockers ist es, eine Plattform zu schaffen, die es ermöglicht, in einer einheitlichen Entwicklungsumgebung, unabhängig vom verwendeten Endsystem, zu arbeiten. Dies verringert die umgebungsbedingte Fehleranfälligkeit beim deploy in Produktivsysteme, sowie die Einarbeitungszeit neuer Entwickler. Somit wird eine einheitliche Umgebung für alle beteiligten geschaffen, deren Wartung und Weiterentwicklung zentralisiert erfolgt.[11]

Des Weiteren soll der Austausch zwischen bereits fertiggestellten Teilapplikationen gefördert werden. Diese fertigen Container können über Docker Hub geteilt werden. Hierzu wird zunächst ein Image erzeugt, dass wiederum zur Verteilung bereitgestellt wird. Dies ermöglicht es, Ressourcen wiederzuverwenden und den Austausch einmalig erzeugter Container zu fördern. [11]

 

Lösungskonzepte zu Skalierbarkeit, Sicherheit, Employee Onboarding und Plattform-unabhängigkeit

 

Docker zielt darauf ab, vorgehend im Detail erläuterte Probleme durch einen „Build – Ship – Run“-Approach zu lösen, und dadurch vor allem das Risiko sowie den Arbeitsaufwand von Deployments zu verringern [24].

Ein wichtiger Kern von Docker basiert darauf, dass Container sich nicht selbst verändern, und damit stateless sind. Daten, die in einer bestimmten Session generiert werden und für den Betrieb notwendig sind (zB. der Upload eines Fotos) dürfen nicht direkt im Container gespeichert werden[25]. Dies hat den Vorteil, dass Container jederzeit zerstört und neu erstellt werden können, ohne dass Laufzeitänderungen verloren gehen.

Sollte es notwendig sein, bestimmte Daten sessionübergreifend zu speichern, so sollten Data Volumes genutzt werden[25].

Einige der Lösungskonzepte, die durch Funktionalitäten und Tools von Docker abgedeckt werden, sind im folgenden durch die Verwendung von Beispielen in alltäglichen Szenarien näher dargestellt bzw. erläutert, um den Einsatzzweck bzw. die Notwendigkeit darzustellen.

 

Skalierbarkeit

1 Szenario

Die Firma Moebel123 GmbH ist der Möbelbranche tätig und betreibt einen Webshop zum Verkauf ihrer Möbel im Internet. Als Software wird ein bekanntes Shopsystem verwendet und als Produktivserver werden zwei Linuxserver, mit einem LoadBalancer zur Lastverteilung, genutzt. In letzter Zeit schaltet Firma Moebel123 Werbung im Fernsehen und die Besucherzahlen ihres Webshop steigen kurzzeitig in beachtliche Höhen. Die Besucherzahlen steigen teilweise auch so außergewöhnlich hoch, dass die zwei Linuxserver die Zugriffe nicht bearbeiten können und es zu ausbleibenden Responses kommt. Der IT Betrieb will reagiert auf diese Gegebenheit der Werbeschaltungen und hängt kurzfristig neue Server an das System. Dadurch wird eine höhere Rechnerleistung gewährleistet, was die gleichzeitige Bearbeitung mehrerer Besucher ermöglicht. Um Serverkosten zu sparen, soll der Betriebszeitraum jedoch so gering wie möglich gehalten werden. Das Problem dabei ist, dass bei jeder Werbeschaltung mindestens ein Mitarbeiter einen oder mehrere Server konfigurieren, mit an das Netz hängt und somit einen hohen personellen Aufwand verursacht.

1 Lösung

Innerhalb dieses Szenarios können mit der Nutzung eines Loadbalancers und Docker die verfügbaren Resourcen kurzfristig erhöht werden. Ein weiteren Vorteil kann ein Verwaltungssystem bieten, indem es bei einer hohen Auslastung die Docker-Maschinen automatisch startet (zum Beispiel bei einer Auslastung von 80%) und nach Abfall der Besucherzahlen wieder stoppt. Der personelle Aufwand entfällt komplett, da lediglich weitere Container gestartet werden müssen.

Da jeder Container nach dem Docker-Prinzip „immutable“, also unveränderbar, sein sollte, ist sog. Autoscaling relativ einfach zu realisieren, da beim Skalieren, abgesehen von dem sich auf der Registry befindlichen Image, keine weiteren laufzeitgenerierten Daten übertragen werden müssen. Es müssen lediglich ein Loadbalancer, sowie ein Verwaltungssystem eingesetzt werden. Der Loadbalancer reicht den Traffic an X Instanzen weiter, während das Verwaltungssystem die Last auf den einzelnen Docker-Maschinen überwacht und dann je nach Auslastung der Instanzen Container startet oder stoppt.

Zur Registrierung der Worker-Instanzen am Load-Balancer gibt es verschiedene Service-Registration Ansätze:

Entweder der Container registriert sich beim Start vollautomatisch am Load Balancer und steht ihm damit zur Verfügung (und de-registriert sich beim Stop), oder aber die Registrierung wird von der Verwaltungsinstanz übernommen, welche den Start des Containers initiiert.

Des weiteren existieren sogenannte Container Clouds die, begünstigt durch den Einsatz von Docker Swarm, einfach zu implementieren sind. Zahlreiche große Anbieter bieten zur einfacheren Verwendung solche Container Clouds, darunter sind, unteranderem:

  • AWS Elastic Container Cloud
  • Google Container Engine
  • Carina by Rackspace
  • Kubernetes

Durch die weitere Abstrahierung ist es somit jedem Entwickler möglich, komplett ohne Administrationskentnisse eine automatisch skalierende Umgebung aufzubauen.

Am Beispiel von GCE (Google Container Engine, basierend auf Kubernetes) wird einfach ein Load Balancer sowie ein Container Cluster angelegt. Um Kubernetes die Skalierung des Clusters zu übergeben wird einfach Autoscaling aktiviert, sowie min/max Anzahl der Container konfiguriert. Kubernetes übernimmt dann das automatische Starten und Stoppen von Containern basierend auf bspw. dem CPU Auslastung der Container [29]. Auch das zero-Downtime Deployment wird von Kubernetes abstrahiert, in dem bei einem Update ein Container nach dem anderen auf das neue Image aktualisiert wird [30].

Sicherheit

1 Szenario

Die Firma Hosting123 GmbH ist in der Hostingbranche tätig und betreibt verschiedene Contentmanagement- und Shopsysteme für mehrere Kunden. Um an Serverkosten zu sparen, sind auf einem Server immer mehrere Systeme installiert und auf verschiedene Ordner verteilt. Bei einem neuen Software Release der Systeme erneuert ein Mitarbeiter die jeweiligen Versionen der Systeme manuell auf dem Server.

Wenn nun ein sogenannter Exploit, also eine Sicherheitslücke, veröffentlicht wird und damit Dritte Zugriff auf das Dateisystem des Servers bekommen, sind bei der Firma Hosting123 GmbH alle Systeme, die auf dem gleichen Server installiert sind, nicht mehr sicher und sensible Daten könnten gelöscht bzw. ausgelesen werden. Somit ist die Sicherheit aller Kunden auf dem gleichen befindlichen Server nicht mehr gewährleistet und die Firma Hosting123 GmbH kann nicht für eine 100% Sicherheit der Systeme garantieren.

1 Lösung

An dieser Stelle ist es ratsam die Systeme auf den Servern in Docker Container auszulagern, um alle Systeme sauber voneinander zu trennen und eine hohe Sicherheit zu gewährleisten. Denn durch die Docker Container sind die Systeme so kapselt, dass von einem Container nicht auf den ausführenden Server und Services zugegriffen werden kann. Zusätzlich ist es möglich die Resourcen der Kunden so zu beschränken, dass Überlastungen eines einzelnen Kunden andere Kunden nicht betreffen.

Docker Container nutzen die Kernel Namespace Features und starten jeden Container in seinem eigenen Namespace. Dadurch kann ein Container weder Prozesse eines anderen sehen noch verändern. Jeder Container erhält seinen eigenen Netzwerkstack, und kann nur bei entsprechender Konfiguration mit anderen Containern kommunizieren. Ein weiteres Kern-Feature in Bezug auf die Sicherheit sind Control Groups, welches es ermöglichen verfügbare Resourcen wie CPU, Memory und Disk I/O pro Container zu limitieren. Gegen Übergriffe unter verschiedenen Containern ist Docker damit ähnlich gut geschützt wie virtuelle Maschinen – lediglich Kernel-Exploits könnten hier einen Ausbruch ermöglichen. Die mit Abstand größte Gefährdung geht jedoch von Diensten auf dem Hostsystem aus, da von dort aus über den Docker Daemon Zugriff auf alle Container besteht. Es ist daher ratsam, auf dem Hostsystem ausschließlich den Docker Daemon sowie einen SSH-Server zu betreiben und sämtliche anderen Dienste in Container zu verlagern [31].

 Employee Onboarding

1 Szenario

Die Firma Apps123 GmbH ist spezialisiert auf verschiedenste Applikationen für mehrere Betriebssysteme. Die Apps123 GmbH führt die zu erstellenden Applikationen immer in Projekten durch und ist dafür bekannt die vorgegebenen Anforderungen schnell durchzuführen. Dementsprechend sind während der Projektphase viele Arbeitskräfte nötig, um die Applikationen in der vorgegebenen Zeit umzusetzen. Die Agentur ist auf Freiberufler angewiesen und muss somit immer neue Mitarbeiter in die Entwicklungsumgebung integrieren. Durch die Konfiguration entsteht viel Zeitaufwand, da die Entwicklungsumgebung erst erklärt und aufgesetzt werden muss. Zu Projektbeginn ist deshalb ein Systemadministrator pro Freiberufler circa 2 Stunden beschäftigt.

1 Lösung

Die Firma Apps123 kann in diesem Szenario durch den Einsatz von Docker die Zeit des Employee Onboardings sehr stark minimieren. Durch die Verwendung von Docker können neue Mitarbeiter schnell und einfach in Projekte integriert werden, ohne viel Zeit mit der Konfiguration zu verbringen.

Docker unterstützt das Employee Onboarding von Programmierern dadurch, dass keine aufwändige Konfiguration von allen Services notwendig ist, sondern nur der Docker Daemon installiert werden und anschließend Container gestartet werden müssen. Sofern das Livesystem auch auf Docker basiert, so sollten die Livecontainer auch zur Entwicklung genutzt werden, so dass das Auftreten des „works-on-my-machine“-Problem auf ein Minimum reduziert werden kann. Inkonsistenzen zwischen dem Entwicklungs- und Livesystem gehören damit der Vergangenheit an. [32]

Platformunabhängigkeit

1 Szenario

Die Firma Software123 GmbH entwickelt Softwarekomponenten für verschiedene Großkunden. Die Kunden brauchen für ihre Systeme Softwarelösungen, die in kleine Komponenten aufgeteilt sind. Die Software123 GmbH entwickelt diese auf ihren Entwicklungsystemen und stellt diese dann dem Kunden bereit, der diese integriert. Getestet wird sowohl auf den lokalen Entwicklungsumgebungen, als auch auf einem Entwicklungsystem. Dadurch, dass auf den Endgeräten der Mitarbeiter aber verschiedene Betriebssysteme installiert sind, lässt sich nicht überall eine produktionssystemnahe Software erstellen. Die Komponenten werden zwar fertig entwickelt, bei der Integration in das Produktivsystem entstehen jedoch Fehler, die während der Entwicklung nicht aufgetreten sind und somit dort nicht reproduziert werden können.

1 Lösung

Mithilfe von Docker kann bei diesem Szenarien sehr viel Zeit beim Integrieren der Softwarekomponenten gespart werden. Docker bietet die Möglichkeit, dass innerhalb der Entwicklung die gleichen Systemvorraussetzungen vorhanden sind wie in dem Produktionssystem. Des Weiteren können automatisierte Tests in einer Umgebung gestartet werden, die auf Basis der Container des Livesystems erstellt wird. Damit lassen sich auch Differenzen zwischen Staging- und Liveumgebung minimieren.

Zur Erleichterung der Benutzung von Docker auf Hostsystemen, die die Anforderungen aus 4.1 nicht direkt erfüllen, stellt Docker mit „docker-machine“ ein Tool bereit, welches den Setup-Prozess einer entsprechend vorkonfigurierten VM in Virtualbox komplett automatisiert. [33]

Docker-Machine provisioniert dazu im Grunde nur eine VM mit vorinstallierter Docker Engine und stellt anschließend sicher, dass alle vom Docker Client benötigten Umgebungsvariablen korrekt gesetzt sind und auf den von der Engine bereitgestellten Daemon in der VM zeigen[33].

Da der Docker Client ausschließlich über eine HTTP API mit dem Daemon kommuniziert, ist es über docker-machine aber nicht nur möglich, einen lokal-virtualisierte Docker Daemon bereitzustellen. Es kann analog auch dazu genutzt werden, den docker Client mit einem Daemon auf einem remote verfügbaren Server zu verknüpfen. Durch die HTTP-Verbindung muss hier sichergestellt sein, dass der remote Daemon die notwendigen Ports bereitstellt[33].

 

Zusammenfassung

 

Der Einsatz von DevOps ist mittlerweile in Betrieben, die einen Entwicklungs- und einen Betriebsbereich haben, unverzichtbar. Die Methoden und Tools, die die DevOps für die Koordination und das Deployment benutzen sind sehr hilfreich bei der Zusammenarbeit von Teams und der Veröffentlichung von neuer Software.

Die Analyse von Docker im Bezug auf DevOps hat ergeben, dass Docker verschiedene Probleme wie Skalierbarkeit, Sicherheit und Plattformunabhängigkeit beseitigen kann und somit ein interessante und empfehlenswerte Software für DevOps darstellt. Auch die Automatisierung und die Konfiguration von Serverkomponenten kann optimal mit Docker abgebildet werden. Da Docker schnell und einfach benutzt werden kann ist es eine Software, die bereits in vielen Unternehmen zum Einsatz kommt und durchaus zu empfehlen ist.

Docker ist eine Software, die durch ihre große Community profitiert. Es werden regelmäßig Sicherheitsupdate erstellt und die Software wird kontinuierlich weiterentwickelt. Dadurch lässt sich abschließend sagen, dass die Software in der Zukunft immer mehr an Bedeutung gewinnen und durch die Weiterentwicklung vermutlich noch mehr Themengebiete abdecken wird.

Schlussendlich ist Docker aber nur eines von vielen Tools, dass den DevOps dabei hilft die Teams bei der Entwicklung und im Betrieb zu unterstützen. Docker allein ist nicht die vollkommene Lösung für den optimalen Deploymentprozess, es werden weitere Tools wie Jenkins und Vagrant empfohlen um die Veröffentlichung von Software Releases zu erhöhen und zu beschleunigen.

 

Dieser Artikel ist nur eine kurze Zusammenstellung. Ausführliche und detaillierte Informationen zu dem Thema finden Sie unter folgenden Links!

Lizenz:
GNU Free Documentation License 1.2.
Quelle:
http://winfwiki.wi-fom.de/index.php/Analyse_von_Docker_im_Hinblick_auf_DevOps#Zusammenfassung

 

Aufmacherbild / Lizenz / Quelle

Docker by xmodulo, on Flickr
Docker“ (CC BY 2.0) by xmodulo