Déployer un site Laravel avec Docker
Dans le TP Déployer Laravel nous avons vu comment déployer un site Laravel directement sur la machine. Cette fois-ci nous allons voir comment le faire avec Docker.
Docker ?
Vous débutez avec Docker ? Je vous conseille plutôt de démarrer par ici
Sommaire
Avant-propos
Docker c'est simple ! Les étapes peuvent paraitre effrayante, mais non. Pour vous le prouver, voilà une vidéo de la procédure entière (2min top chrono de la création du projet à la mise à disposition sur votre machine) :
Votre site Web
Pour tester (et pour être certains d'avoir un projet propre), nous allons créer un nouveau projet. Mais bien évidemment, dans votre cas, vous utiliserez vos sources / votre projet.
composer create-project laravel/laravel demo
cd demo
php artisan serve
Rendez-vous sur http://localhost:8000 votre site doit fonctionner correctement.
Dockeriser votre application
Maintenant que vous avez validé que votre application fonctionne correctement, nous allons la Dockeriser… La Dockeriser signifie finalement que nous allons la Packager pour pouvoir la déployer sur n'importe quel serveur sans avoir à y installer autre chose que Docker
.
Créer le Dockerfile
Dockeriser une application requiert un nouveau fichier dans votre code source. Celui-ci doit se nommer Dockerfile
je vous laisse créer à la racine de votre site (au même endroit que le .env
) un fichier nommé Dockerfile
avec comme contenu :
FROM webdevops/php-nginx:8.0-alpine
# Installation dans votre Image du minimum pour que Docker fonctionne
RUN apk add oniguruma-dev libxml2-dev
RUN docker-php-ext-install \
bcmath \
ctype \
fileinfo \
mbstring \
pdo_mysql \
tokenizer \
xml
# Installation dans votre image de Composer
COPY /usr/bin/composer /usr/bin/composer
ENV WEB_DOCUMENT_ROOT /app/public
ENV APP_ENV production
WORKDIR /app
COPY . .
RUN cp -n .env.example .env
# Installation et configuration de votre site pour la production
# https://laravel.com/docs/8.x/deployment#optimizing-configuration-loading
RUN composer install --no-interaction --optimize-autoloader --no-dev
# Generate security key
RUN php artisan key:generate
# Optimizing Configuration loading
RUN php artisan config:cache
# Optimizing Route loading
RUN php artisan route:cache
# Optimizing View loading
RUN php artisan view:cache
RUN chown -R application:application .
Dockerfile ?
Ce fichier contient l'ensemble de la configuration pour que Laravel fonctionne correctement. Il est en quelque sorte générique et pourra servir, quel que soit votre projet.
C'est donc un outil très très pratique surtout avec ce que l'on appelle des plateformes d'intégration continue avec par exemple Gitlab-CI.
le .env
Vous vous souvenez du .env
? Ici nous allons avoir le même problème. Dans le fichier Dockerfile
je me sers du .env.example
comme référence de configuration.
Je vous laisse adapter / modifier celui-ci pour indiquer la bonne configuration de votre projet pour la production.
Compiler une première fois votre image
Maintenant que nous avons configuré notre fichier Dockerfile, nous allons tenter de la compiler une première fois pour valider son bon fonctionnement.
L'image que vous allez créer sera identique à ce que vous déploierez à la fin sur votre serveur. Vous pouvez donc tester l'ensemble des fonctionnalités.
Pour compiler une première version de votre application, ça va se passer dans le terminal, dans le dossier où vous avez créé le fichier Dockerfile
docker build -t test-laravel:latest .
C'est long ?
Cette étape est un peu longue, c'est normal, votre machine créer en quelque sorte votre machine. Mais rassurez vous l'objectif final c'est que vous ne fassiez plus cette action.
Pourquoi ? Et bien l'objectif c'est que cette étape soit automatisée :
- À chaque fois que vous commitiez.
- Et faite sur un serveur distant de Gitlab-CI.
Que fait cette commande ?
Cette commande va créer votre image, c'est-à-dire que votre machine va créer un conteneur qui sera paramétré avec l'ensemble de la configuration que vous avez indiquée dans votre fichier Dockerfile
.
C'est comme une sorte de template réutilisable.
PS: Je vous laisse observer ce que fait votre terminal !
Sur ma machine :
Docker Compose : prêt à déployer sur votre serveur
Vous avez maintenant « un serveur » qui fonctionne, nous allons ajouter un fichier nommé qui sera utilisé par Docker Compose, cette configuration au format YAML.
Docker Compose vas nous permet de créer de véritable environnement multi conteneur, dans notre cas pour l'instant nous n'aurons que Laravel, mais qui peux le plus peux le moins.
Je vous laisse créer (dans le même dossier que le Dockerfile
) un fichier nommé docker-compose.yaml
, pour le contenu le voilà :
version: "3.9"
services:
web:
build: .
restart: unless-stopped
ports:
- "8080:80"
Ce fichier indique que vous avez :
- Un service.
- Qui expose un port le 8080. (accessible sur
http://votre.ip:8080
) - Qui (re)démarrera automatiquement au démarrage de le votre serveur.
Un instant ?
À votre avis :
- Quelles autres options avez vous à votre disposition pour le restart ? C'est par ici
- À quoi correspond "8080:80" ? Pourquoi avons-nous un
80
alors que le site est disponible sur le8080
? - Est-il possible de déclarer plusieurs services ? C'est par ici
Tester
Pour tester, c'est encore plus simple !
docker-compose up
Patientez quelques instants et votre site sera disponible sur le port http://localhost:8080.
C'est ce fichier…
Ce fichier est celui qui nous permettra de lancer facilement votre site sur votre serveur 👌
Installer Docker sur votre serveur Debian
La procédure est assez similaire à l'installation d'un package classique :
# Ajout des éléments nécessaire à l'installation
sudo apt-get update
sudo apt-get -y install \
ca-certificates \
curl \
gnupg \
lsb-release
# Ajout du dépôt permettant d'installer Docker
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Update la liste des packages et installation de Docker
sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io
# Installation de docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Félicitation, vous avez maintenant Docker sur votre Serveur.
Un Instant !
À votre avis :
- D'où viennent ces commandes ? Des informations
- Pourquoi vous devez être vigilant quand vous copiez/collez des commandes ?
Déployer votre site
Pour déployer votre site, il vous suffit :
- Envoyer le code source sur votre serveur (ftp, sftp, git au choix).
- Lancer la commande :
docker-compose up -d
Un instant !
À votre avis ?
- Pouvez-vous modifier le port d'écoute de votre serveur ? (oui, dans le
docker-compose.yml
mais comment ?) - Est-ce que votre service va démarrer automatiquement si vous redémarrez votre machine ?
Mettre à jour votre site
Pour mettre à jour votre site, il vous suffit :
- Envoyer le code source sur votre serveur (ftp, sftp, git au choix).
- Lancer la commande :
docker-compose up --build -d
C'est à vous
Je vous laisse ajouter une nouvelle page dans votre site. Une page avec les Conditions générales pas exemple. Une fois cette page ajoutée, je vous laisse la mettre en ligne sur votre serveur.