Laravel avec docker compose
Bienvenue dans notre tutoriel express sur l’automatisation d’un écosystème de conteneur pour votre API REST Laravel via docker compose. Apprenez rapidement comment créer votre stack de conteneur via docker-compose, comment gérer la syntaxe du YAML, et comprendre les subtilités docker. Ce guide vous équipe pour créer un stack API REST laravel avec un SGBD ainsi qu’une WebUI pour votre base de données et vous fait entrer dans le grand bain du devops !
- Comprendre les fondamentaux – Familiarisez-vous avec les bases de docker,docker-compose et le YAML.
- Prérequis – Découvrez ce dont vous avez besoin pour démarrer avec docker-compose.
- Créer un .env docker-compose– Apprenez à créer votre .env pour docker-compose pour créer un template réutilisable.
- Créer et configurer un docker-compose.yml – Comment créer son écosystème docker avec sa base de données son api et phpmyadmin .
- Le système de fichier– Découvrez comment faire une architecture de système de fichier efficace pour votre stack docker.
- Les commandes docker-compose – Apprenez à maîtriser les commandes docker-compose .
Comprendre les fondamentaux
Docker
Pour un petit rappel sur ce qu’est docker on aborde le sujet dans ce tuto qui explique comment créer sa propre image docker laravel
Docker Compose
- Qu’est-ce que c’est ? Docker Compose est un outil qui permet de définir et de gérer plusieurs conteneurs Docker en tant qu’entité unique (stack).
- Avantages:
- Simplicité: Docker Compose permet de simplifier la gestion de plusieurs conteneurs.
- Flexibilité: Docker Compose permet de définir des dépendances entre les conteneurs.
- Extensibilité: Docker Compose est extensible et peut être utilisé avec d’autres outils Docker.
- Composants:
- Fichier de configuration: Le fichier de configuration Docker Compose est un fichier YAML qui définit les conteneurs et les services de l’application.
Commandes: Docker Compose propose des commandes pour démarrer, arrêter, et gérer les applications.<
Les fichier YAML
Un fichier YAML (YAML Ain’t Markup Language) est un fichier texte qui utilise un langage de sérialisation de données lisible par l’homme. Il est souvent utilisé pour stocker des configurations, des données d’application et des fichiers de pipeline.
A savoir que le YAML est évolution du JSON ce qui permet au fichier YAML de comprendre le format JSON si vous voulez un rappelle de ce que est le JSON vous pouvez consulter notre tutoriel sur laravel ici
Avantages de YAML:
- Facile à lire et à écrire: La syntaxe de YAML est simple et intuitive, ce qui la rend facile à lire et à écrire pour les humains.
- Portable: Les fichiers YAML peuvent être utilisés sur n’importe quelle plateforme, quel que soit le langage de programmation.
Extensible: YAML est un langage extensible qui peut être utilisé pour représenter une grande variété de données.
Structure d’un fichier YAML:
Un fichier YAML est composé de documents YAML. Un document YAML est une collection de paires clé-valeur. Les clés sont des chaînes de caractères et les valeurs peuvent être des scalaires, des listes ou des dictionnaires.
Exemple de fichier YAML:
Exemple de fichier YAML avec docker compose:
Utilisation des fichiers YAML:
Les fichiers YAML peuvent être utilisés pour stocker une grande variété de données, telles que:
- Configurations: Les fichiers YAML sont souvent utilisés pour stocker les configurations d’applications.
- Données d’application: Les fichiers YAML peuvent être utilisés pour stocker des données d’application, telles que des listes d’utilisateurs ou des paramètres de configuration.
- Fichiers de pipeline: Les fichiers YAML peuvent être utilisés pour définir des pipelines de traitement de données.
Outils pour travailler avec les fichiers YAML:
Il existe de nombreux outils pour travailler avec les fichiers YAML, tels que:
- Éditeurs de texte: La plupart des éditeurs de texte modernes peuvent ouvrir et modifier les fichiers YAML.
- Analyseurs YAML: Il existe des analyseurs YAML disponibles pour la plupart des langages de programmation.
- Bibliothèques YAML: Il existe des bibliothèques YAML disponibles pour la plupart des langages de programmation qui permettent de lire et d’écrire des fichiers YAML.
Prérequis
1. Docker
Docker Compose est un outil qui s’appuie sur Docker. Vous devez donc avoir installé et configuré Docker sur votre machine avant de pouvoir utiliser Docker Compose.
Vérifiez que Docker est installé:
docker –version
Si Docker n’est pas installé:
Dans notre précédent tutoriel on vous explique comment faire
2. Fichiers de configuration
Docker Compose utilise des fichiers de configuration YAML pour définir les services et les volumes de votre application. Vous aurez besoin d’un éditeur de texte pour créer et modifier ces fichiers.
Exemples d’éditeurs de texte:
- Visual Studio Code
- Sublime Text
- Atom
- Notepad++
3. Connaissances de base en YAML
Les fichiers de configuration de Docker Compose sont écrits en YAML. Il est donc important de comprendre les bases de ce langage de sérialisation de données.
Ressources pour apprendre YAML:
Créer un fichier .env pour Docker Compose
Un fichier .env est un excellent moyen de stocker les variables d’environnement pour votre application Docker Compose. Cela permet de garder votre configuration propre et facile à gérer, et de la partager facilement avec d’autres.
Voici les étapes pour créer un fichier .env pour Docker Compose:
- Créez un fichier .env dans le même répertoire que votre fichier docker-compose.yml.
- Ajoutez vos variables d’environnement au fichier .env. Chaque variable doit être sur une ligne séparée, avec le nom de la variable suivi d’un signe égal (=) et de la valeur de la variable.
- Utilisez les variables d’environnement dans votre fichier docker-compose.yml. Vous pouvez utiliser les variables d’environnement dans n’importe quelle partie de votre fichier docker-compose.yml, en les entourant de doubles accolades ({{ }}).
Exemple de fichier .env:
Exemple d’utilisation des variables d’environnement dans docker-compose.yml:
Conseils pour créer un fichier .env:
- Donnez des noms clairs et précis à vos variables.
- Utilisez des valeurs par défaut pour les variables facultatives.
- Ne stockez jamais de secrets sensibles dans votre fichier .env. Utilisez plutôt un gestionnaire de secrets.
- Ajoutez un commentaire à chaque variable pour expliquer son rôle.
Avantages de l’utilisation d’un fichier .env:
- Facilité de gestion: Vous pouvez facilement modifier les variables d’environnement sans avoir à modifier votre fichier docker-compose.yml.
- Partage: Vous pouvez facilement partager votre fichier .env avec d’autres, ce qui facilite la collaboration.
- Sécurité: Vous pouvez stocker les secrets sensibles en dehors de votre fichier docker-compose.yml.
Par exemple ici dans le cadre de la mise en place de notre écosystème de notre API Laravel via docker-compose on va récupérer le .env de notre laravel et le mettre au niveau du docker-compose de façon à s’assurer que les variables d’environnement soit cohérente entre notre api et notre BDD.
Par défaut le .env laravel a un mot de passe vide même si on travail qu’en local c’est un problème et il faut définir un mot de passe de plus par défaut le DB_HOST est en 127.0.0.1 alors que de part le principe de la conteneurisation notre base de données sera considéré comme sur un serveur distant il faudra adapter le .env en fonction de ce que l’on aura renseigné dans notre docker-compose.yml.
Créer et configurer un fichier docker-compose.yml
Ce tutoriel vous guide pas à pas dans la création et la configuration d’un fichier docker-compose.yml pour un écosystème Docker comprenant :
- Une application PHP (mon-api)
- Une base de données MySQL (ma-bdd)
- phpMyAdmin (mon-phpmyadmin)
Prérequis:
- Docker installé et configuré sur votre machine.
- Avoir le dockerfile présent dans la racine du projet (si projet laravel déjà existant et que vous avez suivie le précédent tuto il faudra l’adapter enlevant la ligne create-projet et en rajoutant un php artisan migrate dans le CMD)
- Un fichier .env contenant les variables d’environnement suivantes :
- DB_HOST (hôte de la base de données)
- DB_PORT (port de la base de données)
- DB_DATABASE (nom de la base de données)
- DB_USERNAME (nom d’utilisateur de la base de données)
- DB_PASSWORD (mot de passe de la base de données)
1. Structure du fichier docker-compose.yml:
On va étudier le fichier docker-compose.yml ci-dessus qui permet de mettre en place notre environnement conteneurisé :
Le fichier docker-compose.yml est divisé en deux sections principales :
- version: Spécifie la version du format de fichier Docker Compose utilisé.
services: Définit les services de votre application, dans ce cas : mon-api, ma-bdd, et mon-phpmyadmin.
2. Configuration des services:
2.1. mon-api:
- build: Indique à Docker de construire l’image du service à partir du répertoire courant (.).
- networks: Spécifie que le service doit appartenir au réseau etudiant.
- container_name: Nomme le conteneur mon-api.
- hostname: Définit le nom d’hôte du conteneur mon-api.
- restart: Indique à Docker de redémarrer automatiquement le conteneur en cas d’arrêt.
- volumes:
- ./app:/app: Monte le répertoire local app dans le conteneur /app.
- ./.env:/app/.env: Monte le fichier .env local dans le conteneur /app/.env.
- ports: Mappe le port 8000 du conteneur au port 80 de l’hôte, permettant d’accéder à l’API via http://localhost.
2.2. ma-bdd
:image: Utilise l’image officielle de MariaDB version 10.3.9.
- container_name: Nomme le conteneur ma-bdd.
- hostname: Définit le nom d’hôte du conteneur ma-bdd.
- networks: Spécifie que le service doit appartenir au réseau mon-reseau.
- restart: Indique à Docker de redémarrer automatiquement le conteneur en cas d’arrêt.
- env_file: Charge les variables d’environnement depuis le fichier .env.
- volumes:
- ./db:/var/lib/mysql: Monte le répertoire local db dans le conteneur /var/lib/mysql, persistant les données de la base de données entre les redémarrages.
- environment: Remplace les variables d’environnement dans l’image MariaDB :
- MYSQL_ROOT_PASSWORD: Mot de passe root de la base de données (défini dans .env).
- MYSQL_DATABASE: Nom de la base de données (défini dans .env).
- MYSQL_USER: Nom d’utilisateur de la base de données (défini dans .env).
- MYSQL_PASSWORD: Mot de passe de l’utilisateur de la base de données (défini dans .env).
- MYSQL_ROOT_HOST=%: Autorise l’accès à la base de données depuis le conteneur mon-api.
2.3. mon-phpmyadmin:
- image: Utilise l’image officielle de phpMyAdmin.
- container_name: Nomme le conteneur mon-phpmyadmin.
- hostname: Définit le nom d’hôte du conteneur mon-phpmyadmin.
- networks: Spécifie que le service doit appartenir au réseau mon-reseau.
- env_file: Charge les variables d’environnement depuis le fichier .env.
- restart: Indique à Docker de redémarrer automatiquement le conteneur en cas d’arrêt.
- ports: Mappe le port 80 du conteneur au port 8080 de l’hôte, permettant d’accéder à phpMyAdmin via http://localhost:8080.
- environment: Remplace les variables d’environnement dans l’image phpMyAdmin :
- PMA_HOST: Hôte de la base de données, remplacé par la variable DB_HOST définie dans .env.
- PMA_PORT: Port de la base de données, remplacé par la variable DB_PORT définie dans .env.
3. Réseau etudiant:
- networks: Déclare un réseau personnalisé nommé etudiant.
- ipam.config: Spécifie la plage d’adresses IP allouées aux conteneurs du réseau etudiant (ici, 110.100.0.0/16).
4. Construction et exécution:
- Enregistrez le code précédent dans un fichier nommé docker-compose.yml.
- Placez ce fichier dans le même répertoire que votre application PHP et votre fichier .env.
- Ouvrez un terminal dans ce répertoire et exécutez la commande suivante pour construire et démarrer les services :
- Le drapeau -d indique à Docker de démarrer les services en arrière-plan.
5. Accès à l’application et à phpMyAdmin:
-
- Une fois les services démarrés, vous pouvez accéder à votre application via :
- http://localhost
- Vous pouvez accéder à phpMyAdmin via :
- http://localhost:8080
- Une fois les services démarrés, vous pouvez accéder à votre application via :
- Arrêt et suppression des services:
- Pour arrêter les services, exécutez la commande suivante :
- Si projet laravel déjà existant voici le dockerfile modifier pour un projet laravel existant:
Le système de fichiers dans votre stack Docker
L’image que vous m’avez envoyée montre un exemple de fichier docker-compose.yml, qui définit une architecture de base pour une application multi-conteneurs. Bien qu’il ne spécifie pas directement une structure de système de fichiers, il utilise des volumes pour gérer la persistance des données lors du redémarrage des conteneurs. Voici une explication du fonctionnement de cette architecture de système de fichiers :
- Répertoires sur la machine hôte
- Le fichier docker-compose.yml lui-même se trouve sur le système de fichiers de la machine hôte, généralement aux côtés d’autres fichiers de projet tels que votre code d’application et un fichier .env contenant des variables d’environnement.
- Volumes
- Le fichier docker-compose.yml définit des volumes qui mappent des répertoires de la machine hôte à des emplacements spécifiques dans les conteneurs. Ces volumes permettent aux données de persister en dehors du système de fichiers éphémère du conteneur et de survivre aux redémarrages du conteneur.
- ./app:/app: Ce volume monte le répertoire hôte ./app (le répertoire courant) vers le répertoire conteneur /app. Cela signifie que toute modification des fichiers et sous-répertoires dans le répertoire ./app de l’hôte se reflétera dans le répertoire /app du conteneur. C’est généralement là que se trouve votre code d’application.
- ./db:/var/lib/mysql: Ce volume monte le répertoire hôte ./db vers le répertoire conteneur /var/lib/mysql. C’est là que la base de données MariaDB stocke ses données. Le montage de ce répertoire garantit que les données de la base de données persistent sur la machine hôte et survivent aux redémarrages du conteneur.
- Systèmes de fichiers des conteneurs
- Chaque instance de conteneur possède son propre système de fichiers indépendant. Ce système de fichiers n’est pas directement accessible depuis la machine hôte et est généralement recréé au redémarrage du conteneur (sauf si des volumes sont utilisés).
- Les volumes montés deviennent part du système de fichiers du conteneur aux emplacements spécifiés. Par exemple, le répertoire /app du conteneur semblera contenir les mêmes fichiers et dossiers que le répertoire ./app de l’hôte.
- Bonnes pratiques pour l’architecture du système de fichiers
- Séparer les données du code: Comme le montre cet exemple, il est recommandé de séparer votre code d’application (monté depuis ./app) des données persistantes de la base de données (montées depuis ./db). Cela facilite la gestion et la mise à l’échelle de votre application et de vos données indépendamment.
- Utiliser des volumes nommés pour les données persistantes: Envisagez d’utiliser des volumes nommés au lieu de volumes anonymes (comme ceux utilisés dans cet exemple) pour les environnements de production. Les volumes nommés vous donnent plus de contrôle sur le cycle de vie du volume et la gestion des données.
- Tirer parti de Docker Hub pour les composants partagés: Au lieu de monter l’intégralité de votre base de code d’application dans le conteneur, envisagez d’utiliser des images pré-construites à partir de Docker Hub pour des composants partagés tels que les serveurs web, les bases de données et les bibliothèques. Cela réduit la taille de vos images de conteneur et simplifie la maintenance.
Les commandes Docker Compose: Maîtrisez votre environnement de développement
Voici quelques-unes des commandes les plus utiles de Docker Compose:
- docker-compose up:
- Démarre tous les services définis dans votre fichier docker-compose.yml.
- Options:
- -d: Démarre les services en arrière-plan.
- –build: Reconstruit les images avant de les démarrer.
- –scale: Démarre un nombre spécifié d’instances d’un service.
Tips a savoir c’est que quand on modifie un docker compose le fait de faire docker compose up redemare que les conteneurs impacté par la modification
- docker-compose down:
- Arrête tous les services en cours d’exécution et supprime les conteneurs associés.
- Options:
- -v: Supprime également les volumes créés par les services.
- docker-compose ps:
- Affiche la liste des conteneurs en cours d’exécution, avec des informations telles que leur nom, leur état et leur image.
- Options:
- -a: Affiche également les conteneurs arrêtés.
- docker-compose logs:
- Affiche les journaux des conteneurs en cours d’exécution.
- Options:
- -f: Affiche les journaux en temps réel.
- –tail: Affiche les dernières lignes des journaux.
- docker-compose exec:
- Exécute une commande dans un conteneur en cours d’exécution.
- Exemple: docker-compose exec mon-api bash pour ouvrir une session shell dans le conteneur mon-api.
- docker-compose build:
- Reconstruit l’image d’un ou plusieurs services.
- Options:
- -s: Spécifie le service à reconstruire.
- docker-compose start:
- Démarre un service spécifié.
- docker-compose stop:
- Arrête un service spécifié.
- docker-compose rm:
- Supprime un ou plusieurs conteneurs.
- Options:
- -f: Force la suppression des conteneurs, même s’ils sont en cours d’exécution.
- docker-compose scale:
- Définie le nombre d’instances à démarrer pour un service.
Envie d’en savoir plus sur le développement d’applications web ,sur le dev/ops ou la conception d’applications inscrivez-vous à notre formation Développeur web et web mobile ou Concepteur Développeur d’Application (CDA) afin de viser l’excellence, acquérir un savoir-faire concret dans le développement web et d’obtenir un diplôme national RNCP reconnus par l’État.