Erfahrungsbericht über den Einsatz von Docker Containern für eine Grails Applikation

von Peter Soth

Aktuell migrieren wir eine Anwendung, die wir für einen bekannten Pharma-Hersteller auf Basis von Grails 1.3.7 realisierten, auf Grails 3.2.8. Bei der Software-Lösung handelt es sich um ein Produkt-Informations-System (kurz: PIM), das alle Daten zu einem Medikament verwaltet und verschiedenen Web-Seiten zur Verfügung stellt.
Grails läuft bei uns auf einem Tomcat-Cluster, dem ein Apache-Web-Server als Load-Balancer vorgeschaltet ist. Als Datenbank benutzen wir MySQL. Für das Aufsetzen dieser Software-Komponenten gingen wir bisher so vor, dass wir diese auf einer virtuellen Maschine installierten und diese anschließend - beispielsweise von Test auf Produktion - klonten.

Im Rahmen dieses Projekts wollten wir neue Technologien, wie Docker einsetzen, um die Installation von Apache, Tomcat und MySQL und das spätere Deployment zu vereinfachen und zu beschleunigen, da es gilt, immer mehr Systeme aufzusetzen. So haben wir beispielsweise eine Test- und Produktionsumgebung im Rechenzentrum bei unserem Kunden und des Weiteren zwei Test-Umgebungen (jeweils für den Produktions und den aktuellen Entwicklungs-Branch in Git) bei uns im Unternehmen auf die Jenkins (Continuous Integration) automatisch täglich eine frische Version deployed.

Was ist Docker?

Docker ermöglicht es, Anwendungen in Containern zu betreiben und damit voneinander zu separieren. Dies ist auch mit Virtualisierungstechnologien, wie VMWare möglich, jedoch mit einem entscheidenden Nachteil. Hier benötigt jede VM ein komplett eigenes Betriebssystem, was mit einem erhöhten CPU- und RAM-Verbrauch verbunden ist. Zusätzlich können VM-Images immens groß werden und lassen sich demzufolge nur unzureichend teilen. Bei Docker benutzen hingegen alle Container das Host-Betriebssystem. Außerdem ist nur schwierig nachvollziehbar, welche Änderungen und Konfigurationseinstellungen am Betriebssystem selbst, sowie der installierten Software vorgenommen wurden.

Bestandteile von Docker:

Ein Docker-Container kann als leichtgewichtiges virtuelles Betriebssystem verstanden werden. Das Docker-Image stellt das Datei-System eines Docker-Containers dar und wird mit Hilfe eines Dockerfiles (Textdatei) erzeugt. Es existieren bereits viele vorkonfigurierte Docker-Files auf Docker-Hub, einer Registry für Docker-Images. Des Weiteren gilt es noch, Docker-Compose zu erwähnen. Hierbei handelt es sich um ein Werkzeug, um Docker-Container zu orchestrieren, sprich diese ermöglicht es, mehrere Docker-Container zu definieren und zu verbinden.

Wie setzen wir Docker gegenwärtig ein?

Für den Apache Webserver und den Tomcat erstellten wir eigene Dockerfiles. Dies war nötig, da wir zum einen die JVM von Oracle benutzen wollten und zum anderen das Load-Balancing zwischen dem Apache und den Tomcats mit den Standard Dockerfiles nicht zufriedenstellend realisiert werden konnte. MySQL wurde mit einem Dockerfile, das wir direkt vom Docker-Hub bezogen, umgesetzt. Mit Hilfe von Docker-Compose wird das Ganze orchestriert. So wird hier der Apache Webserver mit den Tomcats und der MySQL-Datenbank verknüpft und zudem die Data-Volumes für die Log- und Datenbankfiles, die über die Lebenszeit eines Containers bestehen sollen, definiert.

Ist Docker auch für einen produktiven Einsatz geeignet?

Für uns ist es natürlich wesentlich, dass wir nicht nur Test-, sondern gleichermaßen Produktivumgebungen mit Docker aufsetzen können. Eine Internetrecherche hat gezeigt, dass der sich wegen Docker ergebene Overhead zu vernachlässigen ist. Vor allem bei der MySQL-Datenbank sahen wir Probleme, folgende Artikel [1][2][3][4] überzeugten uns schließlich, es mit Docker zu probieren. Dessen ungeachtet führten wir einen Lasttest durch. Dies ist bei einer größeren Migration generell anzudenken. Die Ergebnisse des Lasttests zeigten, dass der Overhead de facto vernachlässigbar ist.

Fazit

Den Einsatz von Docker betrachten wir als sinnvoll. Es ergeben sich viele Vorteile, so ist es uns inzwischen möglich, eine Software-Umgebung rascher aufzubauen. Des Weiteren erhöht sich die Qualität von Installationen. Bisher wurden Installationsanleitungen in unserem Wiki hinterlegt. Jetzt erfolgt diese im Dockerfile und wird zusätzlich versioniert.

[1] http://mysqlserverteam.com/mysql-with-docker-performance-characteristics/
[2] https://eng.uber.com/dockerizing-mysql/
[3] https://www.percona.com/blog/2016/02/05/measuring-docker-cpu-network-overhead/
[4] https://www.percona.com/blog/2016/02/11/measuring-docker-io-overhead/

Kategorien: GrailsVirtualisierung

Zurück