Laravel + Docker: notre expérience réussie

image

De quoi parle cet article


Cet article parlera de notre expérience avec Docker pour configurer rapidement un environnement de développement évolutif pour le développement Web. Je parlerai brièvement des tâches auxquelles nous avons été confrontés et des outils choisis pour résoudre ces problèmes. L'article est marqué de l'icône du didacticiel, car vous y trouverez des instructions sur le déploiement de l'environnement. Par rapport à des articles similaires (liens à la fin de l'article), il y aura moins de détails techniques et plus d'exemples en direct.

À quelles tâches avons-nous été confrontées?


Il arrive qu'un nouveau développeur se connecte à une équipe existante. Pour qu'il puisse commencer à effectuer des tâches (en d'autres termes, écrire du code et vérifier son travail), il ne suffit pas d'obtenir le code source. Vous avez besoin d'un environnement qui comprend un serveur Web, un compilateur php et une base de données. Ceci est l'ensemble minimum. Selon le projet, l'environnement peut inclure:

  • NoSQL
  • Serveur de file d'attente
  • Moteur de recherche en texte intégral;
  • Solution de mise en cache;
  • Pickers;
  • Outils de développement utiles

Tout cela doit être installé localement chez le développeur, et être les mêmes versions que le reste des membres de l'équipe. Et ici, il y a des difficultés:

  1. Après l'installation, vous devez configurer;
  2. Le logiciel est déjà installé, mais il s'agit d'une version différente;
  3. Cela fait longtemps;

Et le fait que les développeurs travaillent sur différentes plateformes (windows, linux, os x) complique encore les choses.

Pour résoudre le problème, Docker a été choisi. La raison principale est peut-être qu'elle s'intègre facilement à l'infrastructure existante. Cela fonctionne très bien sur Linux, et la plupart de nos développeurs sur ce système d'exploitation.

Alternative

Laravel fournit sa propre solution pour organiser un environnement local appelé Homestead. Il s'agit d'un ensemble de configurations et de scripts pour Vagrant, à l'aide duquel le logiciel nécessaire est déployé dans la machine virtuelle VirtualBox. Mais une description de Homestead dépasse le cadre de cet article.

Projet Laradock


Au début, ce projet visait uniquement à lancer Laravel sur Docker, ce qui se reflète dans son nom. Mais à mesure que la popularité augmentait dans la communauté php, Laradock a commencé à soutenir d'autres projets php: Symfony, CodeIgniter, WordPress, Drupal. Le projet est vraiment populaire, activement soutenu et développé:

image

Laradock est un ensemble d'images Docker indépendantes préconfigurées que vous pouvez monter en fonction des exigences de votre projet. Bien documenté et extrêmement facile à utiliser. Pour démarrer les composants, nous les listons simplement:

docker-compose up apache2 php-fpm mysql phpmyadmin 

ou

 docker-compose up nginx php-fpm mariadb adminer 

Remarque : il n'est pas nécessaire de spécifier explicitement php-fpm, car lorsque le serveur Web du conteneur php-fpm démarre, le conteneur démarre automatiquement.

Le référentiel contient plus de 48 conteneurs, dont:

  • Bases de données : MySQL, MariaDB, Percona, MongoDB, MSSQL, PostgreSQL
  • Gestion de base de données : PhpMyAdmin, Adminer, PgAdmin
  • Serveurs Web : nginx, Apache2, Caddy
  • Compilateurs PHP : PHP FPM, HHVM
  • Divers : Sélénium, Jenkins, ElasticSearch, Kibana, Gitlab, Mailhog, MailDev, Laravel Echo, Phalcon
  • Outils : PHP CLI, Composer, Git, Linuxbrew, Node, V8JS, Gulp, SQLite, xDebug, Envoy, Deployer, Vim, Yarn, Drush

Exigences et conditions initiales


Vous aurez besoin de:

  • Git
  • Docker
et la console dans laquelle les commandes seront exécutées. Le site Web Docker contient une documentation complète sur l'installation pour différentes plates-formes (des liens sont également à la fin de l'article). Si vous n'avez pas encore installé git, faites-le selon les instructions du site officiel.

Architecture du référentiel Git: projet principal et Laradock


Laradock peut être utilisé en deux versions:

  • Laradock séparé pour chaque projet
  • Un laradock pour de nombreux projets

Dans le premier cas, la structure du répertoire ressemblera à ceci:

image

Dans le second, comme ceci:

image

Nous utilisons toujours la première option: un projet - un laradock. C'est cette approche qui assure la flexibilité et l'indépendance d'un projet par rapport à un autre.

La deuxième question importante est: créer un référentiel commun ou deux distincts? En d'autres termes, dois-je ajouter des fichiers laradock au référentiel principal avec le projet? La réponse est nécessaire, mais sous la forme d'un sous-module vers le référentiel principal. L'environnement Docker est une partie auxiliaire du projet et n'est pas toujours requis. Par exemple, sur les serveurs de transfert et de production, ce n'est pas nécessaire. Lorsque vous déployez à l'aide de git, les fichiers d'environnement n'y arriveront pas.

Le nom du répertoire d'environnement


Par défaut, les noms de conteneurs utilisent le nom du répertoire courant comme suffixe: laradock_nginx_1, laradock_mysql_1, etc. Pour éviter de confondre les données au sein des volumes, des noms de répertoire uniques sont requis pour vos environnements. Ceci est facile à réaliser si vous vous en tenez à notre schéma choisi: ajoutez le nom du projet au nom du répertoire avec l'environnement, par exemple:

  • laradock-mysite
  • laradock-proj1
  • laradock-mobapp

c'est-à-dire, le préfixe «laradock» et le nom du répertoire avec le projet via un trait d'union.

Lancement d'un site


Par où commencer le lancement du site?

Comme nous l'avons mentionné dans le troisième chapitre, nous utilisons Laradoc pour créer l'environnement.
Le processus de démarrage comprend les étapes de configuration de l'environnement et de l'application laravel.

Paramètres du projet


Laradoc inclut un exemple de fichier de configuration d'environnement. Nous créons une copie pour notre projet.

 cp env-example .env 

Les options .env sont assez évidentes. Dans les paramètres, nous définissons l'accès à la base de données, les paramètres de messagerie, l'accès aux services tiers, si nous l'utilisons dans notre projet.

Le démarrage et l'arrêt des applications d'environnement se font par des commandes docker-compose

 docker-compose up 

et

 docker-compose stop 

Si nécessaire, vous pouvez appeler le téléchargement des services nécessaires dans la commande de démarrage. Par exemple, trois services supplémentaires seront chargés de cette façon:

 docker-compose up -d nginx percona adminer 

Vous pouvez supprimer cette commande dans un script shell séparé afin de ne pas avoir à la saisir manuellement à chaque fois.

Le script de démarrage peut être appelé "start.sh", ou ce que vous voulez:

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

Le script d'arrêt de service peut être appelé «stop.sh» ou «down.sh»:

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

image

Initialisation du projet


La transition vers l'environnement conteneur est effectuée par la commande

 docker-compose exec --user=laradock workspace bash 

Erreurs de déploiement


Lors de l'installation de Laradoc dans un environnement Linux, un problème d'autorisations de fichiers peut se produire.

Dans ce cas, les fichiers peuvent avoir le mauvais propriétaire ou des droits d'accès insuffisants.

Symptômes : lorsque vous essayez de démarrer l'environnement avec la commande «docker-compose up» ou accédez au conteneur avec la commande «docker-compose exec ...», comme dans l'exemple ci-dessus, des erreurs similaires à celles
/ var / www / vendor n'existe pas et n'a pas pu être créé
Impossible d'ouvrir le flux ou le fichier "/var/www/storage/logs/laravel.log": impossible d'ouvrir le flux: autorisation refusée
La raison de l'erreur est que dans l'exemple de configuration de l'environnement Docker, l'ID utilisateur et le groupe d'utilisateurs sont codés en dur, par défaut 1000 et 1000 respectivement.

Si dans notre système Unix ces ID sont déjà occupés par d'autres entités, vous devez alors modifier manuellement la configuration.

Procédure de correction d'erreur


Vérifiez l'utilisateur et le groupe dans les répertoires:

 ls -la /var/www 

Les propriétaires de fichiers et de répertoires (utilisateur et groupe d'utilisateurs) doivent être laradock laradock.

Si au lieu de laradock: laradock, le propriétaire et le groupe sont indiqués par des nombres (1001: 1001, 1001: 13002 et combinaisons similaires), vous devez apporter des modifications aux fichiers de paramètres.

Si votre ID utilisateur et votre groupe d'utilisateurs (/ etc / passwd, / etc / group) ne correspondent pas à ceux spécifiés, alors pour un fonctionnement correct, vous devez apporter des modifications aux fichiers suivants:

/ laradock / php-fpm / Dockerfile *, en ligne

" RUN usermod -u 1000 www-data "

remplacer 1000 par l'ID utilisateur

/laradock/.env en lignes

WORKSPACE_PUID = 1000
WORKSPACE_PGID = 1000

WORKSPACE_PUID - spécifiez votre ID utilisateur, WORKSPACE_PGID - ID de groupe d'utilisateurs

/ laradock / workspace / Dockerfile *, en lignes

ARG PUID = 10315
ARG PGID = 10004

PUID - ID utilisateur, PGID - ID groupe d'utilisateurs

Après avoir apporté les modifications, reconstruisez à nouveau l'espace de travail et php-fpm, puis démarrez le conteneur:

 docker-compose build workspace php-fpm 

Si vous rencontrez un tel problème, vous devez vérifier les droits d'accès aux répertoires du framework Laravel. Définissez les autorisations pour les répertoires qui nécessitent des autorisations d'écriture:

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

Certificats SSL et https


Votre site en production fonctionnera très probablement selon un protocole sécurisé. Il est logique de mener un développement local sur https. Ce n'est pas très difficile à faire, vous avez besoin d'un certificat SSL et de petits paramètres. En savoir plus dans cet article Comment émettre un certificat SSL auto-signé .

Exécution de plusieurs sites


Ainsi, tous les projets fonctionnent selon le schéma «One Laradock - one project». Mais un projet n'est pas nécessairement un site. Parfois, vous devez exécuter plusieurs sites en même temps, car ils interagiront les uns avec les autres.

Dans ce cas, deux laradock ne peuvent pas être démarrés en même temps, car dans chacun d'eux un serveur Web est lancé qui écoute le port 80 - nous obtenons un conflit. Mais nous avons accès aux fichiers de configuration de nginx, configurons-le.

Mais d'abord, une note sur l'architecture et les référentiels git. Dans le cas de plusieurs sites, nous utilisons la structure de répertoires de la deuxième option:

image

Le dépôt git avec laradock n'est plus un sous-module d'un autre dépôt, mais devient complètement indépendant.

La configuration du serveur Web sera affichée en utilisant nginx comme exemple. Dans le répertoire laradock, accédez à nginx / sites. Nous voyons default.conf et plusieurs fichiers * .conf.example. Sur la base de default.conf ou d'exemples de fichiers, nous créons des configurations pour les sites.

Faites attention à la racine du document. Par défaut, la directive racine ressemble à ceci:

 root /var/www/public; 

mais devrait être comme ceci:

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

Important!
Jetez un œil au contenu de .gitignore dans ce répertoire. Tous les fichiers * .conf sauf default.conf sont ignorés. Il est nécessaire d'ajouter des fichiers créés aux exceptions, c'est-à-dire de ne pas les ignorer.
Configurez crontab pour que le planificateur laravel puisse fonctionner correctement. Pour ce faire, ajoutez les chemins dans le fichier workspace / crontab / laradock:

 * * * * * 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 

Pour une communication réussie des sites à l'intérieur des conteneurs, ajoutez des alias. Dans le fichier docker-compose.yml, nous trouvons la section

 ### NGINX Server ### 

et ajoutez un alias à chaque domaine:

image

C'est tout ce que vous devez faire pour exécuter un projet avec plusieurs domaines. En dehors de l'article, la question de l'organisation de https pour plusieurs domaines demeure. Tout cela par analogie avec l'organisation ssl pour un domaine, qui est décrite dans la section ci-dessus. Ajoutez un commentaire si vous avez des difficultés, je vais y répondre ou décrire les fonctionnalités dans un article séparé.

Fonctionnalités supplémentaires


Dans l'environnement Docker, il est possible de configurer les applications dont nous avons besoin. La configuration de base de Laradoc comprend déjà des packages d'application:

Serveur d'applications WebApache2, Caddy
Mise en cache des applications WebNginx, Vernis
Bases de données et services de mise en cacheMongo, Redis, Mssql, Mysql, Percona, Mariadb, Elasticsearch, Memcached, Redis, RethinkDb, Aerospike
Interfaces Web avec des bases de donnéesAdministrateur, PhpMyAdmin
Équilibreur de chargeHaproxy
Programmation, shells et frameworksPhp, Python, Symfony, Laravel, Node
UtilitairesPhp, Python, Symfony, Laravel, Node
Gestionnaire de paquetsCompositeur de fil
Outil de testJenkins
Outil de configuration de l'infrastructure d'applicationTerraform

Examinez brièvement les applications les plus mentionnées.

Rabbitmq

Le mécanisme de messagerie entre les applications. Le développeur de ce package détermine son objectif comme suit: «gestionnaire de files d'attente», «courtier de messages» ou «file d'attente de messages».

Un message peut contenir n'importe quel ensemble de données.

Dans le scénario de travail avec le gestionnaire de files d'attente, un message d'une application - l'expéditeur - est enregistré jusqu'à ce qu'une autre application (destinataire) se connecte et récupère (reçoive) le message de la file d'attente.

Redis

Création d'un cache de données dans la RAM. Il peut également être utilisé comme entrepôt de données avec un serveur de base de données ou le remplacer.

Redis prend en charge les chaînes, les listes, les ensembles, les ensembles ordonnés et les tables de hachage.
Le principal inconvénient des radis est la perte de données en cas de nettoyage de la RAM, au redémarrage du système d'exploitation ou à l'arrêt de l'équipement. Les développeurs de Radish ont envisagé un scénario similaire: en mode AOF (Append Only File), les données sont ajoutées au fichier disque toutes les secondes.

Le principal avantage des radis est l'accès le plus rapide aux données avec la vitesse d'accès à la RAM.

Liens matériels


Laravel

Docker

Laradock

Ferme Laravel

"Comment émettre un certificat SSL auto-signé et faire confiance à votre navigateur"

Docker + Laravel =

Conclusion


En choisissant Laravel + Docker pour le développement Web, nous avons remporté le prix le plus précieux: le temps.

En suivant le scénario de développement dans WAMP ou LAMP, nous avons dû passer du temps
inutile et nulle part.

WAMP et LAMP nécessitent tous deux qu'un développeur php ait un certain niveau de compétence dans des domaines qui ne sont pas directement liés au développement web: configuration d'un serveur web, configuration des paramètres php, etc.

L'utilisation de Laradoc nous permet, une fois l'ensemble de l'environnement du projet créé, de le déployer dans un nouveau lieu de travail dans les plus brefs délais. Et mettez-vous au travail tout de suite.

En conclusion, nous notons les avantages de l'utilisation de Laradoc:

  • infrastructure unifiée sur chaque lieu de travail: serveur web, serveur sql, un ensemble de frameworks et de bibliothèques;
  • utilisation rationnelle du temps de travail;
  • entrée rapide d'un nouveau développeur dans le projet.

Écrivez dans les commentaires comment votre équipe travaille avec l'environnement, quels outils et approches vous utilisez.

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


All Articles