Laravel + Docker: unsere erfolgreiche Erfahrung

Published on February 08, 2019

Laravel + Docker: unsere erfolgreiche Erfahrung

  • Tutorial
Bild

Worum geht es in diesem Artikel?


Der Artikel wird über unsere Erfahrungen bei der Verwendung von Docker berichten, um schnell eine skalierbare Entwicklungsumgebung für die Webentwicklung zu konfigurieren. Ich werde kurz auf die Aufgaben eingehen, mit denen wir konfrontiert waren, und die Tools, die zur Lösung dieser Probleme ausgewählt wurden. Der Artikel ist mit dem Lernprogramm-Symbol gekennzeichnet, da Sie Anweisungen zur Bereitstellung der Umgebung finden. Im Vergleich zu ähnlichen Artikeln (Links am Ende des Artikels) gibt es weniger technische Details und lebendigere Beispiele.

Welchen Herausforderungen standen wir gegenüber?


Es kommt vor, dass sich ein neuer Entwickler mit einem vorhandenen Team verbindet. Damit er mit der Ausführung von Aufgaben beginnen kann (mit anderen Worten, Code schreiben und seine Arbeit überprüfen), reicht es nicht aus, den Quellcode zu erhalten. Sie benötigen eine Umgebung, die einen Webserver, einen PHP-Compiler und eine Datenbank umfasst. Dies ist die Mindestmenge. Je nach Projekt kann die Umgebung Folgendes umfassen:

  • NoSQL;
  • Warteschlangenserver;
  • Volltextsuchmaschine;
  • Caching-Lösung;
  • Sammler
  • Nützliche Entwicklerwerkzeuge;

All dies sollte lokal vom Entwickler installiert werden und dieselbe Version wie die übrigen Teammitglieder haben. Und hier gibt es Schwierigkeiten:

  1. Nach der Installation müssen Sie konfigurieren;
  2. Die Software ist bereits installiert, aber es ist eine andere Version.
  3. Das ist lang;

Und die Tatsache, dass Entwickler auf verschiedenen Plattformen (Windows, Linux, OS X) arbeiten, macht die Sache noch komplizierter.

Docker wurde ausgewählt, um das Problem zu lösen. Möglicherweise liegt der Hauptgrund darin, dass es problemlos in die vorhandene Infrastruktur passt. Es funktioniert hervorragend unter Linux und die meisten unserer Entwickler sind auf diesem Betriebssystem installiert.

Alternative

Laravel bietet eine eigene Lösung für die Organisation einer lokalen Umgebung namens Homestead. Dies ist eine Reihe von Konfigurationen und Skripts für Vagrant, mit deren Hilfe die erforderliche Software in einer virtuellen VirtualBox-Maschine bereitgestellt wird. Die Beschreibung von Homestead liegt jedoch außerhalb des Rahmens dieses Artikels.

Projekt Laradock


Zu Beginn war das Projekt ausschließlich darauf ausgerichtet, Laravel on Docker zu starten, was sich in seinem Namen widerspiegelt. Als jedoch die Popularität in der PHP-Community wuchs, begann Laradock, andere PHP-Projekte zu unterstützen: Symfony, CodeIgniter, WordPress und Drupal. Das Projekt ist sehr beliebt, wird aktiv unterstützt und entwickelt:

Bild

Laradock ist ein Satz vorkonfigurierter, unabhängiger Docker-Images, die je nach den Anforderungen Ihres Projekts verbunden werden können. Gut dokumentiert und extrem einfach zu bedienen. Um die Komponenten auszuführen, listen Sie sie einfach auf:

docker-compose up apache2 php-fpm mysql phpmyadmin

oder

docker-compose up nginx php-fpm mariadb adminer

Hinweis : Sie müssen php-fpm nicht explizit angeben, da der Container beim Starten des Webservers der php-fpm-Container automatisch gestartet wird.

Das Repository enthält mehr als 48 Container, darunter:

  • Datenbanken : MySQL, MariaDB, Percona, MongoDB, MSSQL, PostgreSQL
  • Datenbankverwaltung : PhpMyAdmin, Adminer, PgAdmin
  • Webserver : Nginx, Apache2, Caddy
  • PHP-Compiler : PHP FPM, HHVM
  • Verschiedenes : Selenium, Jenkins, ElasticSearch, Kibana, Gitlab, Mailhog, MailDev, Laravel Echo, Phalcon
  • Tools : PHP CLI, Composer, Git, Linuxbrew, Knoten, V8JS, Gulp, SQLite, xDebug, Envoy, Deployer, Vim, Yarn, Drush

Anforderungen und Anfangsbedingungen


Sie benötigen:

  • Git
  • Docker
und die Konsole, in der Befehle ausgeführt werden. Die Docker-Website bietet umfassende Installationsdokumentation für verschiedene Plattformen (Links befinden sich auch am Ende des Artikels). Wenn Sie Git noch nicht installiert haben, befolgen Sie die Anweisungen auf der offiziellen Website.

Git-Repository-Architektur: Hauptprojekt und Laradock


Laradock kann in zwei Versionen verwendet werden:

  • Getrenntes Laradock für jedes Projekt
  • Eine große Sache bei vielen Projekten

Im ersten Fall sieht die Verzeichnisstruktur folgendermaßen aus:

Bild

Im zweiten Fall:

Bild

Wir verwenden immer die erste Option: ein Projekt - ein Laradock. Dieser Ansatz bietet die Flexibilität und Unabhängigkeit eines Projekts von einem anderen.

Die zweite wichtige Frage: Erstellen Sie ein gemeinsames Repository oder zwei separate? Muss ich mit dem Projekt also Laradock-Dateien zum Haupt-Repository hinzufügen? Die Antwort ist notwendig, jedoch in Form eines Untermoduls für das Haupt-Repository. Die Docker-Umgebung ist ein unterstützender Teil des Projekts und ist nicht immer erforderlich. Auf Staging- und Produktionsservern ist dies beispielsweise nicht erforderlich. Bei der Bereitstellung über git werden die Umgebungsdateien nicht dort angezeigt.

Name des Umgebungsverzeichnisses


Standardmäßig verwenden die Namen der Container das aktuelle Verzeichnis als Suffix: Laradock_nginx_1, Laradock_mysql_1 usw. Um zu vermeiden, dass Daten in Volumes verwirrt werden, benötigen Sie eindeutige Verzeichnisnamen für Ihre Umgebungen. Dies ist leicht zu erreichen, wenn Sie sich an das gewählte Schema halten: Fügen Sie den Namen des Projekts zum Namen des Verzeichnisses mit der Umgebung hinzu. Beispiel:

  • Laradock-MySite
  • Laradock-Proj1
  • Laradock-Mobapp

das Präfix „Laradock“ und der Name des Projektverzeichnisses durch einen Bindestrich.

Single Site Launch


Wie starten wir den Website-Start?

Wie im dritten Kapitel erwähnt, verwenden wir Laradoc, um die Umgebung zu erstellen.
Der Startvorgang besteht aus den Schritten zum Einrichten der Umgebung und der Laravel-Anwendung.

Projekteinstellungen


Laradoc verfügt über eine Beispieldatei für die Umgebungskonfiguration. Wir erstellen eine Kopie davon für unser Projekt.

cp env-example .env

Die .env-Optionen sind ziemlich intuitiv. In den Parametern legen wir den Zugriff auf Datenbanken, E-Mail-Parameter und den Zugriff auf Dienste von Drittanbietern fest, wenn wir sie in unserem Projekt verwenden.

Das Starten und Stoppen von Umgebungsanwendungen erfolgt mit Docker-Compose-Befehlen.

docker-compose up

und

docker-compose stop

Bei Bedarf können Sie im Startteam die erforderlichen Dienste laden. Zum Beispiel werde ich drei zusätzliche Dienste laden:

docker-compose up -d nginx percona adminer

Sie können diesen Befehl in einem separaten Shell-Skript entfernen, um ihn nicht jedes Mal manuell einzugeben.

Das Startskript kann als "start.sh" oder nach Belieben bezeichnet werden:

#!/usr/bin/env bash
docker-compose up -d nginx percona adminer;

Das Service-Stop-Skript kann als "stop.sh" oder "down.sh" bezeichnet werden:

#!/usr/bin/env bash
docker-compose stop;

Bild

Projektinitialisierung


Der Übergang zur Containerumgebung wird vom Befehl ausgeführt

docker-compose exec --user=laradock workspace bash

Bereitstellungsfehler


Bei der Installation von Laradoc in einer Linux-Umgebung liegt möglicherweise ein Problem mit den Dateiberechtigungen vor.

In diesem Fall sind die Dateien möglicherweise der falsche Besitzer oder unzureichende Zugriffsrechte.

Symptome : Wenn Sie versuchen, die Umgebung mit dem Befehl "docker-compose up" zu starten, oder wechseln Sie mit dem Befehl "docker-compose exec ..." in den Container
/ var / www / vendor erstellt
Stream oder Datei "/var/www/storage/logs/laravel.log" konnte nicht gestreamt werden: Berechtigung verweigert
Der Grund für den Fehler liegt darin, dass in der Beispielkonfiguration der Docker-Umgebung die Benutzer-ID und die Benutzergruppe genau angegeben werden. Der Standardwert ist 1000 bzw. 1000.

Wenn diese IDs in unserem Unix-System bereits von anderen Entitäten belegt sind, müssen Sie die Konfiguration manuell bearbeiten.

Das Verfahren zur Beseitigung von Fehlern


Wir prüfen die Benutzer- und Gruppenverzeichnisse:

ls -la /var/www

Datei- und Verzeichnisbesitzer (Benutzer und Benutzergruppe) müssen Laradock Laradock sein.

Wenn anstelle von Laradock: Laradock der Besitzer und die Gruppe durch Nummern (1001: 1001, 1001: 13002 und ähnliche Kombinationen) gekennzeichnet sind, müssen Sie Änderungen an den Konfigurationsdateien vornehmen.

Wenn Ihre Benutzer-ID und Benutzergruppen-ID (/ etc / passwd, / etc / group) nicht mit den angegebenen übereinstimmen, müssen Sie zur korrekten Arbeit Änderungen an den folgenden Dateien

vornehmen : / laradock / php-fpm / Dockerfile * in der Zeile

RUN usermod -u 1000 www-data "

Ersetzen Sie 1000 mit der Benutzer-ID

/laradock/.env in Zeilen

WORKSPACE_PUID = 1000
WORKSPACE_PGID = 1000

WORKSPACE_PUID - Geben Sie Ihre Benutzer-ID, WORKSPACE_PGID - Benutzergruppen-ID an

/ laradock / workspace / Dockerfile *, in den Zeilen

ARG PUID = 10315
ARG PGID = 10004

PUID - Benutzer-ID, PGID - Benutzergruppen-ID

Nachdem Sie die Änderungen vorgenommen haben, erstellen Sie den Arbeitsbereich und PHP-fpm neu und starten den Container:

docker-compose build workspace php-fpm

Wenn ein solches Problem auftritt, müssen Sie die Zugriffsrechte für die Laravel-Framework-Verzeichnisse überprüfen. Legen Sie Berechtigungen für Verzeichnisse fest, für die Schreibberechtigungen erforderlich sind:

sudo chgrp -R www-data storage bootstrap/cache; sudo chmod -R ug+rwx storage bootstrap/cache

SSL-Zertifikate und https


Höchstwahrscheinlich funktioniert Ihre Site in der Produktion unter einem sicheren Protokoll. Es ist sinnvoll und lokale Entwicklung führt zu https. Dies ist nicht sehr schwierig, Sie benötigen ein SSL-Zertifikat und kleine Einstellungen. Details finden Sie in diesem Artikel So stellen Sie ein selbstsigniertes SSL-Zertifikat aus .

Mehrere Standorte ausführen


Daher arbeiten alle Projekte nach dem Schema "One Laradock - One Project". Ein Projekt ist jedoch nicht notwendigerweise eine Site. Manchmal müssen Sie mehrere Sites gleichzeitig ausführen, da diese miteinander interagieren.

In diesem Fall werden nicht zwei Laradock gleichzeitig gestartet, da auf jedem von ihnen ein Webserver ausgeführt wird, der auf Port 80 überwacht. Dies führt zu einem Konflikt. Aber wir haben Zugriff auf die Nginx-Konfigurationen, wir konfigurieren sie.

Zunächst aber ein Hinweis zu Architektur und Git-Repositories. Bei mehreren Standorten verwenden wir die Verzeichnisstruktur aus der zweiten Option:

Bild

Git-Repository mit Laradock ist kein Submodul eines anderen Repository mehr, sondern wird völlig unabhängig.

Die Webserver-Konfiguration wird am Beispiel von nginx angezeigt. Gehen Sie im Laradock-Verzeichnis zu nginx / sites. Wir sehen die default.conf und mehrere * .conf.example-Dateien. Basierend auf default.conf oder Beispieldateien erstellen wir Konfigurationen für Sites.

Achten Sie auf den Dokumentenstamm. Standardmäßig sieht die Root-Direktive folgendermaßen aus:

root /var/www/public;

und sollte dies mögen:

root /var/www/site-1/public;
root /var/www/site-2/public;

Es ist wichtig!
Sehen Sie sich den Inhalt von .gitignore in diesem Verzeichnis an. Alle * .conf-Dateien außer default.conf werden ignoriert. Sie müssen die erstellten Dateien zu den Ausnahmen hinzufügen, d. H. Ignorieren Sie sie nicht.
Konfigurieren Sie crontab so, dass der Laravel-Scheduler ordnungsgemäß arbeiten kann. Fügen Sie dazu in der Datei workspace / crontab / laradock die folgenden Pfade hinzu:

* * * * * laradock /usr/bin/php /var/www/site-1/artisan schedule:run >> /dev/null 2>&1
* * * * * laradock /usr/bin/php /var/www/site-2/artisan schedule:run >> /dev/null 2>&1

Fügen Sie für erfolgreiche Kommunikationssites in Containern Aliase hinzu. In der Datei docker-compose.yml finden wir den Abschnitt

### NGINX Server ###

und fügen Sie einen Alias ​​für jede Domäne hinzu:

Bild

Dies ist alles, was Sie tun müssen, um ein Projekt mit mehreren Domänen auszuführen. Außerhalb des Artikels bleibt die Frage der Organisation von https für mehrere Domains bestehen. Alle analog zu der Organisation von ssl für eine Domäne, die im obigen Abschnitt beschrieben wird. Fügen Sie bei Schwierigkeiten einen Kommentar hinzu, ich werde ihn beantworten oder die Funktionen in einem separaten Artikel beschreiben.

Zusätzliche Funktionen


Es ist möglich, die benötigten Anwendungen in der Docker-Umgebung zu konfigurieren. Die Grundkonfiguration von Laradoc enthält bereits Anwendungspakete:

Webanwendungsserver Apache2-Caddy
Zwischenspeicherung von Webanwendungen Nginx, Lack
Datenbanken und Caching-Dienste Mongo, Redis, Mssql, Mysql, Percona, Mariadb, Elasticsearch, Memcached, Redis, RethinkDb, Aerospike
Webschnittstellen zu Datenbanken Administrator, phpMyAdmin
Balancer laden Haproxy
Программирование, программные оболочки и фреймворки Php, Python, Symfony, Laravel, Node
Утилиты Php, Python, Symfony, Laravel, Node
Менеджер пакетов Yarn, Composer
Средство тестирования Jenkins
Средство конфигурирования инфраструктурой приложения Terraform

Berücksichtigen Sie kurz die am häufigsten genannten Anwendungen.

RabbitMQ

Eine Messaging-Engine zwischen Anwendungen. Der Entwickler dieses Pakets definiert seine Bezeichnung als "Warteschlangenmanager", "Message Broker" (Message Broker) oder "Message Queue" (Nachrichtenwarteschlange).

Eine Nachricht kann einen beliebigen Datensatz enthalten.

Im Szenario der Arbeit mit dem Warteschlangenmanager wird die Nachricht von einer Anwendung - dem Absender - gespeichert, bis eine andere Anwendung (Empfänger) eine Verbindung herstellt und die Nachricht aus der Warteschlange nimmt.

Wiederherstellen

Erstellen eines In-Memory-Datencaches. Es kann auch als Data Warehouse zusammen mit dem Datenbankserver oder durch Ersetzen verwendet werden.

Redis unterstützt Strings, Listen, Sets, sortierte Sets und Hashtabellen.
Der Hauptnachteil von Radieschen ist der Datenverlust beim Löschen des Arbeitsspeichers, beim Neustart des Betriebssystems oder beim Ausschalten der Hardware. Radish-Entwickler haben ein ähnliches Szenario bereitgestellt: Im AOF-Modus (Anhängen nur Datei) werden der Datenträger jede Sekunde Daten hinzugefügt.

Der Hauptvorteil von Radieschen ist der schnellste Zugriff auf Daten mit der Geschwindigkeit des RAM-Zugriffs.

Links zu Materialien


Laravel

Docker

Laradock

Laravel Homestead

"So stellen Sie ein selbstsigniertes SSL-Zertifikat aus und lassen Sie Ihren Browser darauf vertrauen"

Docker + Laravel =

Fazit


Nachdem wir die Laravel + Docker-Lösung für die Webentwicklung ausgewählt haben, haben wir den wertvollsten Preis gewonnen: Zeit.

Nach dem Entwicklungsszenario in WAMP oder LAMP mussten wir
unnötig und nirgendwo Zeit verschwenden .

Sowohl WAMP als auch LAMP erfordern eine bestimmte Qualifizierung eines PHP-Entwicklers in Bereichen, die nicht direkt mit der Webentwicklung zusammenhängen: Konfigurieren eines Webservers, Festlegen von PHP-Parametern usw.

Mit Laradoc können Sie die gesamte Projektumgebung erstellen. Mindestzeit für den Einsatz an einem neuen Arbeitsplatz. Und gleich loslegen.

Abschließend stellen wir die Vorteile der Verwendung von Laradoc fest:

  • an jedem Arbeitsplatz einheitliche Infrastruktur: ein Webserver, ein SQL-Server, eine Reihe von Frameworks und Bibliotheken;
  • rationelle Arbeitszeitnutzung;
  • Schneller Einstieg eines neuen Entwicklers in das Projekt.

Schreiben Sie in den Kommentaren, wie Ihr Team mit der Umgebung arbeitet, welche Tools und Ansätze Sie verwenden.