Laravel + Docker: unsere erfolgreiche Erfahrung

Bild

Worum geht es in diesem Artikel?


In diesem Artikel wird über unsere Erfahrungen mit Docker zum schnellen Konfigurieren einer skalierbaren Entwicklungsumgebung für die Webentwicklung gesprochen. Ich werde kurz auf die Aufgaben eingehen, mit denen wir konfrontiert waren, und auf die Werkzeuge, die zur Lösung dieser Probleme ausgewählt wurden. Der Artikel ist mit dem Tutorial-Symbol gekennzeichnet, da Sie darin Anweisungen zum Bereitstellen der Umgebung finden. Im Vergleich zu ähnlichen Artikeln (Links am Ende des Artikels) gibt es weniger technische Details und mehr Live-Beispiele.

Vor welchen Aufgaben standen wir?


Es kommt vor, dass ein neuer Entwickler eine Verbindung zu einem vorhandenen Team herstellt. Damit er anfangen kann, Aufgaben auszuführen (mit anderen Worten, Code zu schreiben und seine Arbeit zu überprüfen), reicht es nicht aus, den Quellcode abzurufen. Sie benötigen eine Umgebung mit einem Webserver, einem PHP-Compiler und einer Datenbank. Dies ist die Mindestmenge. Je nach Projekt kann die Umgebung Folgendes umfassen:

  • NoSQL
  • Warteschlangenserver
  • Volltextsuchmaschine;
  • Caching-Lösung;
  • Pflücker;
  • Nützliche Entwicklertools

All dies muss lokal beim Entwickler installiert sein und die gleichen Versionen wie die übrigen Teammitglieder haben. Und hier gibt es Schwierigkeiten:

  1. Nach der Installation müssen Sie konfigurieren;
  2. Die Software ist bereits installiert, es handelt sich jedoch um 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.

Um das Problem zu lösen, wurde Docker ausgewählt. Vielleicht liegt der Hauptgrund darin, dass es leicht in die vorhandene Infrastruktur passt. Es funktioniert hervorragend unter Linux und die meisten unserer Entwickler unter diesem Betriebssystem.

Alternative

Laravel bietet eine eigene Lösung für die Organisation einer lokalen Umgebung namens Homestead. Dies ist eine Reihe von Konfigurationen und Skripten für Vagrant, mit deren Hilfe die erforderliche Software in der virtuellen VirtualBox-Maschine bereitgestellt wird. Eine Homestead-Beschreibung würde jedoch den Rahmen dieses Artikels sprengen.

Laradock-Projekt


Am Anfang war dieses Projekt ausschließlich darauf ausgerichtet, Laravel auf Docker zu starten, was sich in seinem Namen widerspiegelt. Aber als die Popularität in der PHP-Community zunahm, begann Laradock andere PHP-Projekte zu unterstützen: Symfony, CodeIgniter, WordPress, Drupal. Das Projekt ist sehr beliebt, wird aktiv unterstützt und entwickelt:

Bild

Laradock ist eine Reihe vorkonfigurierter, unabhängiger Docker-Images, die Sie basierend auf den Anforderungen Ihres Projekts bereitstellen können. Gut dokumentiert und extrem einfach zu bedienen. Um Komponenten zu starten, listen wir sie einfach auf:

docker-compose up apache2 php-fpm mysql phpmyadmin 

oder

 docker-compose up nginx php-fpm mariadb adminer 

Hinweis : Es ist nicht erforderlich, php-fpm explizit anzugeben, da der Container beim Starten des php-fpm-Container-Webservers automatisch gestartet wird.

Das Repository verfügt über 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 : Selen, Jenkins, ElasticSearch, Kibana, Gitlab, Mailhog, MailDev, Laravel Echo, Phalcon
  • Tools : PHP CLI, Komponist, Git, Linuxbrew, Knoten, V8JS, Gulp, SQLite, xDebug, Gesandter, Bereitsteller, Vim, Garn, Drush

Anforderungen und Ausgangsbedingungen


Sie benötigen:

  • Git
  • Docker
und die Konsole, in der die Befehle ausgeführt werden. Die Docker-Website enthält eine umfassende Dokumentation zur Installation für verschiedene Plattformen (Links finden Sie auch am Ende des Artikels). Wenn Sie git noch nicht installiert haben, tun Sie dies gemäß den Anweisungen auf der offiziellen Website.

Git-Repository-Architektur: Hauptprojekt und Laradock


Laradock kann in zwei Versionen verwendet werden:

  • Separates Laradock für jedes Projekt
  • Ein Laradock für viele Projekte

Im ersten Fall sieht die Verzeichnisstruktur folgendermaßen aus:

Bild

Im zweiten so:

Bild

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

Die zweite wichtige Frage lautet: Erstellen Sie ein gemeinsames Repository oder zwei separate? Mit anderen Worten, muss ich mit dem Projekt Laradock-Dateien zum Haupt-Repository hinzufügen? Die Antwort ist notwendig, jedoch in Form eines Submoduls zum Haupt-Repository. Die Docker-Umgebung ist ein Hilfsteil des Projekts und nicht immer erforderlich. Auf Staging- und Produktionsservern ist dies beispielsweise nicht erforderlich. Wenn Sie die Bereitstellung über Git organisieren, werden Umgebungsdateien nicht dort ankommen.

Der Name des Umgebungsverzeichnisses


Standardmäßig verwenden Containernamen den Namen des aktuellen Verzeichnisses als Suffix: laradock_nginx_1, laradock_mysql_1 usw. Um Datenverwechslungen innerhalb von Volumes zu vermeiden, sind für Ihre Umgebungen eindeutige Verzeichnisnamen erforderlich. Dies ist leicht zu erreichen, wenn wir uns an das von uns gewählte Schema halten: Fügen Sie den Projektnamen zum Namen des Verzeichnisses mit der Umgebung hinzu, zum Beispiel:

  • Laradock-Mysite
  • laradock-proj1
  • Laradock-Mobapp

Das heißt, das Präfix "laradock" und der Name des Verzeichnisses mit dem Projekt durch einen Bindestrich.

Ein Site-Start


Wo beginnen wir mit dem Start der Website?

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

Projekteinstellungen


Laradoc enthält eine Beispiel-Umgebungskonfigurationsdatei. Wir erstellen eine Kopie für unser Projekt.

 cp env-example .env 

Die .env-Optionen sind ziemlich offensichtlich. In den Parametern legen wir den Datenbankzugriff, die E-Mail-Parameter und den Zugriff auf Dienste von Drittanbietern fest, sofern wir diese in unserem Projekt verwenden.

Das Starten und Stoppen von Umgebungsanwendungen erfolgt über Docker-Compose-Befehle

 docker-compose up 

und

 docker-compose stop 

Bei Bedarf können Sie den Download der erforderlichen Dienste im Startbefehl aufrufen. Beispielsweise werden drei zusätzliche Dienste auf diese Weise geladen:

 docker-compose up -d nginx percona adminer 

Sie können diesen Befehl in einem separaten Shell-Skript entfernen, damit Sie ihn nicht jedes Mal manuell eingeben müssen.

Das Startskript kann "start.sh" heißen oder wie auch immer Sie möchten:

 #!/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 haben die Dateien möglicherweise den falschen Eigentümer oder unzureichende Zugriffsrechte.

Symptome : Wenn Sie versuchen, die Umgebung mit dem Befehl docker-compose up zu starten, oder mit dem Befehl docker-compose exec ... in den Container wechseln, wie im obigen Beispiel, treten ähnliche Fehler auf
/ var / www / vendor existiert nicht und konnte nicht erstellt werden
Der Stream oder die Datei "/var/www/storage/logs/laravel.log" konnte nicht geöffnet werden: Stream konnte nicht geöffnet werden: Berechtigung verweigert
Der Grund für den Fehler liegt darin, dass im Konfigurationsbeispiel für die Docker-Umgebung die Benutzer-ID und die Benutzergruppe standardmäßig fest codiert sind (1000 bzw. 1000).

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

Fehlerkorrekturverfahren


Überprüfen Sie den Benutzer und die Gruppe in den Verzeichnissen:

 ls -la /var/www 

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

Wenn anstelle von laradock: laradock der Eigentümer und die Gruppe durch Zahlen angegeben werden (1001: 1001, 1001: 13002 und ähnliche Kombinationen), müssen Sie Änderungen an den Einstellungsdateien vornehmen.

Wenn Ihre Benutzer-ID und Benutzergruppe (/ etc / passwd, / etc / group) nicht mit den angegebenen übereinstimmen, müssen Sie für einen korrekten Betrieb Änderungen an den folgenden Dateien vornehmen:

/ laradock / php-fpm / Dockerfile *, in Zeile

" RUN usermod -u 1000 www-data "

1000 durch Benutzer-ID ersetzen

/laradock/.env in Zeilen

WORKSPACE_PUID = 1000
WORKSPACE_PGID = 1000

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

/ laradock / workspace / Dockerfile * in 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 erneut und starten Sie dann den Container:

 docker-compose build workspace php-fpm 

Wenn Sie auf ein solches Problem stoßen, müssen Sie die Zugriffsrechte auf die Verzeichnisse des Laravel-Frameworks überprüfen. Festlegen von Berechtigungen für Verzeichnisse, 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 Ihr Standort in der Produktion nach einem sicheren Protokoll. Es ist sinnvoll, die lokale Entwicklung auf https durchzuführen. Dies ist nicht sehr schwierig. Sie benötigen ein SSL-Zertifikat und kleine Einstellungen. Dieser Artikel wird ausführlicher unter Ausstellen eines selbstsignierten SSL-Zertifikats beschrieben .

Mehrere Websites ausführen


Alle Projekte arbeiten also nach dem Schema „Ein Laradock - ein Projekt“. Ein Projekt ist jedoch nicht unbedingt ein Standort. Manchmal müssen Sie mehrere Sites gleichzeitig ausführen, da diese miteinander interagieren.

In diesem Fall können nicht zwei Laradocks gleichzeitig gestartet werden, da in jedem von ihnen ein Webserver gestartet wird, der Port 80 abhört - es kommt zu einem Konflikt. Aber wir haben Zugriff auf Nginx-Konfigurationsdateien. Konfigurieren wir es.

Aber zuerst ein Hinweis zu Architektur und Git-Repositories. Bei mehreren Sites verwenden wir die Verzeichnisstruktur aus der zweiten Option:

Bild

Das Git-Repository mit Laradock ist nicht länger ein Submodul eines anderen Repositorys, sondern wird völlig unabhängig.

Die Webserverkonfiguration wird am Beispiel von nginx gezeigt. Gehen Sie im Laradock-Verzeichnis zu nginx / sites. Wir sehen die Datei 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; 

sollte aber so sein:

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

Wichtig!
Schauen Sie sich den Inhalt von .gitignore in diesem Verzeichnis an. Alle * .conf-Dateien außer default.conf werden ignoriert. Es ist erforderlich, erstellte Dateien zu Ausnahmen hinzuzufügen, dh sie nicht zu ignorieren.
Konfigurieren Sie crontab so, dass der Laravel-Scheduler ordnungsgemäß funktioniert. Fügen Sie dazu die Pfade in die Datei workspace / crontab / laradock ein:

 * * * * * 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 eine erfolgreiche Kommunikation von Standorten in Containern Aliase hinzu. In der Datei docker-compose.yml finden wir den Abschnitt

 ### NGINX Server ### 

und fügen Sie jeder Domain einen Alias ​​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 offen. Alles in Analogie zur SSL-Organisation für eine Domain, die im obigen Abschnitt beschrieben wird. Fügen Sie einen Kommentar hinzu, wenn Sie Schwierigkeiten haben. Ich werde ihn beantworten oder die Funktionen in einem separaten Artikel beschreiben.

Zusätzliche Funktionen


In der Docker-Umgebung können Sie die benötigten Anwendungen konfigurieren. Die Grundkonfiguration von Laradoc enthält bereits Anwendungspakete:

WebanwendungsserverApache2, Caddy
Caching von WebanwendungenNginx, Lack
Datenbanken und Caching-DiensteMongo, Redis, Mssql, MySQL, Percona, Mariadb, Elasticsearch, Memcached, Redis, RethinkDb, Aerospike
Webschnittstellen zu DatenbankenAdministrator, PhpMyAdmin
Load BalancerHaproxy
Programmierung, Shells und FrameworksPHP, Python, Symfony, Laravel, Node
DienstprogrammePHP, Python, Symfony, Laravel, Node
PaketmanagerGarnkomponist
TestwerkzeugJenkins
Konfigurationswerkzeug für die AnwendungsinfrastrukturTerraform

Betrachten Sie kurz die am häufigsten genannten Anwendungen.

Rabbitmq

Der Mechanismus des Messaging zwischen Anwendungen. Der Entwickler dieses Pakets bestimmt seinen Zweck wie folgt: "Warteschlangenmanager", "Nachrichtenbroker" oder "Nachrichtenwarteschlange".

Eine Nachricht kann einen beliebigen Datensatz enthalten.

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

Redis

Erstellen eines Datencaches im RAM. Es kann auch als Data Warehouse zusammen mit einem Datenbankserver verwendet oder ersetzt werden.

Redis unterstützt Zeichenfolgen, Listen, Mengen, geordnete Mengen und Hash-Tabellen.
Der Hauptnachteil von Radieschen ist der Datenverlust bei der RAM-Bereinigung, beim Neustart des Betriebssystems oder beim Ausschalten des Geräts. Radieschenentwickler stellten sich ein ähnliches Szenario vor: Im AOF-Modus (Nur Datei anhängen) werden der Festplattendatei jede Sekunde Daten hinzugefügt.

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

Materielle Links


Laravel

Docker

Laradock

Laravel Gehöft

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

Docker + Laravel =

Fazit


Mit Laravel + Docker für die Webentwicklung haben wir den wertvollsten Preis gewonnen: Zeit.

Nach dem Entwicklungsszenario in WAMP oder LAMP mussten wir Zeit verbringen
nutzlos und nirgendwo.

Sowohl WAMP als auch LAMP erfordern von einem PHP-Entwickler ein gewisses Maß an Fähigkeiten in Bereichen, die nicht direkt mit der Webentwicklung zusammenhängen: Konfigurieren eines Webservers, Konfigurieren von PHP-Parametern usw.

Die Verwendung von Laradoc ermöglicht es uns, die gesamte Projektumgebung nach der Erstellung in kürzester Zeit an einem neuen Arbeitsplatz bereitzustellen. Und mach dich sofort an die Arbeit.

Zusammenfassend stellen wir die Vorteile der Verwendung von Laradoc fest:

  • Einheitliche Infrastruktur an jedem Arbeitsplatz: Webserver, SQL Server, eine Reihe von Frameworks und Bibliotheken;
  • rationelle Nutzung der Arbeitszeit;
  • Schneller Einstieg eines neuen Entwicklers in das Projekt.

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

Source: https://habr.com/ru/post/de439346/


All Articles