LANTORIANDocker, pas à pas

Chapitre 525 min2 exercices

Volumes et réseaux

Deux problèmes à régler : les données disparaissent avec le conteneur, et les conteneurs ne savent pas se trouver. Voici les deux solutions.

Volumes : garder les données

Un volume est un dossier géré par Docker, en dehors du conteneur. On le monte à un chemin du conteneur : tout ce qui y est écrit survit à la suppression du conteneur.

Les données sont écrites dans le conteneur lui-même.
Terminal
docker run -d --name db \
  -e POSTGRES_PASSWORD=secret \
  -v db-data:/var/lib/postgresql \
  postgres:18

docker volume ls              # lister les volumes
docker volume rm db-data      # supprimer (les données sont perdues)

Bind mount : partager le code

Un bind mount relie un dossier de ta machine à un chemin du conteneur. Tu modifies un fichier dans ton éditeur, le conteneur le voit immédiatement. C'est ce qui permet de développer sans rebuild.

Terminal
mkdir site && echo "<h1>Modifie-moi</h1>" > site/index.html
docker run -d --name web -p 8080:80 -v "$PWD/site":/usr/share/nginx/html nginx:stable
Volume nomméBind mount
Écriture-v db-data:/chemin-v ./dossier:/chemin
Géré parDockerToi (un dossier du projet)
Sert àBase de données, fichiers générésCode source en développement

Réseaux : se trouver par le nom

Des conteneurs placés sur le même réseau Docker se joignent par leur nom. Docker fait office d'annuaire. Pas besoin d'adresse IP, ni de publier le port de la base.

Le navigateur est hors du réseau Docker. Les conteneurs sont dedans et se parlent par leur nom.
Terminal
docker network create demo
docker run -d --name db  --network demo -e POSTGRES_PASSWORD=secret postgres:18
docker run -d --name app --network demo -p 8080:8080 adminer
Exercice

Des données qui survivent

  1. Lance PostgreSQL 18 avec un volume nommé db-data.
  2. Crée une table stagiaires et insère ton prénom.
  3. Supprime le conteneur, recrée-le avec le même volume et relis la table.
  4. Nettoie : conteneur puis volume.
Ce que tu dois obtenir

Après suppression puis recréation du conteneur, SELECT renvoie toujours la ligne Moi. Sans le -v, la table n'existerait plus.

Un indice

psql est déjà installé dans l'image. Lance-le avec docker exec -it db psql -U postgres, ou passe directement une requête avec -c.

Voir la solution
Terminal
docker run -d --name db -e POSTGRES_PASSWORD=secret -v db-data:/var/lib/postgresql postgres:18
docker exec -it db psql -U postgres -c "CREATE TABLE stagiaires (nom text); INSERT INTO stagiaires VALUES ('Moi');"
docker rm -f db
docker run -d --name db -e POSTGRES_PASSWORD=secret -v db-data:/var/lib/postgresql postgres:18
docker exec -it db psql -U postgres -c "SELECT * FROM stagiaires;"
docker rm -f db && docker volume rm db-data
Exercice

Deux conteneurs qui se parlent

  1. Crée un réseau demo.
  2. Lance PostgreSQL dessus, sans publier de port.
  3. Lance l'image adminer sur le même réseau, accessible sur localhost:8081.
  4. Connecte-toi à la base depuis Adminer. Essaie aussi avec localhost comme serveur, pour voir l'échec.
Ce que tu dois obtenir

Tu es connecté à Adminer et tu vois la base postgres. Tu as saisi db comme serveur, sans adresse IP. Avec localhost, la connexion échoue.

Un indice

Adminer écoute sur le port 8080 dans son conteneur. Pour la connexion : système PostgreSQL, utilisateur postgres, mot de passe secret.

Voir la solution
Terminal
docker network create demo
docker run -d --name db --network demo -e POSTGRES_PASSWORD=secret postgres:18
docker run -d --name adminer --network demo -p 8081:8080 adminer
# Ouvre localhost:8081, serveur : db
docker rm -f db adminer && docker network rm demo
Échap