1.4 · Réseaux : faire dialoguer les conteneurs

Niveau 1 · Conteneurs : images, volumes, réseaux

1.4Réseaux : faire dialoguer les conteneurs

Objectif : connecter deux conteneurs entre eux sur un réseau dédié, sans exposer la base.
Temps estimé : 12 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

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.

Erreur d'interprétation fréquente : « Rester sur le bridge par défaut avec des IP suffit, et publier la base aide au débogage ». Non. Sans réseau dédié, pas de DNS par nom : les IP changent et la config casse. Et publier la base « pour tester » l'expose à toute la machine — un oubli suffit à laisser Postgres ouvert. Réseau dédié + noms + base non publiée.
Réseau dédié : câbler une appli Un réseau par appli : frontal publié, base interne Réseau monapp create,un par appliweb publié -p Joint del'extérieurbdd interne :5432 Jointe parnom, jamais publiée
Un réseau par appli : frontal publié, base interne
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Créer : Idir crée le réseau monapp — un par application, nommé clairement. 2) Brancher : bdd relancée dessus sans -p (invisible dehors), web relancé dessus avec -p 8080:80 (le seul frontal). 3) Prouver : ping bdd depuis web — la résolution par nom répond. Leçon : publier la base aurait exposé Postgres à toute la machine ; le nom bdd:5432 reste valable même si l'IP change.

🔎 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

  1. Créez un réseau monapp.
  2. Lancez la base dessus, SANS publication de port.
  3. Lancez le web dessus, AVEC publication 8080:80.
  4. Depuis le web (exec), pinguez la base par son nom.
Vos services dialoguent par noms, avec une surface exposée minimale.

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ù.

Checklist sortie de section
  • 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.
Auto-évaluation 1-5 : est-ce que ma base est joignable par nom sans être publiée ?est-ce que je sais prouver le câblage (inspect, 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.

Vérifiez votre compréhension

Sur un réseau dédié, comment le web doit-il joindre la base nommée « bdd » ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 1Questions inédites et durcies pour valider vos acquis