Réseau et volumes dans Docker
DNS interne, ports publiés, volumes nommés.
Objectifs
À la fin de cette leçon, vous saurez :
- comprendre pourquoi localhost change de sens dans un conteneur ;
- faire communiquer deux conteneurs par leur nom ;
- persister des données avec un volume.
🔗 Pour vous rafraîchir la mémoire : commandes docker de base · processus et signaux (ps, kill, top) · manipulation de fichiers (cp, mv, rm)
localhost : chaque conteneur est sa propre machine
┌───────────── hôte ─────────────┐
│ ┌──────────┐ ┌───────────┐ │
│ │ backend │ │ postgres │ │
│ │ localhost│ │ localhost │ │
│ │ = backend│ │ = postgres│ │
│ └────┬─────┘ └───────────┘ │
│ ↓ localhost:5432 ÉCHOUE │
└────────────────────────────────┘
Dans le backend, localhost désigne le conteneur backend LUI-MÊME — pas l'hôte, pas PostgreSQL. La connexion échoue alors que « tout marche sur ma machine ». Le correctif : parler au NOM du service :
backend ──→ postgres:5432 ← DNS interne Docker résout le nom
Sur un réseau Docker défini, chaque conteneur reçoit son nom enregistré dans le DNS interne. C'est la règle d'or :
entre conteneurs → noms de services
depuis l'hôte → ports publiés (-p 8080:80)
Le port publié mappe hôte↔conteneur (8080 externe vers 80 interne) ; les conteneurs entre eux utilisent les ports internes directs.
Volumes : survivre à la destruction
Problème fondamental :
filesystem du conteneur → rm du conteneur → DONNÉES PERDUES
Un volume délègue un dossier au stockage de l'hôte :
docker volume create pgdata
docker run -d -v pgdata:/var/lib/postgresql/data postgres
docker rm -f $(docker ps -aq) # tout détruire...
docker run -d -v pgdata:/var/lib/postgresql/data postgres
# ...les données sont toujours là
Deux usages distincts :
- volume nommé (
pgdata) : données de production gérées par Docker ; - bind mount (
-v ./src:/app/src) : dossier hôte monté pour le développement live.
C'est exactement votre compose.yaml Devmind : le volume pgdata pour PostgreSQL et course-uploads pour les fichiers — sans eux, chaque docker compose down effacerait la plateforme.
Exercice
- Lancez deux conteneurs sur un même réseau (
--network demo) ; faites pinger le second par son nom depuis le premier. - Depuis backend, testez localhost:5432 vs postgres:5432 : constatez.
- Créez un volume, écrivez dedans via un conteneur, détruisez le conteneur, relisez.
Résumé
- localhost = soi-même : entre conteneurs on parle par noms.
- Ports publiés = hôte→conteneur ; réseau interne = direct.
- Volume nommé = persistance au-delà de la vie du conteneur.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Point sur l'exercice 3
docker run --rm -v demodata:/data alpine sh -c "echo coucou > /data/f.txt" puis destruction, puis relecture avec un nouveau conteneur monté sur le même volume : coucou est revenu. La donnée vit dans le volume, jamais dans le conteneur.