Déployez votre base de données avec Docker

Vous avez récupéré le code source de l'application de la librairie, créé votre branche de travail et installé les dépendances npm lors du chapitre précédent. Pour que l'application puisse fonctionner, elle doit interagir avec une base de données PostgreSQL.

Afin de garantir un environnement de données strictement identique pour toute l'équipe sans installer PostgreSQL en natif sur vos machines hôtes, vous allez déployer la base de données dans un conteneur Docker isolé. Dans ce chapitre, vous allez apprendre à orchestrer ce service avec Docker Compose, à configurer la persistance des données et à préremplir la base avec le jeu de données de test de la librairie.

Assimilez les principes de la conteneurisation avec Docker

Pour comprendre la démarche, distinguons trois notions fondamentales de l'écosystème Docker :

  1. L'image Docker : Un modèle immuable contenant tout le nécessaire pour exécuter une application (moteur PostgreSQL, bibliothèques et configurations).

  2. Le conteneur Docker : Une instance isolée en cours d'exécution créée à partir d'une image.

  3. Le volume Docker : Un espace de stockage persistant géré par Docker, indépendant du cycle de vie du conteneur.

Pourquoi utiliser Docker plutôt qu'une installation classique ?

Si chaque développeur installait PostgreSQL directement sur son système d'exploitation (Windows, macOS ou Linux), des écarts de version provoqueraient des erreurs du type « ça marche sur ma machine, mais pas chez toi ».

La conteneurisation offre une forte isolation et une reproductibilité parfaite. Votre serveur PostgreSQL s'exécute à l'intérieur d'un conteneur étanche, sans modifier votre système hôte.

Configurez les services avec Docker Compose

Au lieu de saisir de longues commandes docker run, vous utilisez Docker Compose. Cet outil permet de décrire l'ensemble des services dans un fichier de configuration déclaratif :  docker-compose.yml  .

Examinez la structure du fichier  docker-compose.yml  fourni à la racine du projet :

services:
  db:
    image: postgres:16-alpine
    container_name: librairie-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    ports:
      - "${POSTGRES_PORT}:5432"
    volumes:
      - librairie_db_data:/var/lib/postgresql/data
      - ./db/init:/docker-entrypoint-initdb.d
volumes:
  librairie_db_data:

Ce fichier s'appuie sur des variables d'environnement centralisées dans un  fichier .env  . Les variables  ${POSTGRES_USER}  ,  ${POSTGRES_PASSWORD}  et  ${POSTGRES_DB}  permettent d'injecter les identifiants sans inscrire de mots de passe en dur sur Git.

Docker Compose crée automatiquement un réseau virtuel de type pont (bridge). 

Sur ce réseau, les conteneurs se joignent grâce au nom de leur service : un autre conteneur du projet (un service app ou un outil d'administration comme  pgAdmin  , par exemple) joindrait PostgreSQL à l'adresse  db:5432  .

Dans ce cours, l'application  Node.js  ne tourne pas dans un conteneur : vous la lancez directement sur votre machine avec  npm start  . Elle ne fait donc pas partie de ce réseau. Elle passe par le port publié grâce à la ligne  ports: - "5432:5432"  , qui redirige le port 5432 de votre machine vers celui du conteneur : l'application se connecte donc à  localhost:5432  .

Dans cette vidéo tutoriel, vous allez observer le lancement du conteneur PostgreSQL à l'aide de Docker Compose. L'objectif est de comprendre l'interaction entre le fichier .env, le fichier docker-compose.yml et les commandes CLI d'orchestration.

Voici les étapes clés présentées dans cette démonstration :

  • Inspection des fichiers docker-compose.yml et .env: Montre comment les variables d'environnement sont transmises au servicedbpour sécuriser l'accès à la base de données.

  • Exécution de la commande docker compose up -d: Illustre la création du réseau virtuel, du volume nommé et le démarrage du conteneur PostgreSQL en arrière-plan.

  • Consultation des journaux d'exécution avec docker compose logs db: Permet de vérifier les messages d'initialisation du serveur PostgreSQL et la confirmation que la BDD accepte les connexions.

  • Vérification du conteneur via docker compose ps: Montre le statut actif (Up) du conteneur et la redirection du port5432.

En résumé, ce screencast vous montre comment déployer le service de données en une seule commande. Maintenant que le conteneur fonctionne, étudions le réseau interne configuré par Docker Compose.

Schéma représentant l'architecture réseau Docker Compose. interne L'application Node.js, lancée sur la machine hôte, se connecte à PostgreSQL via localhost et le port publié. À l'intérieur du réseau pont Docker, le conteneur Adminer joint Postgr
Schéma du réseau interne Docker Compose

Assurez la persistance des données grâce aux volumes Docker

Par défaut, les conteneurs sont éphémères. Arrêter un conteneur ne fait rien perdre ; en revanche, le supprimer (c'est ce que fait  docker compose down  ) détruit définitivement tout ce qui a été écrit dans son système de fichiers.

Pour éviter de recréer les tables à chaque redémarrage, vous devez utiliser un volume Docker nommé.

Un volume nommé est un répertoire stocké sur la machine hôte et géré par Docker. Il est monté à l'intérieur du conteneur dans le dossier de données PostgreSQL (  /var/lib/postgresql/data  ).

Dans votre fichier  docker-compose.yml  , le volume est déclaré ainsi :

services:
 db:
  volumes:
   -librairie_db_data:/var/lib/postgresql/data
volumes:  librairie_db_data:

Lorsque le conteneur est supprimé (  docker compose down  ), le volume  postgres_data  reste intact sur votre disque dur. Lors du prochain lancement (  docker compose up -d  ), PostgreSQL réutilise le volume et retrouve l'intégralité des données de la boulangerie.

Si vous souhaitez réinitialiser complètement votre BDD, vous devez purger le volume avec :

docker compose down -v
Schéma illustrant la persistance des données avec un volume Docker. Le conteneur PostgreSQL possède un stockage éphémère détruit lors de sa suppression (docker compose down). Les données de la base sont sauvegardées dans le volume nommé librairi
Architecture conteneurisée et persistance des données

Initialisez la base de données de la librairie

Pour que votre environnement soit directement exploitable, la BDD doit être initialisée avec la structure des tables et le jeu de données de test de la librairie dès son premier démarrage.

L'image officielle PostgreSQL propose un mécanisme d'initialisation automatisé : tout fichier SQL placé dans le dossier  /docker-entrypoint-initdb.d/  du conteneur est exécuté automatiquement au tout premier lancement (lorsque le volume est vide).

Dans votre fichier  docker-compose.yml  , ce montage est configuré comme suit :

services:
  db:
    volumes:
      - ./db/init:/docker-entrypoint-initdb.d

Tout le dossier  db/init/  est monté dans le conteneur. Il contient deux scripts :  01_schema.sql   crée les tables (livres, clients, reservations), puis  02_seed.sql  y insère le jeu de données de test..

Pour gérer au quotidien le service de BDD, vous utiliserez principalement deux commandes :

  • Démarrer le service en arrière-plan :docker compose up -d

  • Arrêter le service sans perdre les données :docker compose down

À vous de jouer !

Contexte :

Vous devez déployer et initialiser la base de données PostgreSQL de l'application de la librairie sur votre poste de travail. L'équipe vous fournit les scripts d'initialisation du dossier   init.sqldb/init/  ainsi que le fichier de configuration Docker Compose.

Consigne :

Configurez le fichier de variables d'environnement  .env  , démarrez le service PostgreSQL via Docker Compose et contrôlez l'initialisation de la BDD dans les journaux d'exécution.

En résumé

  • La conteneurisation avec Docker isole le serveur PostgreSQL dans un environnement reproductible, garantissant un comportement identique pour toute l'équipe.

  • Docker Compose permet de déclarer et d'orchestrer les services, les réseaux et les variables d'environnement du projet via le fichierdocker-compose.yml.

  • Les volumes Docker nommés assurent la persistance des données PostgreSQL sur la machine hôte après l'arrêt ou la suppression des conteneurs.

  • L'initialisation automatique via le dossier/docker-entrypoint-initdb.d/permet d'exécuter des scripts SQL de création de tables et de préremplir le jeu de données de test de la librairie au premier démarrage.

Bravo ! Votre base de données PostgreSQL est déployée et prête à être utilisée. Rejoignez-moi dans le chapitre suivant pour finaliser la configuration de votre environnement !

Ever considered an OpenClassrooms diploma?
  • Up to 100% of your training program funded
  • Flexible start date
  • Career-focused projects
  • Individual mentoring
Find the training program and funding option that suits you best