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:8000open in new window 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 --from=composer:latest /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 :

Tester

Pour tester, c'est encore plus simple !

docker-compose up

Patientez quelques instants et votre site sera disponible sur le port http://localhost:8080open in new window.

C'est ce fichier…

Ce fichier est celui qui nous permettra de lancer facilement votre site sur votre serveur 👌

Lancement DockerLancement navigateur

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é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.