1.4Réseaux : faire dialoguer les conteneurs
L'essentiel en 30 secondes
- Le bridge par défaut isole sans nommer : chaque conteneur a une IP privée, mais les noms ne s'y résolvent pas — on bricole avec des IP qui changent.
- Un réseau par application : docker network create monapp puis --network monapp à chaque run — depuis le web, la base se joint par son --name (bdd:5432).
- Frontal publié, base interne : on ne publie (-p) que le web ; la base reste invisible de l'extérieur mais joignable de l'intérieur — inspect et ping prouvent le câblage.
Mini-cas filé — Idir câble web + base
La démo d'Idir grandit : son frontal doit parler à la base par son nom, pas par une IP notée sur un post-it. Il crée un réseau monapp, relance bdd dessus sans publier son port, puis relance web dessus avec -p 8080:80. Depuis le web, il ping bdd : ça répond par nom. Quand un collègue suggère de « publier la base pour tester », Idir refuse : exposer Postgres à toute la machine pour un test, c'est installer une habitude dangereuse.
Suite du cas 1.1-1.3 — Idir passe des conteneurs isolés à une application câblée.
1. Le réseau par défaut isole
Chaque conteneur reçoit une IP privée sur le réseau bridge par défaut, mais les noms ne s'y résolvent pas : on bricole avec des IP qui changent à chaque relance. Coder une IP en dur dans la config, c'est programmer la panne suivante.
La bonne pratique est de créer un réseau dédié par application : Docker y active la résolution par nom.
2. Un réseau par application
docker network create monapp puis --network monapp au run de chaque service : depuis le web, la base se joint par son --name (bdd:5432). On ne publie (-p) que le frontal ; la base reste invisible de l'extérieur mais joignable de l'intérieur.
Ce schéma « un réseau, un frontal publié » est exactement ce que Compose automatisera au niveau 3.
3. Voir pour croire : inspect et ping
docker network ls et inspect montrent qui est branché où. Depuis un conteneur, ping bdd ou une connexion prouve la résolution. Méthode : créer, brancher, prouver — dans cet ordre.
Si deux conteneurs ne se voient pas, on vérifie d'abord qu'ils partagent le même réseau, puis qu'on joint le nom et pas une IP.
🔎 Exemple concret — 🔎 Exemple concret — Web + base sur réseau privé
L'application câblée d'Idir : un frontal, une base invisible.
docker network create monapp
docker run -d --name bdd --network monapp -e POSTGRES_PASSWORD=secret postgres:16.4
docker run -d --name web --network monapp -p 8080:80 nginx:1.27
docker exec web ping -c2 bdd
Lecture : le ping réussit par nom, sans publier la base.
Leçon : publier la base aurait exposé Postgres à toute la machine.
Vocabulaire de la section
- Bridge
- Pilote réseau isolé par défaut entre conteneurs et hôte ; sans résolution par nom.
Exemple simple : Le réseau par défaut où Idir bricolait avec des IP.
Ce que ce n'est pas : un réseau d'application avec DNS par nom.
Réflexe : défaut = provisoire, appli = réseau dédié.
- Réseau dédié
- Réseau créé par application (network create), avec résolution DNS par nom entre ses conteneurs.
Exemple simple : monapp, où web joint bdd:5432.
Ce que ce n'est pas : un réseau par conteneur.
Réflexe : séparer par appli, pas par service.
- Résolution par nom
- Joindre un conteneur par son --name plutôt que par son IP changeante.
Exemple simple : ping bdd depuis web, valable après chaque relance.
Ce que ce n'est pas : une IP codée en dur dans la config.
Réflexe : toujours le nom, jamais l'IP.
- Frontal
- Le seul service publié vers l'extérieur (le web) ; tout le reste reste interne.
Exemple simple : web en 8080:80, bdd non publiée chez Idir.
Ce que ce n'est pas : chaque service publié « au cas où ».
Réflexe : un seul publié : le frontal.
En pratique — En pratique — Câbler une mini-appli
- Créez un réseau monapp.
- Lancez la base dessus, SANS publication de port.
- Lancez le web dessus, AVEC publication 8080:80.
- Depuis le web (exec), pinguez la base par son nom.
Script prêt à dire — câbler deux conteneurs (30 s)
« Je crée un réseau par appli : network create monapp. Je branche la base dessus sans publier son port, et le web dessus avec -p 8080:80. Depuis le web, je ping la base par son nom : bdd. Le frontal est publié, la base ne l'est jamais. »
À dire en tapant create puis les deux runs ; terminer par le ping réussi.
Modèle copier-coller — appli deux services
docker network create monapp
docker run -d --name bdd --network monapp -e POSTGRES_PASSWORD=secret postgres:16.4
docker run -d --name web --network monapp -p 8080:80 nginx:1.27
docker exec web ping -c2 bdd # preuve par nom
docker network ls # vérifier les branchements
Appli d'Idir
Comme ci-dessus : monapp, bdd interne, web publié — le schéma que Compose reprendra automatiquement au niveau 3.
Deux applis cohabitent
monapp et compta, deux réseaux séparés : les bdd de chaque appli se joignent par nom sans se voir entre applis.
Diagnostic de panne
Deux conteneurs sourds : vérifier network inspect des deux côtés — neuf fois sur dix, ils ne partagent pas le même réseau.
Refus de publier la base
« Pour tester » : non — on teste depuis le web avec exec et ping, la base reste fermée à l'extérieur. Habitude dangereuse refusée.
✓ Bonnes pratiques
- Un réseau par application, nommé clairement.
- Ne publier que le frontal.
- Joindre par nom, jamais par IP.
✗ Pièges fréquents
- Rester sur le bridge par défaut (pas de DNS).
- Publier la base « pour tester » puis l'oublier.
- Coder des IP en dur dans la config.
Points clés à retenir
- Le réseau dédié active le DNS par nom.
- Base en interne, frontal publié : la règle.
- inspect et ping prouvent le câblage.
- Compose reprendra ce schéma automatiquement.
Défi 48h — appliquez demain
Créez monapp, branchez-y bdd (sans -p) et web (8080:80), puis pinguez bdd par son nom depuis web. Vérifiez avec network inspect qui est branché où.
- Je crée un réseau dédié par application.
- Je ne publie que le frontal, la base reste interne.
- Je joins les services par nom et je prouve par ping.
Questions fréquentes
Pourquoi deux conteneurs ne se voient pas ?
Souvent ils ne partagent pas le même réseau, ou on tente une IP au lieu du nom. Vérifiez network inspect des deux côtés, puis joignez le --name.
Faut-il un réseau par conteneur ?
Non : un réseau par application (web + base + cache ensemble). Séparer par appli, pas par service.
Sur un réseau dédié, comment le web doit-il joindre la base nommée « bdd » ?