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.
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.
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é par | Docker | Toi (un dossier du projet) |
| Sert à | Base de données, fichiers générés | Code 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.
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 adminerDes données qui survivent
- Lance PostgreSQL 18 avec un volume nommé
db-data. - Crée une table
stagiaireset insère ton prénom. - Supprime le conteneur, recrée-le avec le même volume et relis la table.
- 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
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-dataDeux conteneurs qui se parlent
- Crée un réseau
demo. - Lance PostgreSQL dessus, sans publier de port.
- Lance l'image
adminersur le même réseau, accessible surlocalhost:8081. - 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
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