Kontakt aufnehmen

Docker-Container für Laravel-Anwendungen

Im folgenden wollen wir bespielhaft ein Laravel-Projekt für die Nutzung mit zwei Docker-Containern konfigurieren.
Ein Container soll einen Apache-Server mit Php enthalten, der andere Container soll einen MySql-Server enthalten. Beide Container sollen miteinander kommunizieren können.

Voraussetzungen:

  • Docker installiert und gestartet
  • Grundkenntnisse in der Benutzung von Docker und docker-compose
  • Grundkenntnisse bei der Benutzung von Apache-Servern

1. Container für Apache mit php erstellen

Zu Beginn brauchen wir eine Dockerfile-Datei, in der wir unser Image für den Apache-Php-Server konfigurieren. Die Dateil wird hier angelegt: docker/php/Dockerfile

FROM php:7.3.2-apache

RUN mkdir /srv/code

COPY docker/php/000-default.conf /etc/apache2/sites-available/000-default.conf

RUN chown -R www-data:www-data /srv/code
RUN a2enmod rewrite
RUN docker-php-ext-install pdo pdo_mysql
Außerdem brauchen wir noch eine Config-Datei den Apache-Server, in der unter anderem der Pfad zu unserem Laravel-Startverzeichnis eingestellt wird.

docker/php/000-default.conf
‹VirtualHost *:80›
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ErrorLog ${APACHE_LOG_DIR}/error.log

    DocumentRoot /srv/code/public

    ‹Directory "/srv/code/public"›
        AllowOverride all
        Require all granted
    ‹/Directory›
‹/VirtualHost›

Dockerfile im Detail

FROM php:7.3.2-apache
Hier verwenden wir ein bereits bestehendes Image, das beim Build vom Docker-Hub geladen wird. Dieses Image enthält einen Apache-Server auf dem Php installiert ist.

RUN mkdir /srv/code
Im neuen Image wird der angegebene Order für unseren Programm-Code erstellt.

COPY docker/php/000-default.conf /etc/apache2/sites-available/000-default.conf
Die vorher angelegte Config-Datei wird in das entsprechende Verzeichnis des Apache-Servers kopiert.

RUN chown -R www-data:www-data /srv/code
Die Rechte für den neuen Ordner werden gesetzt.

RUN a2enmod rewrite
Das Rewrite-Modul wird aktiviert, damit die .htaccess-Datei funktioniert.

RUN docker-php-ext-install pdo pdo_mysql
Die PDO-Erweiterung wird installiert.

2. Dienste definieren per Docker-Compose

Die Dockerfile von oben würde bereits ausreichen, um ein Image für unseren Php-Server zu erzeugen. Wir wollen jedoch außerdem noch einen Container mit einem Mysql-Server starten, der mit dem Php-Container kommunizieren kann. Daher legen wir in unserem docker-Verzeichnis eine docker-compose.yml-Datei an, die uns hilft, alle Container, die wir für unsere Anwendung brauchen zu organisieren.

version: '3.3'
services:
  php:
    build:
      context: .
      dockerfile: php/Dockerfile
    image: php-laravel
    ports:
      - 8000:80
    volumes:
      - ./..:/srv/code

Damit lässt sich eine Standard-Laravel-Anwendung bereits starten. Wichtig sind zu beachten sind hier folgende Details:

  • Mit context: . wird der Build-Kontext auf das aktuelle Verzeichnis gelegt - also das Docker-Unterverzeichnis der Anwendung.
  • Unter ports wird mit 8000:80angegeben, dass der Php-Container, der innerhalb auf Port 80 läuft, nach außen auf Port 8000 erreichbar sein soll. So können wir dann im Browser über localhost:8000 unsere Anwendung aufrufen.
  • volumes: gibt an, welche lokalen Verzeichnisse mit dem laufenden Container synchronisiert werden sollen. Das ist wichtig damit innerhalb des Containers immer der aktuelle Source-Code unserer Anwendung verfügbar ist. Hier geben wir mit . an, dass das komplette Root-Verzeichnis der Anwendung innerhalb des Containers im Pfad /srv/code verfügbar haben wollen.
Jetzt fehlt fürs erste noch ein Container für die Datenbank.

3. Mysql einbinden

Wir erweitern die docker-compose.yml, um ein Datenbank-Image hinzuzufügen

version: '3.3'
services:
    php:
        build:
            context: .
            dockerfile: php/Dockerfile
        image: php-laravel
        ports:
            - 8000:80
        volumes:
            - ./..:/srv/code
        links:
            - db
        environment:
            DB_HOST: db
            DB_DATABASE: test
            DB_USERNAME: test
            DB_PASSWORD: test

        db:
        image: mysql:5.7
        ports:
            - 3306:3306
        environment:
            MYSQL_DATABASE: test
            MYSQL_USER: test
            MYSQL_PASSWORD: test
            MYSQL_ROOT_PASSWORD: test

Es genügt uns ein bereits bestehendes Image für MySql ohne eigene Anpassungen. Eine extra Dockerfile wird also nicht benötigt. Auch hier wird wieder ein Port nach außen freigegeben: 3306:3306. Wichtig ist, dass wir beide Container richtig verlinken. Da das Mysql-Image hier den Namen db bekommen hat, können wir diesen per links:Deklaration einfach mit dem Php-Container verknüpfen. Außerdem müssen wir noch den Datenbank-Container noch als Datenbank-Host beim Php-Container registrieren: DB_HOST: db.

Das war's: beide Container werden jetzt per command docker-compose build erzeugt. Jetzt muss man nur etwas Geduld haben, denn das erste Erzeugen der Images kann etwas länger Dauern.

Wenn die Container einmal richtig erzeugt wurden, können wir sie jetzt immer mit docker-compose up starten und mit docker-compose down beenden.

4. Ausblick: weitere Dienste einbinden

Das obige Beispiel zeigt es schon: eine der großen Stärken von Docker ist die Möglichkeit, mehrere Dienste miteinander in einer einzigen Datei (docker-compose.yml)zu verknüpfen und zu starten. Deshalb wäre es jetzt relativ einfach, noch weitere Dienste hinzuzufügen. Das könnte zum Beispiel ein Node-Server, ein Mailing-Dienst oder ein Deployment-Server sein.

Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Cookie-Einstellungen

Helfen Sie dabei, uns noch besser zu machen. Wir nutzen Cookies und ähnliche Technologien, um die Website auf Ihre Bedürfnisse anzupassen. Zur Datenschutzerklärung

Auswahl speichern