Hier geben wir Einblicke in das Unternehmen, Gedanken, How-Tos, Wissenswertes und News, die sich aus der Programmierung und Projekten ergeben. Auch unsere Open Source Aktivitäten begleiten wir hier.

Corporate Blog der prooph software GmbH

PHP Webentwicklung mit Docker

Webserver

Server-Raum

Docker ist in aller Munde und gehört schon fast zum Standard Repertoire, wenn es um Virtualisierung geht. Dieser Beitrag zeigt, wie Docker die PHP Webentwicklung revolutioniert. Es wird ein klassischer Webserver-Stack bestehend aus einem HTTP-Server, PHP Server und MySQL Server aufgesetzt. Und das alles innerhalb von wenigen Minuten!

Die Vorteile von Docker

Docker ist das ideale Werkzeug, um die Live Server-Umgebung abzubilden. Die Live Server-Umgebung ist das einzige was zählt - daher sollten das Staging und Testing System möglichst identisch aufgebaut sein. Sicherlich hat man nicht die gleiche Hardware zur Verfügung, aber dieselbe Infrastruktur mit mehreren Web-Servern, PHP-FPM Servern oder Datenbanken kann abgebildet werden. Auch zum Testen der dynamischen Server Skalierung und wie sich die Anwendung dabei verhält, ist Docker das ideale Werkzeug.

Docker bietet noch weitere Vorteile. Zum einem sind Docker Container schneller und verbrauchen weniger Ressourcen als Virtuelle Maschinen mit VirtualBox oder VMWare und die Docker Container sind nicht an eine bestimmte Infrastruktur gebunden. Docker Container laufen auf jedem Computer, mit jeder Infrastruktur und in jeder Cloud.

Virtual Machines vs. Docker

Klassischer Webserver-Stack

Ein typischer Webserver Stack besteht aus einem HTTP Server wie nginx, einem PHP-FPM Server und einer MySQL Datenbank wie MariaDB. Während der HTTP Server und PHP meist auf dem gleichen Server installiert wurden, ist das bei Docker anders. Hier gilt: Ein Prozess pro Container! Daraus folgt, dass PHP-FPM auf einem anderen Container (Server) laufen muss. Wer jetzt denkt, dies sei ein Nachteil, liegt falsch. Das Großartige daran ist, dass man mit nginx als Reverse-Proxy sogar einen Backup PHP-FPM Server definieren kann oder auch gleiche mehrere PHP-FPM Server. Falls doch mal ein PHP-FPM Server ausfallen sollte, kann so ein anderer einspringen. Bei größeren Projekten würde wohl HA-Proxy und ggf. andere Tools zum Einsatz kommen, aber wir beschränken uns hier erst einmal auf die einfachere Lösung.

Alles, was wir benötigen, um diesen Server Stack aus HTTP Server, PHP Server und MySQL Server aufzusetzen, sind Docker und Docker Compose. Wenn diese zwei Docker Tools installiert sind, wird nur noch eine ca. 30 Zeilen lange Konfiguration benötigt und schon laufen die 3 Server. Es handelt sich hierbei nicht um 3 physische Server, aber für Docker macht das keinen Unterschied, da diese sich wie 3 physische Server verhalten.

Windows und Mac Benutzer sollten darauf achten, dass das Verzeichnis im Benutzer-Verzeichnis erstellt wird, da sonst Docker keine Verzeichnisse mounten kann.

Es wird in einem leeren Verzeichnis die Datei docker-compose.yml mit folgendem Inhalt erstellt. Bei der Docker Compose Datei handelt es sich um eine YAML Datei.

nginx:
  image: prooph/nginx:www
  ports:
      - "8080:80"
      - "443:443"
  links:
    - php:php
  volumes_from:
    - dataphp

php:
  image: prooph/php:7.0-fpm
  links:
    - mariadb:mariadb
  volumes_from:
    - dataphp

dataphp:
  image: debian:jessie
  volumes:
    - .:/var/www

mariadb:
  image: mariadb
  ports:
    - "3306:3306"
  environment:
    - MYSQL_ROOT_PASSWORD=dev
    - MYSQL_USER=dev
    - MYSQL_PASSWORD=dev
    - MYSQL_DATABASE=prooph

Für diejenigen, die noch nicht so sehr mit Docker vertraut sind, erfolgt nun eine Erklärung der Docker Compose File Konfiguration.

Der image Eintrag gibt an, welches Docker Image benutzt werden soll. Dies kann entweder lokal oder auf einem Remote Server liegen. Wenn es nicht gefunden wird, wird versucht es automatisch von Docker Hub zu laden.

ports definiert welcher Port vom Host auf den Guest Rechner zeigen soll. Docker vergibt beim Skalieren automatisch einen neuen Port auf dem Host und zeigt diesen automatisch auf den im Docker Image definierten Port. Deswegen können z.B. einfach 100 PHP-FPM Server erzeugt werden, ohne den Port in der PHP-FPM Konfiguration anpassen zu müssen.

Über links wird eine Verbindung zu anderen Docker Containern hergestellt. Ansonsten könnte z.B. PHP nicht mit dem MySQL Container kommunizieren oder nginx mit PHP-FPM. Der Vorteil hierbei ist, dass Docker einen etc/hosts Eintrag beim Container, welcher die links-Anweisung nutzt, erstellt. Somit ist im PHP-FPM Container der MariaDB Container über den Hostnamen mariadb erreichbar.

Mittels volumes_from werden die gemounteten Verzeichnisse eines sogenannten Data-Containers gemountet. Durch Data-Container wird sichergestellt, das mehrere Docker Container dieselben Daten nutzen können, ohne sich in die Quere zu kommen. Der MariaDB Container benutzt aktuell keinen Data-Container, deswegen gehen die Daten beim Löschen des Docker Containers verloren. In der Beschreibung zum MariaDB Docker Image wird gezeigt, wie die Daten nicht verloren gehen.

Ordner werden mit volumes im Container an der entsprechenden Stelle bereitgestellt. Der Mount-Point kann entweder ein absoluter Pfad oder ein relativer Pfad ausgehend von dem Verzeichnis, wo die docker-compose.yml Datei liegt, sein.

Mit environment können Umgebungsvariablen den Containern übergeben werden. Bei dem MariaDB Docker Container werden z.B. die Zugangsdaten und eine Datenbank dadurch definiert.

Docker Webserver-Stack starten

Damit der Webserver auch etwas anzeigt, wird ein neuer Ordner public erstellt. In diesem Ordner wird die Datei index.php mit folgendem Inhalt abgespeichert.

<?php

phpinfo();

Das verwendete prooph/nginx Docker Image beinhaltet einen vHost, welcher als Document Root Verzeichnis /var/www/public benutzt. Somit kann das nginx Docker Image auch für alle anderen PHP-Anwendungen - egal ob Symfony, Laravel oder Zend Framework Applikation - benutzt werden.

Auf der Kommandozeile im Ordner, wo sich die docker-compose.yml Datei befindet, startet folgender Befehl die Docker Container:

$ docker-compose up -d

PHP Webentwicklung mit Docker

Da für den HTTP Port 80 ein Port Mapping definiert wurde, wie es evtl. von Vagrant bekannt ist, wird die PHP Konfiguration mit folgender Browser URL http://localhost:8080 aufgerufen. Auch HTTPS https://localhost ist nach dem Akzeptieren des selbstsignierten Zertifikats möglich. nginx ist bereits bei einer sicheren Verbindung mit HTTP/2 konfiguriert.

Fazit

Docker ist bestens für die PHP Entwicklung geeignet und beschleunigt diese sogar. In Minutenschnelle ist ein kompletter Server Stack aufgesetzt und die Entwicklungsumgebung kann das Produktionssystem sehr genau abbilden. Wobei es bei Docker eigentlich keine Trennung zwischen Entwicklungsumgebung und Produktionssystem geben muss, da es dieselben Docker Images sein können und sollten. Für die Entwicklung können spezielle Debugging oder Profiling Docker Images zum Einsatz kommen, was in einem anderen Blog Beitrag erläutert wird. Neben Docker und Docker Compose gibt es noch weitere Applikationen aus der Docker Toolbox. Jedes Tool erfüllt eine Aufgabe. In weiteren Blog Beiträgen werden diese untersucht.

Build, Ship, Run Für unsere Kundenprojekte nutzen wir genau auf die jeweilige Server-Umgebung abgestimmte Docker Images, um einen reibungslosen Ablauf bei der Übergabe der Software zu gewährleisten. Somit stellen wir sicher, dass die von prooph software entwickelten Applikationen auch auf den Servern unserer Kunden laufen.

Sie suchen einen Software Dienstleister für Ihr Projekt: Projektanfrage stellen

Blog Artikel mit ähnlichen Themen

Schade, es sind keine weiteren dazu passenden Texte online...
Auf der prooph blog Startseite findest du alle Blog Einträge.