Environnement de développement Laravel avec Docker
Dans le cadre du talk hebdomadaire Frianbiz, délicatement nommé “Thursday Talk”, j’ai partagé avec l’équipe mon expérience de la mise en place de Docker dans le dernier projet Laravel sur lequel j‘ai démarré.
Pourquoi “Dockeriser” le projet ?
- Pour simplifier et accélérer le processus de récupération du projet par les membres de l’équipe
- Pour que tous les développeurs aient un environnement de développement iso !
Je me suis appuyé sur cet article, qui détaille très bien les étapes de la mise en place de Docker dans un projet Laravel, pour intégrer Docker à notre dernier projet.
La mise en place
Une fois le projet Laravel créé, je me suis attelé à la configuration de mes images Docker.
Je ne vais pas m’étendre sur les étapes de la mise en place (parce que l’article cité ci-dessus le fait bien mieux que moi) mais vais les rapporter à mon / notre besoin.
Dans notre cas nous avons besoin d’un environnement assez basique, incluant un serveur Nginx, un Php et un Mysql. Nous allons donc définir une image pour les services Serveur-web ainsi que Php et inclure directement le Mysql dans le fichier docker-compose.yml
.
Les services
PHP-FPM
On commence par le premier ficher app.dockerfile
qui se chargera de configurer notre Php comme nous le souhaitons, notre projet Laravel est en version 5.7 et a besoin au minimum d’une version 7.1.3 de Php. Nous incluons aussi les extensions dont nous aurons besoin (ex: Gd pour redimensionner les images uploadées)
FROM php:7.1.3-fpm# install system dependencies
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libmcrypt-dev \
mysql-client \
libmagickwand-dev \
openssl \
zip unzip \
git# install php dependencies
RUN pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install mcrypt pdo_mysql \
&& docker-php-ext-install gd
Nginx
Vient ensuite notre ficher web.dockerfile
qui gérera notre serveur web Nginx. Rien de particulier ici, un Nginx classique fait tout à fait l’affaire. On n’oublie pas d’attacher le vhost !
Docker-compose
Il est temps de rassembler tous les services dans notre docker-compose.yml
# The Application
app:
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/www
volumes:
- ./:/var/www:cached# The Web Server
web:
build:
context: ./
dockerfile: web.dockerfile
working_dir: /var/www
volumes_from:
- app
ports:
- 8080:80# The Database
database:
image: mysql:5.6
volumes:
- dbdata:/var/lib/mysql
environment:
- "MYSQL_DATABASE=homestead"
- "MYSQL_USER=homestead"
- "MYSQL_PASSWORD=secret"
- "MYSQL_ROOT_PASSWORD=secret"
ports:
- "3306:3306"
On y retrouve nos services app et web qui correspondent respectivement aux fichier app.dockerfile
et web.dockerfile
ainsi que notre service Mysql avec ses configurations.
Démarrage des services
Nous pouvons enfin démarrer nos services et nous lancer dans le développement !
Pour cela, on se place dans notre projet et on lance les commandes docker-compose build
puis ensuite docker-compose up
pour monter les images.
Une fois les images montées, nous pouvons accéder à notre service app afin de lancer nos commandes artisan :
Notez qu’il faut lancer les commandes artisan depuis notre image Php, d’où le docker-compose exec app
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan migrate
...
Au travail
Les collègues qui composent l’équipe de développement peuvent dès à présent cloner le projet et lancer les commandes docker-compose build puis docker-compose up et le tour est joué ! Tout le monde dispose du même environnement.
Les feedback
Simple à mettre en place, rapide et très utile, Docker nous permet de nous libérer des tracas liés aux environnements qui peuvent différer au sein de l’équipe.
Mon binôme au sein du projet a pu être opérationnel en quelques lancements de commandes sans difficultés. Pour lui comme pour moi, l’expérience est pour le moment un plaisir.