Devilbox: Lokaler Webserver mit Apache, PHP und MySQL im Docker Container

17. Feb. 2018 // Moritz Kanzler //

In diesem Artikel wird die Benutzung eines lokalen Entwicklungsservers für Webanwendungen mithilfe von Docker und dem Devilbox-Projekt beschrieben. Die Erläuterungen reichen von der einfachen Einrichtung bis hin zu gehärteten Betrieb für die lokale Enwicklung von Wep-Apps.

Devilbox und andere Dev-Umgebungen

Die Art und Weise wie Softwareentwickler ihre Development Umgebungen betreiben sind vielfältig, sie reichen von einer lokalen Ausführung von Skripten, über die Nutzung von virtuellen Maschinen, deployment auf eigenen Developmentservern bis hin zum Einsatz von Docker als unterliegendes Entwicklungssystem. Grundsätzlich gibt es aber einige durchgängig geforderte Kriterien für eine Dev-Umgebung. Dazu gehören:

  • Wartungs- und Betriebsaufwand: Wie aufwändig ist die Einrichtung der Entwicklungsumgebung? Wie gut lässt sie sich updaten? In welcher Form werden die Systemressourcen beansprucht und wie tief ist die Entwicklungssystem in das eigentliche Wirtssystem integriert? Hierbei ist grundsätzlich ein möglichst performantes und vom Wirtssystem unabhängiges System gewünscht. Außerdem sollten sowohl Einrichtung, wie auch Updates für die Entwicklungsumgebung möglichst einfach zu machen sein. Das Wirtssystem sollte das Entwicklungssystem möglichst nicht in seinem Betrieb einschränken (bspw. unterschiedliche Verfügbarkeit von Software für Windows, macOS und Linux).
  • Flexiblität: Bei einer Entwicklungsumgebung ist entscheidend ein möglichst flexibles System vorzufinden. Das Ausprobieren von neuen Softwaremodulen oder das einfache Wechseln zwischen verschiedenen Versionen vorhandener Module beschleunigt den Testbetrieb und beugt Fehlern im Endprodukt vor.
  • Nähe zum Produktionssystem: Eine weitere leidvolle Fehlerquelle kann der Unterschied zwischen der benutzten Entwicklungsumgebung und dem echten Produktionssystem sein. Verschiedene Softwareversionen in beiden System, das Vorhandensein von Modulen oder das setzen von Speicherlimits kann zu Problemen im Live-Betrieb führen, die im eigenen Entwicklungssystem durch eine andere Konfiguration gar nicht aufgefallen sind.
  • Interaktionsmöglichkeiten: Hilfreich für die Softwareentwicklung ist außerdem einen möglichst großen Einfluss auf das laufenden System zu haben, um Fehler effektiv zu debuggen. Dabei ist der Zugang auf Log-Files oder Konfigurationen und Servicedienste ein großes plus.

Alle diese Faktoren sind entscheidend für ein einfaches und möglichst produktives Entwicklungssystem. In den letzten Jahren mischt Docker die Entwicklerszene auf und bietet im Vergleich zu virtuellen Maschinen einen einfacheren Deploymentprozess und global eingesetzt auch einen reibungsloseren Einsatz zwischen Dev- und Produktionssystem. Die Vor- und Nachteile von Docker wurden jedoch schon häufig genug in anderen Beiträgen besprochen und sind nicht Thema dieses Artikels.

Anstatt dessen, soll dieser Artikel eine, auf Docker basierende, Alternative zum häufig benutzten und direkt installierten LAMP-Stack bieten und richtet sich an Entwickler welche Projekte hauptsächlich mit PHP, MySQL/MariaDB/PostgreSQL und dem Apache oder Nginx Webserver umsetzen.

LAMP-Stack

Der LAMP-Stack (oder ähnlich auch XAMPP oder MEAN) wird meist direkt auf dem Wirtssystem des Entwicklers installiert und nutzt die jeweiligen Systembibliotheken und passenden Softwaremodule die das jeweilige Betriebssystem zur Verfügung stellt. Damit ist bei den meisten Systemen die Nähezum Produktionssystem gefährdet, da häufig auf Entwicklerseite eine andere Infrastruktur (Betriebssystem) als auf der späteren Produktionsumgebung eingesetzt wird.

Je nach Wirtssystem kann außerdem der Wartungs- und Betriebsaufwand sowie die Flexibilität unter der direkt installierten Entwicklungsumgebung leiden. Gerade wenn Softwaremodule wie PHP oder MySQL systemweit installiert sind und auch noch von anderen Projekten genutzt werden, kann ein Update oder eine Versionsänderung Probleme in diesen anderen Projekten machen. Dazu kommt noch, dass auch nicht jedes Modul auf jedem System im gleichen Umfang läuft (bspw. ist curl in Linux integriert, bei Windows muss dieses „aufwändig“ nachinstalliert werden).

Gerade bei umfangreichen und heterogen konfigurierten Projekten, kann ein Entwickler mit direkt installierten Entwicklungsumgebungen schnell an eine Grenze stoßen, bei der die Konfigurierung seiner Umgebungen deutlich mehr Zeit in Anspruch nimmt, als es eigentlich im Entwicklungsprozess der Fall sein sollte.

Devilbox als Lösungansatz

Devilbox ist ein Projekt welches den LAMP- und MEAN-Stack über Docker auf allen gängigen Betriebssystemen verfügbar macht. Dabei wird die Wartungs- und Betriebsaufwand, Flexibilität, Nähe zum Produktionssystem und Interaktionsmöglichkeiten durch die zusätzliche Abstraktionsschicht von Docker gewährleistet.

Es lassen sich beliebig Versionen der einzelnen Komponenten tauschen, der Zugriff auf Log-Files ist Entwicklungsweit einfach zugänglich und die einzelnen Module sind frei konfigurierbar, um sie möglichst nah an den Produktionsstandard bringen zu können.

Zusätzlich bietet Devilbox noch ein eigenes Routing mit, welches die Projekte einfach über definierte URLs aufrufbar macht. Somit kann man pro Projekt oder Produktionsumgebung ein fast identisches System schaffen, welches die Produktionsumgebung abbildet und einfach anpassbar ist.

Im weiteren wird nun die Einrichtung bis hin zum Betrieb der Devilbox unter macOS erläutert.

Einrichtung der Umgebung

Im Folgenden wir die Einrichtung und der Betrieb eines LAMP-Stacks mit einem Apache-Webserver, PHP und MySQL-Datenbank über Docker und Devilbox auf macOS beschrieben.

Grundsätzliche Bedingungen für den Betrieb von Devilbox sind:

  • eine aktuelle Version von Docker auf dem eigenen System zu installieren,
  • und die Konfigurationsdateien für Devilbox von Github zu laden.

Zielsetzung

Für ein vorhandenes Projekt wurde eine lauffähige Webserverumgebung benötigt, welche folgende Kriterien erfüllen sollte:

  • Apache-Webserver in Version 2.4
  • lauffähiges PHP(-FPM) in Version 5.4
  • eine MySQL-Datenbank in Version 5.7

Außerdem sollten bestimmte Webserver- und PHP-spezifische Einstellungen vorgenommen werden um sich dem Produktivsystem möglichst anzunähern.

Devilbox herunterladen

Das Herunterladen der Devilbox lässt sich einfach über GitHub erledigen:

.env

Ist man im eigentlichen Devilboxverzeichnis (devilbox) müssen zunächst die Komponenten definiert werden, die in der Entwicklungsumgebung eingesetzt werden sollen. Hierbei bedient sich dieses Beispiel an der obigen Zielsetzung. Die Konfiguration der Komponenten und die einzusetzenden Version werden über die    Datei gesteuert. Hier werden grundsätzlich:

  • Softwareversionen,
  • Docker File Mount Pfade
  • Umgebungsvariablen der Komponenten
  • Ports
  • Benutzer und Passwörter

festgelegt.

Zunächst muss eine .env Datei aus dem Beispielpattern generiert werden:

Danach kann die .env Datei mit einem beliebigen Texteditor geöffnet werden und von oben nach unten bearbeitet werden. Viele der Grundeinstellungen reichen schon völlig für den Betrieb. In diesem Tutorial werden nur die wichtigsten Einträge zur Erfüllung der Zielsetzung behandelt:

  • DEVILBOX_PATH:
  • TLD_SUFFIX:
  • PHP_SERVER:
  • HTTPD_SERVER:
  • MYSQL_SERVER:
  • HOST_PORT_HTTPD:
  • MYSQL_ROOT_PASSWORD:

cfg

Der cfg-Ordner enthält alle Konfigurationsdateien für die angebotenen Module, darunter sind beispielsweise die Apache, PHP oder MySQL Konfigurationsdateien. Diese werden normalerweise durch Default-Konfigurationen vorkonfiguriert. Da ein Vorteil der Devilbox Nutzung die Annäherung der Entwicklungsumgebung an das Produktionssystem war, kann hier aber auch einfach eine eigene Konfiguration für die jeweiligen Services hinterlegt werden.

Die Devilbox Dokumentation sieht hier vor, dass zunächst das jeweilige Konfigurationspattern kopiert und umbenannt wird, damit es wirksam wird:

Im obigen Beispiel wird die Konfiguration für das PHP 5.4 Modul kopiert und aktiviert. Hier können dann einzelne abweichende Werte überschrieben werden. Alles was nicht in der angepassten Konfiguration angegeben wird, behält seine Standardwerte.

Um die Anpassungen in der Entwicklungsumgebung aktiv zu machen, muss Devilbox über docker-compose einmalig neu gestartet werden (dazu später noch mehr):

Starten und Testen der Umgebung

Die Devilbox ist eine Zusammenstellung aus Docker Containern, welche über die Enviroment Datei .env, wie oben beschrieben ausgewählt werden. Über docker-compose werden dann diese ausgewählten Container mit Docker gestartet und die entsprechenden Konfigurationen ausgewertet.

Starten der Container

Der Start der Entwicklungsumgebung wird über docker-compose gestartet, den kompletten Stack von Devilbox (Apache, Nginx, PHP, MySQL, MariaDB, PerconaDB, PostgreSQL, Redis, Memcached und MongoDB) startet man über ein einfaches:

Soll nur eine Auswahl von Diensten gestartet werden, können diese im Startprozess angegeben werden. Im Sinne der Zielsetzung sollen hier nur der Apache-Server, das PHP Modul und eine MySQL Instanz gestartet werden. Die Versionen der Dienste entsprechen den angegebenen Versionen in der .env Datei:

Übersicht der laufenden Prozesse

Zur Kontrolle der laufenden Dienste kann der    Befehl genutzt werden. Dort werden alle über Docker gestarteten Container aufgelistet, zusammen mit den freigeschalteten Ports des Hostsystems und Container IDs, Imagenamen und weiteren Informationen.

Container wieder stoppen

Um die Container zu stoppen und den Betrieb der Entwicklungsumgebung zu pausieren, wird der   Befehl von docker-compose genutzt:

Danach können die Container einfach wieder über den    Befehl wieder gestartet werden und laufen auf dem gleichen Stand weiter wie vor dem Beenden.

Laufzeitumgebung zurücksetzen

Wie schon bei der Beschreibung der .env Datei erwähnt, müssen bei jeder Konfigurationsänderung die laufenden Container der Devilboxumgebung gestoppt und zurückgesetzt werden. Dazu werden folgende Befehle benutzt:

Hierbei werden weder die deployten Dateien auf dem Apache gelöscht, noch die Datenbankinhalte. Dies gilt solange diese in den angemounteten Volume-Verzeichnissen liegen. Sollen auch die Inhalte gelöscht werden müssen die Dateien in den Volume-Verzeichnissen ebenfalls entfernt werden. Bei der gegebenen Zielsetzung liegen die Volumes in folgenden Pfaden:

  • ./data/www/: Pfad für ausführbare Dateien auf dem Apache-Server
  • ./data/mysql/: Pfad für die Daten aus der MySQL Datenbank

Eigene Projekte und DNS

Eigenes Projekt anlegen

DNS Eintrag vornehmen

Fazit

Nützliche Links