Contao 4.2 mit Docker - Konfiguration

15. Oktober 2016 Web-Entwicklung von

In den letzten Tagen habe ich mich damit auseinander gesetzt, wie ich eine Entwicklungsumgebung für Contao mit Docker aufsetzen kann. Letztendlich habe ich eine recht simple Schrittfolge konstruiert, welche einen Einstieg innerhalb von ein paar Minuten ermöglicht.

Ziel

Ziel dieser Anleitung ist das Aufsetzen einer Entwicklungsumgebung für Contao mit Docker - bestehend aus zwei Docker-Containern. Ein Container soll dabei als Webserver fungieren, der andere wiederum als Datenbank-Container mit MySQL.

Was ist Docker?

Docker Container schnappen sich ein Stück Software, packen dieses in ein eigenständiges Dateisystem, laden alle Dateien und Services zur erfolgreichen Ausführung der Software und sichern somit eine immer gleiche Ausführungsmaschine - egal wo. Eigentlich steckt dahinter das Prinzip von Vagrant: Jeder Entwickler hat jederzeit die gleichen Voraussetzungen in seiner Entwicklungsumgebung erfüllt. Docker bringt einen Vorteil: Es ist deutlich ressourcend-sparender.

1. Docker installieren

Docker kann über die offizielle Webseite bezogen werden. Die Installation möchte ich nun nicht im Detail erläutern, da diverse Installationsschritte vom Host-System abhängig sind. Meiner Meinung nach gilt jedoch: Je neuer der Host, desto einfacher die Installation.

Ich möchte an dieser Stelle auch keine Einführung in Docker geben, sondern lege Euch das Get-Started-Tutorial von Docker selbst ans Herz, falls ihr noch keine Erfahrungen mit der Docker-Architektur sammeln konntet.

Docker-Compose

Installiert man die Docker-Toolbox wird neben der Docker Engigne auch das Tool docker-compose bereitgestellt. Dieses ist bequem über die Kommandozeile zu bedienen und stellt Möglichkeiten bereit, mehrere Docker Container zu einer Architektur mit Abhängigkeiten zu verbinden. Das Ganze wird über eine YAML-Datei gesteuert.

2. Projekt mit docker-compose.yml anlegen

Als erstes lege ich einen neuen Projektordner an. In diesem Beispiel contao-docker. In diesem platziere ich eine Datei mit dem Namen docker-compose.ymlund folgendem Inhalt, welchen ich im Nachgang erläutern werde.

version: "2"
services:
  web:
    image: webdevops/php-nginx
    container_name: contao-nginx
    ports:
      - "80:80"
    depends_on:
      - "mysql"
    links:
      - mysql
    volumes:
      - ~/workspace/projects/contao-docker/contao:/app
    environment:
      WEB_DOCUMENT_INDEX: "/web/app.php"
  mysql:
    image: mysql:latest
    container_name: contao-mysql
    # volumes:
    #  - ~/workspace/projects/contao-docker/dbdata:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: contaodb

composer.yml verstehen

Die erste Zeile versionbeschreibt die zu verwende Version der Beschreibung mittels der docker-compose-Syntax. Ich verwende Version 2.

Darunter werden mittels services die anzulegenden Docker-Container näher beschrieben. In diesem Beispiel soll ein Container webund ein Container mysqlerstellt werden.

ìmagebeschreibt die Quelle des Docker Images. In diesem Beispiel verwende ich den offiziellen MySQL-Container, sowie das sehr gute Nginx-Image von webdevops/php-nginx. Dieses Image bringt diverse Bequemlichkeiten mit sich und so können viele Parameter direkt über Umgebungsvariablen gesetzt werden.

Das Attribut container_namesorgt für einen definierten Namen der erstellten Container und unterbindet das zufallsbasierte / generierte Naming.

apache verwenden

Wer lieber ein apache-Container verwenden möchte, der kann den Part web wie folgt ersetzen:

web:
    image: webdevops/php-apache-dev
    container_name: contao-apache
    ports:
      - "80:80"
    depends_on:
      - "mysql"
    links:
      - mysql
    volumes:
      - ~/workspace/projects/contao-docker/contao:/app
    environment:
      WEB_DOCUMENT_INDEX: "/web/app.php"
      WEB_DOCUMENT_ROOT: "/app/web"
      APPLICATION_PATH: "/app/web"

Beim Starten von Containern kann es Abhängigkeiten geben und so kann mittels des Attributs depends_on eine Start-Reihenfolge definiert werden. Im Beispiel wird der PHP-Container also erst nach dem MySQL-Container gestartet.

Mittels links können Container untereinander über die offenen Ports kommunizieren. Beim MySQL-Container wird standardmäßig der Port 3306 freigegeben. Mittels des Linkens in der Definition des PHP-Containers wird sichergestellt, dass der PHP-Container den host 'mysql' zu der IP-Adresse des Datenbank-Containers automatisch auflösen kann.

volumes stellt eine Verbindung vom Host-System zum Container dar. So können Dateien des Hostsystems als Volume innerhalb des Containers gemountet werden. Das ist praktisch, um in diesem Beispiel das Verzeichnis app, welches der WEB_ROOT ist, auf ein im Hostsystem vorhandenes Verzeichnis zu linken. So können lokal Dateien bearbeitet werden und der WebServer verwendet automatisch die veränderten Dateien. Im Beispiel wird das Verzeichnis ~/workspace/projects/contao-docker/contao des Hosts auf das Verzeichnis /app innerhalb des Containers gemappt.

Im Bereich environment können vom Umgebungsvariablen mit entsprechenden Werten konfiguriert werden. Im Fall des PHP-Nginx-Containers setze ich den WEB_DOCUMENT_INDEX auf /web/app.php, die Core-Datei von Contao.

Note: Dieser Schritt ist wichtig, da sonst per Default der Einsprung über ìndex.php aufgelöst wird.

Für die Datenbank wird an dieser Stelle das Root-Passwort vergeben und ein Name für eine Datenbank angegeben, welche beim ersten Start erstellt werden soll.

Mittels ports teilen wir dem Container mit, dass der Container-Port 80 auf dem Hostsystem ebenfalls als Port 80 verfügbar sein soll.

3. Contao beziehen und starten

Contao 4 kann mittels Composer installiert werden, jedoch bevorzuge ich für dieses Beispiel den einfacheren Weg mittels Download der Zip-Datei. Aktuell ist die Version 4.2.4.

cd ~/workspace/projects/contao-docker/contao
wget https://download.contao.org/4.2.4/zip -O contao.zip
unzip contao.zip
rm -rf contao.zip
mv contao-4.2.4/* .
rm -rf contao-4.2.4

Datei-Überblick

workspace/projects/contao-docker
    - contao
        - Entpacktes Contao-Archiv
        - Web-App-Root
    - dbdata
        - Dient als Volume für die MySQL-Datenbanken
    - docker-compose.yml

Docker-Compose ausführen

Im Hauptverzeichnis des Projekts ist nun der Befehl docker-compose up -d auszuführen und die Docker-Magic erledigt den Rest.

Zuerst werden die benötigten Images geladen und anschließend entsprechend der angegebenen Einstellungen konfiguriert. Falls die Docker Toolbox installiert wurde, so kann mittels Kitematic überprüft werden, ob die Container erfolgreich gestartet wurden. Ist dies der Fall, sollte der Aufruf von localhost:80 nun die Contao-Fehlerseite zeigen.

Boo2Docker INFO: Falls Ihr mit boot2docker arbeitet, dann muss der Aufruf über die VM-Url passieren. Default sollte das http://192.168.99.100/ sein.

HTTP 500: Falls der erste Aufruf zu einem HTTP 500 führt, dann muss die unten stehendende Schrittfolge durchgeführt werden.

  1. Aufruf der Container-URL "/web/install.php"
  2. Lizenz akzeptieren
  3. Passwort vergeben
  4. Datenbank konfigurieren (Host: mysql, NUtzer: root, Passwort: root, Datenbank: contaodb)
  5. Aufruf Container-Url "/contao/install"
  6. Konfiguration abschließen

That's it!

Zurück

Einen Kommentar schreiben

Kommentar von xuad |

Very nice tutorial!

Kommentar von Ling |

Super Tutorial. Bei mir bleibt allerdings das Problem das Contao die Backend-JS nicht findet (404). Hattest du das bei dir nicht?

Kommentar von Eric |

Hi Ling,
mit den hier beschriebenen Versionen kann ich deine Frage verneinen.
Bei Gelegenheit werde ich es mal mit den aktuellen Versionen Probieren.

Kommentar von Eric |

Hi Ling,

ich konnte dein Verhalten mit der aktuell Version (4.3.7) reproduzieren, habe aber aktuell keine Lösung dafür. Anscheinend löst nginx im docker das /web/bundles-Directory nicht korrekt auf.
Zumindest kann keine File unterhalb /bundles abgerufen werden.

Kommentar von Eric |

Hi Ling,

ich noch einmal. Abhilfe für die Entwicklung schafft das Umstellen auf apache als Webserver.

Dazu statt webdevops/php-nginx 'webdevops/php-apache-dev' als image verwenden und den container_name auf contao-apache setzen.

Kommentar von Eric |

Hi Ling,

ich habe den Beitrag aktualisiert und einen entsprechenden Vermerk für das Nuten von Apache eingefügt.

Kommentar von Ling |

Hoi Eric, das mit dem Apache macht Sinn. Ich hatte die Symlinks nachgeprüft und die hatten eigentlich gepasst. Danke für deine Antworten!

Kommentar von Andi |

Klasse Tutorial! Ich habe nur ein Problem: ich nutze Contao 4.4 mit Apache. Die Installation verläuft auch super. Allerdings kann ich danach das Frontend nicht aufrufen. Kann Jemand das Problem nachvollziehen? Scheint wohl irgendwas mit dem Document Index und/ oder -Root zu sein...