Accueil Laravel 6

Docker: créer un conteneur pour un projet Laravel 7 sous Windows 10

Mis à jour le

Cet article décrit toutes les étapes pour créer un nouveau projet Laravel (ici appelé nouveauprojetlaravel) disposant d’un conteneur Docker, en partant d’un PC Windows sur lequel seul Docker est installé.

Pour l’installation de Docker desktop prérequis dans ce tutoriel, voir l’article MicroTuto: Docker Desktop: installation d’un environnement de développement PHP/MySQL

Installation de PHP et Composer sur un poste Windows 10

La cible étant de travailler avec un environnement PHP sous Docker, il n’est pas nécessaire d’installer un environnement PHP complet tel que XAMPP par exemple.

Cependant il est plus simple d’utiliser les commandes fournie par Composer pour initier un projet Laravel par exemple. Cela nécessite de récupérer l’environnement PHP.

Il suffit de télécharger la dernière version sur la page de téléchargement de PHP dédié à Windows (la version « VC15 x64 Thread Safe » sous forme zippée), de la décompresser dans un répertoire quelconque sous Windows, par exemple:

D:\Users\jbh\Documents\dev\php-7.4.4-Win32-vc15-x64

Pour vérifier que PHP est correctement installé, lancer l’invite de commandes Windows (appuyer sur la touche Windows , saisir « cmd » et appuyer sur la touche entrée) ou bien le PowerShell (même opération en saisissant « powerShell »), et lancer:

php -v

Pour utiliser la commande PHP depuis une console (invite de commande Windows, PowerShell…), il est possible d’ajouter ce chemin dans la variable système PATH.

Afin de pouvoir utiliser la commande laravel pour créer de nouveaux projets ou utiliser l’interface Laravel artisan, il faut toutefois s’assurer que les extensions PHP requise soient bien activées. Pour ceci, il faut ouvrir le fichier php.ini, situé ici:

D:\Users\jbh\Documents\dev\php-7.4.4-Win32-vc15-x64\php.ini

Vérifier que les lignes des extensions suivantes ne sont pas commentées (point-virgule « ; » au début de la ligne):

BCMath, Ctype, Fileinfo, JSON, Mbstring, OpenSSL, PDO, Tokenizer, XML

Et en fonction de la base de donnée utilisée:

PDO_Mysql

le cas échéant retirer le point-virgule. Dans mon cas j’ai du modifier les lignes:

;extension=fileinfo
...
;extension=pdo_mysql 

en retirant le point-virgule pour activer l’extension « fileinfo »:

extension=fileinfo
...
extension=pdo_mysql 

Installation de Composer

Cependant ici, le répertoire PHP et l’exécutable php.exe tout juste installé va être utilisé pour installer Composer.

L’installeur de Composer se télécharge sur la page de téléchargement du site getcomposer.org. Il suffit ensuite de double-cliquer sur le fichier Composer-Setup.exe, choisir l’installation par défaut (il y a une option d’installation en mode développeur mais je n’en ai pas besoin), et d’aller chercher l’exécutable php.exe pour finaliser l’installation de l’outil Composer.

Pour vérifier que Composer est correctement installé, lancer la commande suivante depuis une invite de commande (ou une console PowerShell):

composer -v

le résultat affiché est assez long, la première ligne précisant la version installée:

Composer version 1.10.1 2020-03-13 20:34:27

les lignes suivante affichent les options et commandes Composer disponibles.

Installation du package Composer: Laravel

Référence: documentation de Laravel 7.

Depuis l’invite de commande Windows (ou une console PowerShell), lancer la commande Composer suivante pour installer Laravel:

composer global require laravel/installer

L’installation prend quelques secondes, le temps d’installer plusieurs packages correspondant aux dépendances de Laravel.

Pour vérifier que l’installation s’est correctement déroulée, lancer la commande:

laravel -v

Une fois que l’on peut utiliser l’exécutable Laravel, ce dernier permet simplement de générer toute le modèle d’un site web utilisant ce framework. Pour cela il faut se positionner sur le répertoire racine du projet nouveauprojetlaravel dans l’invite de commande:

cd D:\Users\jbh\Documents\dev\workspace\undergit\nouveauprojetlaravel

Puis lancer:

laravel new src

Une arborescence de projet Laravel est immédiatement générée dans le répertoire src:

Arborescence Laravel (vue PHPStorm)

Ce répertoire sera monté avec le conteneur Docker comme on va le voir un peu plus loin dans cet article.

Remarque: il peut s’avérer également utile d’installer Node.js, un framework javascript, en particulier pour compiler le package Composer: Laravel UI.

Création de l’image Docker: PHP-Laravel et NGINX

L’objectif est de créer une image Docker permettant de faire tourner un nouveau projet PHP Laravel et d’afficher la page d’accueil par défaut de Laravel 7. L’image de base est 708u/laravel-alpine dans Docker Hub, et permettant de lancer le nouveau site Laravel, et disposant des éléments suivants:

  • Alpine Linux
  • NGINX web server
  • PHP 7.4
  • Composer
  • Extensions PHP: OpenSSL, PDO, Mbstring, Tokenizer, XML…

La première étape consiste à créer un répertoire nommé docker à la racine du projet nouveauprojetlaravel:

D:\Users\jbh\Documents\dev\workspace\undergit\nouveauprojetlaravel\docker

Il faut ensuite créer plusieurs fichiers dans ce répertoire. Voici la liste des fichiers (cliquer ici pour récupérer les fichiers sous forme de .zip);

  • Dockerfile: le fichier de définition de l’image Docker, qui est basé sur l’image Nginx / Docker.
  • start.sh: script lancé lors de la construction du conteneur (création du fichier .env, lancement du daemon superviseur).
  • supervisord.conf: configuration du daemon superviseur, qui permet de garder le conteneur ouvert en tâche de fond (je n’ai pas plus de détail pour le moment sur l’utilité de cet élément).
  • nginx.cong: configuration du serveur NGINX (serveur reverse proxy qui remplace ici apache comme serveur frontal)
  • site.conf: la configuration du site dans NGINX, qui permet en particulier de rediriger les appels sur le index.php de Laravel (c’est un peu l’ équivalent du .htaccess sous Apache)

Attention: les sauts de ligne du fichier fichier doivent impérativement être au format unix (« \r ») et non pas DOS/Windows (« \r\n ») pour qu’il puisse être exécuté dans le conteneur. Si besoin utiliser Notepad++ qui permet de réaliser la conversion.

Une fois que le fichier Dockerfile et les fichiers de configuration sont prêts dans le répertoire docker du projet, on peut lancer la commande docker build pour créer la nouvelle image docker, que l’on choisit ici de nommer: image-nouveauprojetlaravel:1.0

docker build . -t  jbh/nouveauprojetlaravel:v1.0

Si tout se passe bien, l’image créée est visible sur la liste des images:

docker images

Création du conteneur Docker: PHP-Laravel et NGINX

On peut alors lancer la création du conteneur à partir de cette image. Pour cela, il faut lancer la commande docker run avec les options suivantes:

-d (--detach): lancement du conteneur en tâche de fond
-v (--volume): monter un répertoire de la machine hôte (ici, le répertoire contenant les sources du projet) sur un répertoire du conteneur
-p (--publish): exposer un port du container sur la machine hôte

Attention: pour le montage du répertoire (option -v), la saisie du chemin source est un peu délicate sous Windows: en effet, le séparateur de répertoires Windows (l’antislash) est justement le caractère d’échappement par défaut de Docker (voir l’article du blog Sixeyed traitant de ce sujet). Or il faut saisir le nom complet du chemin à monter.

De ce fait, il est plus simple de lancer la commande depuis PowerShell (en se plaçant à la racine du projet), car on peut alors utiliser le mot-clé $PWD qui fait référence au répertoire courant:

docker run -d -v $PWD\src:/var/www --name wik-laravel -p 8000:80 jbhr/nouveauprojetlaravel

Sous l’invite de commandes par défaut de Windows, il faut saisir le chemin complet en utilisant le caractère « / » (slash) comme séparateur de répertoires:

docker run -d --volume D:/Users/jbh/Documents/dev/workspace/undergit/nouveauprojetlaravel/src:/var/www --name wik-laravel -p 8000:80 jbhr/nouveauprojetlaravel

Une troisième possibilité si vous travaillez sur l’IDE PHPStorm: en faisant un clic-droit sur le fichier Dockerfile, le menu contextuel propose une fonction: Edit « Dockerfile »…

Cette option ouvre un formulaire permettant de définir les options des commandes docker: build et run.

Configuration dans PHPStorm des commandes Docker build et run
Configuration dans PHPStorm des commandes Docker: build et run

Une fois le conteneur lancé, on peut vérifier l’affichage de la page d’accueil Laravel par défaut du nouveau site en appelant l’URL suivante:

https://localhost:8080
Page d'accueil de Laravel 7 lancée depuis le conteneur Docker
Page d’accueil de Laravel 7 lancée depuis le conteneur Docker

Création de l’application multi-conteneurs: Docker Compose

L’outil Docker Compose permet de lier le lancement de plusieurs conteneurs afin de disposer d’un environnement complet pour une application: ici, nous allons compléter le conteneur PHP Laravel / NGINX que l’on vient de monter par 3 autres conteneurs. On obtiendra donc une « pile » de 4 conteneurs communiquant les uns avec les autres:

  1. Conteneur « Serveur d’application »: Apache/PHP
  2. Conteneur « base de données »: Mysql
  3. Conteneur Phpmyadmin
  4. Conteneur Redis (système de cache clé/valeur)

Pour configurer la pile de conteneurs il faut créer un fichier de configuration YAML à la racine du projet, nommé: docker-compose.yml (cliquer sur le lien pour télécharger le fichier zippé). Ce dernier est inspiré du projet docker-compose-lamp sur GITHUB, et il est documenté sur ce lien.

Mettre en place les paramètres du projet dans le fichier docker-compose.yml, en particulier les paramètres de la base de données (nom de la base de données mysql, mot de passe root, identifiants de connexion de l’application…).

Configurer également fichier src/.env: les paramètres de connexion de la base de données devront correspondre à ceux définis dans le fichier docker-compose.yml.

Attention: lorsque la base de données est dans un conteneur Docker, la paramètre DB_HOST doit être configuré avec le nom du service de MySQL le fichier docker-compose.yml (ici « mysql »), sous peine de voir la connexion échouer si on laisse la valeur par défaut (localhost ou 127.0.0.1). Une autre option documentée consiste à utiliser le host: « host.docker.internal », mais j’ai rencontré des problèmes avec cette configuration (erreur de type: php_network_getaddresses). Voir la page Docker traitant de la problématique réseau.

Une fois configuré, on peut lancer la pile de conteneur Docker depuis l’invite de commandes à la racine du projet ou se trouve le fichier docker-compose.yml:

docker-compose up -d

Les URL configurées sur le fichier docker-compose.yml permettent de vérifier le bon fonctionnement de l’application:

  • L’URL « http://localhost/ » affiche la même page d’accueil par défaut Laravel que précédemment.
  • L’URL « http://localhost:8080 » la page de connexion de phpMyAdmin.
  • L’URL « http://localhost:6379 » affiche le message d’erreur « -ERR wrong number of arguments for ‘get’ command » qui indique que REDIS est opérationnel (il n’y a pas d’IHM pour ce composant).

Par la suite, il faut créer la base de données et sa structure: elle sera enregistrée dans le répertoire docker/data du projet, et donc conservée même lorsque le conteneur Mysql sera stoppé.

Toute modification des sources dans le répertoire src sera par ailleurs immédiatement effective sur l’application web exposée sur l’URL « http://localhost/ ».

Une commande très utilise pour se connecter au shell dans le conteneur:

docker exec -it [nom du conteneur] /bin/bash

Conclusion

Cette installation permet de disposer d’un environnement complet de développement sans nécessiter d’installer les différents serveurs sur la machine, et en assurant une isolation parfaite avec les autres projets qui pourraient utiliser des versions différentes de Laravel, PHP, Mysql…

Par ailleurs l’environnement de développement est sous Linux, donc similaire à l’environnement de Production.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *