Vagrant halt, Docker run

von Andreas Pointner, 7. Dezember 2015
Als Entwickler von Web Anwendungen (worunter auch Magento fällt) stellt man sich immer wieder die Frage: Wie schaffe ich es, eine möglichst nahe am Livesystem angelehnte Umgebung bei mir lokal laufen zu lassen um das berühmte „Bei mir am Rechner ist das aber anders“-Problem zu beseitigen? Vor ca. 2 Jahren haben wir damit begonnen all unsere Kundenprojekte mittels VirtualBox und Vagrant lokal laufen zu lassen.

Vagrant ¹

vagrant
Vagrant selbst beschreibt sich als „Create and configure lightweight, reproducible, and portable Development environments.“² Somit war es das erste Mal möglich lokal (fast) die gleiche Umgebung nachzustellen wie sie am Produktivserver vorhanden ist. Sieht man sich in der Magento Community um so entdeckt man, dass beinahe alle Agenturen und Entwickler auf dieses Prinzip umgestellt haben.

Vagrant bringt an sich einige Vorteile mit sich. Vor allem ist es leicht mit Hilfe eines Box-Servers eine komplette Entwicklungsumgebung mit einem Kollegen zu teilen und dieser braucht nur noch das bekannte „vagrant up“ in die Kommandozeile zu klopfen und den Rest erledigt Vagrant.

Die Virtuelle Maschine (VM) des Projektes wird heruntergeladen, eventuell provisioniert und läuft innerhalb von wenigen Minuten am Rechner des Kollegen und schon kann damit begonnen werden neue Features zu erstellen.

Vagrant Workflow ³

Vagrant Workflow
Wie man aber bereits in der Überschrift dieses Beitrags vermuten kann, handelt dieser Beitrag nicht von Vagrant sondern von Docker. Was hat uns nun also dazu bewegt auf Docker zu wechseln? Was ist überhaupt so schlecht an Vagrant?

Prinzipiell kann ich dazu nur sagen: Vagrant ist nicht schlecht und Docker ist halt anders.

Es gab / gibt jedoch einige Mankos die Vagrant mit sich bringt und uns Docker immer näher brachten.

Der Gedanke hinter Vagrant ist, dass pro Projekt eine eigene virtuelle Maschine gestartet wird in der sich alles befindet um Entwickeln zu können. Diese VM kann man dann theoretisch 1:1 auf irgend ein System (z.B: das Produktivsystem) übertragen. Genau darin liegt das Problem für uns Entwickler. Obwohl sich Vagrant selbst als „lightweight“ beschreibt muss pro Entwicklungsumgebung eine komplette Linux-Distribution mit sämtlichen Applikationsdaten (Code, Assets, …) gespeichert werden. Dies führt dazu, dass solch ein Image schnell über 5 GB an Festplattenspeicher benötigt.

Magento File Count ⁴

Ein anderes Problem liegt nicht unbedingt im Verhalten von Vagrant, sondern im Zusammenspiel von Vagrant mit VirtualBox. Als Entwickler arbeitet man an den neuen Features in einer IDE wie zum Beispiel PhpStorm und die Dateien sollen dann automatisch auf die Virtuelle Maschine synchronisiert werden. In diesem Punkt liegt das Problem begraben. Ein Vanilla Magento hat in der aktuellen Version (1.9.2.2) 14290 Dateien und 5359 Verzeichnisse.

 

Nun bietet uns Vagrant zur Synchronisierung 2 Möglichkeiten die meiner Meinung nach Sinn machen. Zum einen rsync und zum anderen NFS.

Improved Magento Folder Structure
Beide für sich sind mit der Anzahl der Files überfordert und so haben wir uns entschlossen den Magento-Core (htdocs) über rsync beim Starten der VirtualBox zu synchronisieren und das .modman als auch das vendor Verzeichnis per NFS einzubinden.

Was ist nun Docker und was sind die Vorteile gegenüber Vagrant?

Ich werde hier nur kurz behandeln was Docker ist, da es bereits einige gute Erklärungen dafür online zu finden gibt. Vor allem die offizielle Homepage: https://www.docker.com/ beschreibt Docker folgendermaßen:

„Docker containers wrap up a piece of software in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server“⁵

Docker⁶

Was sind nun die essentiellen Unterschiede von Docker zu VirtualBox und Vagrant im Einsatz mit Magento?

  • Im Gegensatz zu Vagrant ist Docker wirklich leichtgewichtig, denn jeder einzelne Container baut auf dem darunterliegenden auf.
  • Während bei Vagrant jedes mal eine komplette VM gestartet wird (was einige Minuten dauern kann) werden bei Docker die einzelnen Container innerhalb weniger Sekunden gestartet.
  • Funktionalität wird bei Docker in Container ausgelagert (1-Container-per-Service Prinzip) wohingegen sie bei Vagrant direkt in der virtuellen Maschine integriert werden muss. Ein Beispiel dafür ist das Ausführen von Cron-Jobs. Im Falle von Docker startet man einen Container der nur für das Abarbeiten der Jobs zuständig ist, während die Cron-Jobs bei Vagrant direkt im Image integriert werden müssen.
  • Da Docker direkt am Linux-Kernel aufsetzt und das Union File System⁷ benutzt, benötigt man kein rsync oder NFS mehr um die Dateien in den Container zu bekommen und das Wort Synchronisierung gehört somit der Vergangenheit an.

Dies sind einige Gründe wieso wir uns von CopeX dazu entschlossen haben auf Docker umzustellen.

Wie geht es nun weiter?

In unserem nächsten Beitrag über Docker widmen wir uns den Dockerfiles und dem Zusammenspiel der einzelnen Container. Damit ist es möglich eine vollwertige, flexible, leichtgewichtige und  ressourcensparende Entwicklungsumgebung binnen Sekunden starten zu können.

Also seit gespannt auf unseren zweiten Teil der bald erscheinen wird.