Skip to main content

Mise en place des conteneurs Docker

Maintenant que notre serveur est correctement configuré, nous allons y déployer les conteneurs Dockers qui exécuteront notre application.

Description des services

Pour faire fonctionner notre application, nous allons avoir besoin de trois services différents :

  • Un gestionnaire de process PHP
  • Un serveur web pour répondre aux requêtes HTTP et HTTPS
  • Un gestionnaire de base de données

PHP-FPM

PHP-FPM est un gestionnaire de processus PHP qui implémente le protocole FastCGI.

Ce protocole permet à un serveur web de "transférer" les requêtes sur des fichiers executables, tels que les fichiers PHP, vers un service capable de les interpréter. Le service, ici PHP-FPM, s'occupe ensuite de créer un processus PHP, d'exécuter le fichier cible, et de répondre au serveur web, qui à son tour pourra répondre à la requête HTTP envoyée par le navigateur de l'utilisateur.

Concrètement, c'est un service que vous avez déjà déployé localement sur vos ordinateurs : c'est ce que fait l'image que vous avez utilisé lors des TPs Symfony !

C'est d'ailleurs celle que vous allez utiliser aujourd'hui. Vous pouvez également la trouver sur le Docker hub. Pensez à utiliser le tag lp2024.

Caddy

Historiquement, que ce soit avec le serveur Apache ou Nginx, la configuration de serveur web était parfois si compliquée qu'elle en est presque devenue une science : contrôle d'accès, FastCGI, compression, ports, headers, reverse proxies, noms de domaines et chiffrement SSL entre autres joyeusetés.

Cependant, de nouveaux projets de serveurs web permettent de simplifier grandement cette étape, en fournissant des politiques par défaut saines.

C'est le cas de Caddy, un serveur Web de nouvelle génération écrit en Go. Il se configure très simplement au travers d'un fichier Caddyfile à la syntaxe minimaliste. Ce serveur dispose également de toute la configuration pour générer et renouveler pour vous des certificats HTTPS avec Let's Encrypt, afin de bénéficier du chiffrement sans prise de tête.

C'est ce que vous allez utiliser aujourd'hui : vous pouvez trouver l'image Docker sur le registry officiel de Docker (aka Docker Hub), et des tutoriels de configuration sur la documentation officielle de Caddy.

Gestionnaire de base de données

Un gestionnaire de base de données est un programme qui... gère des bases de données. Pas besoin d'aller trop en profondeur sur son rôle, vous les avez déjà rencontrés : MariaDB/MySQL, PostgreSQL, ou pour du non relationnel, MongoDB, Redis...

Dans notre cas, vous allez déployer un conteneur MariaDb, qui est le même que sur le serveur lpmiaw, et qui a fait ses preuves en termes de stabilité.

A vous !

Compose file

Modifiez votre fichier compose.yaml de manière à ce qu'il soit configuré de la sorte :

  • Services
    • Web : serveur Caddy
      • Connecté au volume de l'application PHP
      • Connecté au réseau PHP
    • PHP
      • Connecté au volume de l'application PHP
      • Connecté au réseau PHP
      • Connecté au réseau de la BDD
    • BDD
      • Connecté au réseau de la BDD
  • Réseaux
    • Réseau PHP
    • Réseau BDD
  • Volumes
    • Configuration de Caddy
      • Monté dans le dossier /srv/caddy_config
    • Application PHP
      • Monté dans le dossier /srv/php_app
    • Volume nommé pour la base de données
tip

Pensez à ajouter à votre Compose file les variables d'environnement nécessaires au bon fonctionnement de ces services.

Pour éviter d'avoir à les écrire en dur dans votre Compose file, vous pouvez définir leur valeur depuis un fichier .env situé au même endroit que le fichier Docker Compose, puis les utiliser de la façon suivante :

- "APP_SECRET=${APP_SECRET}"

Déploiement sur le serveur

Sur votre serveur, créez un dossier lpmiaw_devops dans votre home :

mkdir -p ~/lpmiaw_devops

Copiez votre fichier compose.yaml sur le serveur à l'aide de la commande scp :

scp compose.yaml lpmiaw@<votre serveur>:~/lpmiaw_devops/compose.yaml
info

Pensez à remplacer <votre serveur> par le nom de domaine de votre serveur...

Créez ensuite un fichier .env dans ce dossier, pour configurer les conteneurs spécifiés dans le fichier compose.yaml.

Ce fichier devra notamment configurer :

  • Le mot de passe root de la base de données
  • Le nom de la base de données par défaut
  • Le nom de l'utilisateur principal de la base de données et son mot de passe
  • APP_ENV et APP_SECRET pour Symfony
  • L'URL de connexion à la base de données pour Symfony

Vous pouvez au choix, éditer ce fichier en local et le transférer par scp, ou le créer sur le serveur et le modifier à l'aide de la commande nano.

danger

Surtout, ne mettez pas ce fichier sur le repertoire Git, car il contient des secrets de déploiement !

Configuration du serveur web

Configurez le serveur web (Caddy) de manière à ce qu'il :

  • écoute sur l'adresse de votre serveur
  • utilise le volume de l'application PHP comme racine
  • passe les requêtes PHP au conteneur PHP

Vous trouverez pléthore d'exemples sur la configuration d'un serveur Caddy avec PHP, mais je vous conseille de commencer par lire les tutoriels de la documentation officielle.

Mise en route

Lancez votre pile Docker Compose depuis votre dossier ~/lpmiaw_devops :

docker compose up -d

Vérifiez que tous vos conteneurs fonctionnent bien :

docker compose ps

S'ils ne fonctionnent pas correctement, inspectez leurs logs, ils vous diront certainement pourquoi :

docker compose logs web

Pour vérifier que tout fonctionne bien, vous pouvez par exemple créer un fichier test.php dans le dossier monté en volume dans les conteneurs web et php avec le contenu suivant :

<?php

echo "Hello world !! I'm running on a nicely configured server."

?>

Si tout se passe bien, vous devriez pouvoir accéder à la page correspondante à l'adresse de votre serveur, sur le protocole HTTPS, comme par exemple : https://vps3.lpmiaw-lr.fr/test.php.

Pour aller plus loin

Vous avez fini ? Super ! Si vous ne savez pas quoi faire, vous pouvez :

  • Ajouter un Mailcatcher (comme dans le setup que vous avez utilisés jusqu'à maintenant) et l'exposer dans la configuration de Caddy, par exemple sur : https://vps1.lpmiaw-lr.fr/mail
  • Ajouter un conteneur Adminer, et limiter son accès par un mot de passe depuis la configuration de Caddy

Correction

Correction
services:
db:
image: mariadb:10.11
restart: unless-stopped
volumes:
- "db_data:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
networks:
- db_network
php:
image: nicolasunivlr/php:lp2024
restart: unless-stopped
environment:
- APP_ENV=${APP_ENV}
- APP_SECRET=${APP_SECRET}
- DATABASE_URL=${DATABASE_URL}
working_dir: /var/www/app
volumes:
- app:/var/www/app
networks:
- default
- db_network
- php_network

web:
image: caddy:2
restart: unless-stopped
ports:
- ${HTTP_PORT}:80
- ${HTTPS_PORT}:443
volumes:
- app:/var/www/app
- caddy_config:/etc/caddy
networks:
- default
- php_network

networks:
db_network:
internal: true
php_network:
internal: true

volumes:
db_data:
app:
driver: local
driver_opts:
type: none
o: bind
device: "${APP_PATH}"
caddy_config:
driver: local
driver_opts:
type: none
o: bind
device: "${CADDY_CONFIG_PATH}"