Interconnexion Docker : connecter correctement Web et base de données

Vendredi 15 h, je préparais la conteneurisation de mon environnement local de dev, plutôt satisfait : conteneur MySQL démarré, conteneur Node.js aussi, il ne restait qu’à les connecter. Je rafraîchis la page — erreur 500, et les logs pleins de « Connection refused ».
J’étais perplexe : les deux conteneurs tournaient pourtant. J’ai tenté un ping sur le nom du conteneur MySQL — « unknown host ». Bon, testons avec l’IP — ça passe ! L’app se connecte à la base. Soulagé, je commit, j’éteins, je rentre.
Lundi, la catastrophe : l’app est encore tombée. MySQL avait redémarré et son IP était passée de 172.17.0.2 à 172.17.0.3. Vraiment frustrant — fallait-il modifier la config à chaque redémarrage ?
Si vous avez vécu ça, cet article est pour vous. Un après-midi à étudier le réseau Docker m’a permis de comprendre la bonne méthode d’interconnexion. Voici ce que nous verrons :
- Pourquoi le ping par nom de conteneur échoue, et la cause profonde
- Les limites du réseau par défaut Docker
- Comment un réseau personnalisé résout ces problèmes
- Les étapes complètes pour que vos conteneurs s’accèdent par nom
- Quelques astuces avancées et bonnes pratiques
Pourquoi le ping par nom de conteneur échoue-t-il ?
Limites du réseau par défaut Docker
La cause est dans la configuration réseau par défaut de Docker. Sans réseau spécifié, chaque conteneur rejoint automatiquement le bridge par défaut (docker0).
Cette limite majeure : communication uniquement par IP, sans résolution par nom de conteneur.
Concrètement, sur le réseau par défaut :
- ✅ Accès par IP (
ping 172.17.0.2) - ❌ Accès par nom de conteneur (
ping mysql-containeréchoue)
Pourquoi ? Pas de DNS intégré. Imaginez un téléphone sans carnet d’adresses : vous mémorisez les numéros (IP), pas les noms.
Pire encore : à chaque redémarrage, Docker réattribue une IP. Aujourd’hui 172.17.0.2 pour MySQL, demain peut-être 172.17.0.3 — la config IP de votre app devient invalide.
Vérification en commandes :
# Démarrer un conteneur MySQL (réseau par défaut)
docker run -d --name mysql-demo \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
# Démarrer un conteneur busybox pour tester
docker run -it --name test-box busybox sh
# Dans test-box, tenter un ping par nom
/ # ping mysql-demo
ping: bad address 'mysql-demo' # ← échec de résolution
# Voir l'IP du conteneur MySQL
docker inspect mysql-demo | grep IPAddress
# "IPAddress": "172.17.0.2"
# Par IP, ça fonctionne
/ # ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.123 ms
Le nom ne passe pas, seule l’IP fonctionne.
Le paramètre —link est obsolète
Dans les anciens tutoriels, on trouve --link, solution précoce de Docker :
docker run --link mysql-demo:mysql -d my-app
my-app peut alors accéder à mysql-demo via « mysql ». Mais Docker déconseille explicitement —link, et le supprimera dans les versions futures.
Raisons principales :
- Connexion unidirectionnelle : seul my-app accède à mysql, pas l’inverse
- Maintenance difficile : avec beaucoup de conteneurs, la config —link devient complexe
- Fonctionnalités limitées : pas adapté à la gestion réseau multi-conteneurs
Si vous utilisez encore —link, il est temps de migrer.
Réseau personnalisé : la bonne approche pour l’interconnexion
Avantages du réseau personnalisé
Depuis Docker 1.12, docker network permet de créer des réseaux personnalisés — la méthode recommandée par Docker.
Par rapport au réseau par défaut, un bridge personnalisé offre :
-
Résolution DNS automatique : Docker exécute un serveur DNS intégré ; les noms de conteneurs se résolvent en IP. Un « carnet d’adresses » pour le réseau.
-
Isolation réseau : les conteneurs de réseaux différents sont isolés par défaut. Frontend, backend et base de données peuvent être sur des réseaux séparés.
-
Meilleure maintenabilité : l’IP change au redémarrage ? Peu importe, vous utilisez le nom — le DNS met à jour l’enregistrement.
-
Multi-réseaux : un conteneur peut rejoindre plusieurs réseaux pour des topologies plus complexes.
Au début, le réseau Docker me semblait opaque ; une fois ces points compris, tout devient clair.
Créer un réseau personnalisé
La commande est simple :
# Version minimale : nom du réseau uniquement
docker network create my-app-net
# Version complète
docker network create \
--driver bridge \ # Type de driver, bridge par défaut
--subnet 172.20.0.0/16 \ # Plage IP personnalisée (optionnel)
--gateway 172.20.0.1 \ # Passerelle personnalisée (optionnel)
my-app-net # Nom du réseau
Pour la plupart des cas, la version simple suffit. Docker attribue automatiquement une plage IP sans conflit.
Après création, inspectez le réseau :
docker network inspect my-app-net
Vous verrez la plage IP, la passerelle, les conteneurs connectés, etc.
Connecter un conteneur au réseau personnalisé
Deux méthodes :
Méthode 1 : à la création (recommandée)
docker run -d \
--name mysql-demo \
--network my-app-net \ # ← paramètre clé
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
Méthode 2 : conteneur déjà en cours d’exécution
# Conteneur déjà lancé
docker network connect my-app-net existing-container
La première méthode est préférable — tout en une étape. La seconde convient pour migrer un conteneur existant.
Cas pratique : application Web et base MySQL
Assez de théorie, passons à la pratique : un conteneur Node.js qui se connecte à un conteneur MySQL.
Scénario
Objectifs :
- Conteneur MySQL nommé
mysql-server, sur un réseau personnalisé - Conteneur Node.js nommé
node-app, sur le même réseau - L’app se connecte par le nom « mysql-server », pas par IP
Étapes complètes
Étape 1 : créer le réseau personnalisé
docker network create my-app-net
Un ID réseau s’affiche, par exemple :
a1b2c3d4e5f67890abcdef1234567890abcdef1234567890abcdef1234567890
Le réseau est créé.
Étape 2 : démarrer MySQL sur le réseau
docker run -d \
--name mysql-server \
--network my-app-net \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-e MYSQL_DATABASE=myapp_db \
mysql:8.0
Paramètres :
--name mysql-server: nom utilisé comme host pour la connexion--network my-app-net: réseau créé à l’étape 1-e MYSQL_ROOT_PASSWORD: mot de passe root-e MYSQL_DATABASE: base initiale
Étape 3 : démarrer l’application sur le réseau
Exemple Node.js (adaptez selon vos besoins) :
docker run -d \
--name node-app \
--network my-app-net \
-p 3000:3000 \
-e DB_HOST=mysql-server \
-e DB_USER=root \
-e DB_PASSWORD=my-secret-pw \
-e DB_NAME=myapp_db \
my-node-app:latest
Notez DB_HOST=mysql-server : c’est le nom du conteneur, pas l’IP !
Étape 4 : connexion par nom dans le code
Exemple Node.js :
const mysql = require('mysql2');
// Connexion via variables d'environnement
const connection = mysql.createConnection({
host: process.env.DB_HOST, // valeur : 'mysql-server' (nom du conteneur)
user: process.env.DB_USER, // valeur : 'root'
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
connection.connect((err) => {
if (err) {
console.error('Échec de connexion à la base :', err);
return;
}
console.log('Connexion MySQL réussie !');
});
Le host utilise le nom mysql-server — le DNS Docker le résout en IP courante.
Étape 5 : vérifier la connectivité
Entrez dans le conteneur node-app :
# Entrer dans le conteneur applicatif
docker exec -it node-app sh
# ping par nom MySQL
/ # ping mysql-server
PING mysql-server (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.089 ms
64 bytes from 172.20.0.2: seq=1 ttl=64 time=0.096 ms
Le nom se résout et le ping fonctionne.
Avec nslookup :
/ # nslookup mysql-server
Server: 127.0.0.11 # ← serveur DNS Docker intégré
Address: 127.0.0.11:53
Name: mysql-server
Address: 172.20.0.2 # ← IP du conteneur MySQL
Docker exécute un DNS (127.0.0.11) sur le réseau personnalisé pour résoudre les noms.
Même si MySQL redémarre et change d’IP, l’app n’est pas affectée — le DNS met à jour l’enregistrement.
Dépannage
Commandes utiles en cas de problème :
1. Détails du réseau
docker network inspect my-app-net
Sortie JSON avec plage IP, passerelle, conteneurs connectés et leur IP.
2. Config réseau d’un conteneur
docker inspect mysql-server | grep -A 20 Networks
Réseaux connectés et IP par réseau.
3. Logs des conteneurs
docker logs node-app
docker logs mysql-server
Les logs contiennent souvent le détail des erreurs de connexion.
Checklist de dépannage :
| Problème | Cause probable | Solution |
|---|---|---|
| ping par nom échoue | Conteneurs pas sur le même réseau | docker network inspect pour vérifier, docker network connect pour connecter |
| ping OK mais app ne se connecte pas | Port mal configuré | Vérifier le port dans l’app et le port MySQL (3306 par défaut) |
| Base refuse la connexion | Identifiants ou droits incorrects | Vérifier les variables d’env, entrer dans MySQL pour contrôler les droits |
| Erreur DNS | Probablement réseau par défaut | Créer un réseau personnalisé et relancer les conteneurs |
Astuces avancées et bonnes pratiques
Multi-réseaux : séparation frontend/backend
En production, une topologie plus complexe peut être nécessaire :
# Créer deux réseaux
docker network create frontend-net # réseau frontend
docker network create backend-net # réseau backend
# Frontend uniquement sur frontend-net
docker run -d --name nginx \
--network frontend-net \
-p 80:80 \
nginx:latest
# API sur les deux réseaux (frontend et backend)
docker run -d --name api-server \
--network frontend-net \
my-api:latest
docker network connect backend-net api-server
# Base de données uniquement sur backend-net (frontend isolé, plus sûr)
docker run -d --name postgres \
--network backend-net \
-e POSTGRES_PASSWORD=secret \
postgres:14
Avantages :
- nginx accède à api-server, pas à la base
- api-server accède à la base
- base isolée, accessible uniquement par le backend
C’est ainsi que nous déployons certains projets en entreprise — sécurité nettement améliorée.
Simplifier avec Docker Compose
Avec beaucoup de conteneurs, la gestion manuelle devient pénible. Docker Compose intervient alors.
Fichier docker-compose.yml :
version: '3.8'
services:
# Service MySQL
mysql:
image: mysql:8.0
container_name: mysql-server
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
MYSQL_DATABASE: myapp_db
networks:
- app-network
volumes:
- mysql-data:/var/lib/mysql
# Service Node.js
app:
image: my-node-app:latest
container_name: node-app
ports:
- "3000:3000"
environment:
DB_HOST: mysql # ← nom du service, pas container_name
DB_USER: root
DB_PASSWORD: my-secret-pw
DB_NAME: myapp_db
networks:
- app-network
depends_on:
- mysql
# Réseau
networks:
app-network:
driver: bridge
# Volumes
volumes:
mysql-data:
Une commande pour tout démarrer :
docker-compose up -d
Docker Compose :
- crée app-network
- démarre tous les conteneurs sur ce réseau
- configure la résolution DNS inter-conteneurs
- respecte depends_on (mysql avant app)
Arrêt et nettoyage :
# Arrêter tous les services
docker-compose down
# Arrêter et supprimer les volumes
docker-compose down -v
Honnêtement, je ne gère presque plus les conteneurs à la main — tout passe par Docker Compose, bien plus efficace.
Autres modes réseau
Outre bridge, Docker propose d’autres modes :
| Mode | Cas d’usage | Caractéristiques |
|---|---|---|
| bridge | Communication multi-conteneurs sur une machine | Mode par défaut, isolation, communication via pont |
| host | Réseau haute performance | Réseau hôte direct, pas d’isolation, meilleures perfs |
| overlay | Communication inter-hôtes | Docker Swarm ou Kubernetes, conteneurs sur plusieurs machines |
| none | Conteneur totalement isolé | Pas d’interface réseau, exigences de sécurité maximales |
En pratique, un bridge personnalisé suffit. host convient aux cas extrêmes (trading haute fréquence). overlay est la base de Swarm et K8s — rarement à configurer manuellement.
FAQ
Q1 : Pourquoi l’IP fonctionne mais pas le nom de conteneur ?
R : Vos conteneurs sont sur le bridge par défaut (docker0), sans DNS ni résolution par nom. Créez un réseau personnalisé et y connectez les conteneurs.
Q2 : —link est-il encore utilisable ?
R : Oui pour l’instant, mais Docker le déconseille et le supprimera. Migrez vers un réseau personnalisé — plus de fonctionnalités, aligné sur l’avenir.
Q3 : Un réseau personnalisé impacte-t-il les performances ?
R : Presque pas. Même implémentation bridge que le réseau par défaut, avec DNS en plus. Écart négligeable.
Q4 : Comment un conteneur accède-t-il à Internet ?
R : Par défaut, les conteneurs bridge accèdent à l’extérieur via NAT. En cas d’échec, vérifiez iptables Docker ou la config réseau de l’hôte.
Q5 : Migrer un conteneur existant vers un réseau personnalisé ?
R : Deux étapes :
# 1. Connecter au nouveau réseau
docker network connect my-app-net old-container
# 2. (Optionnel) Déconnecter du réseau par défaut
docker network disconnect bridge old-container
Mieux : recréer le conteneur avec --network directement.
Q6 : Le nom de conteneur peut-il contenir des majuscules ?
R : Oui, mais déconseillé. Le DNS recommande minuscules, chiffres et tirets — plus portable, moins de problèmes.
Q7 : Un conteneur peut-il être sur plusieurs réseaux ?
R : Oui ! C’est la force des réseaux personnalisés. docker network connect pour des topologies complexes.
Résumé
Points clés :
Étape 1 : comprendre la cause
- Le réseau par défaut ne résout pas les noms, seulement l’IP
- L’IP change au redémarrage, la connexion échoue
- —link est obsolète, ne l’utilisez plus
Étape 2 : créer un réseau personnalisé
docker network create my-app-net
Étape 3 : rejoindre le réseau, communiquer par nom
# Lancer avec le réseau
docker run -d --name mysql-server --network my-app-net mysql:8.0
# Connexion applicative par nom
host: 'mysql-server' // pas l'IP, le nom du conteneur
Méthode simple et pratique recommandée par Docker — applications plus stables et maintenables.
Pour un projet microservices ou multi-conteneurs, je recommande :
- Agir maintenant : migrer vers un réseau personnalisé, fini le hardcodage d’IP
- Essayer Compose : avec 3+ conteneurs, Docker Compose simplifie la gestion
- Approfondir : overlay et modèle réseau Kubernetes — base du cloud natif
Le réseau conteneur a une courbe d’apprentissage, mais une fois maîtrisé, Docker devient bien plus agréable. Ouvrez un terminal et créez votre premier réseau personnalisé !
Des questions ? Commentez — j’essaierai de répondre.
Configuration complète de l'interconnexion Docker
Utiliser un réseau personnalisé pour résoudre l'échec de résolution par nom et les changements d'IP, et stabiliser la communication Web/base de données
⏱️ Estimated time: 15 min
- 1
Step 1: Comprendre la cause : limites du réseau par défaut Docker
Cause du problème :
• Le réseau par défaut (bridge) ne communique que par IP, sans résolution par nom de conteneur
• Chaque redémarrage réattribue une IP, ce qui invalide la config applicative
Limites du réseau par défaut :
• Pas de DNS intégré, accès uniquement par IP
• ping du nom de conteneur échoue (unknown host)
• IP variable, inadapté à la production
Scénario concret :
• Conteneur MySQL démarré, conteneur Node.js aussi
• L'app ne peut pas se connecter par nom, seulement par IP
• Après redémarrage, l'IP change et la config devient invalide - 2
Step 2: Créer un réseau personnalisé
Créer un réseau personnalisé :
• Utiliser docker network create
• Commande : docker network create my-app-net
• Le réseau personnalisé supporte la résolution par nom
• Les changements d'IP n'affectent pas la config applicative
Vérifier la création :
• docker network ls pour lister les réseaux
• Confirmer que le réseau personnalisé existe - 3
Step 3: Lancer les conteneurs sur le réseau
Lancer les conteneurs sur le réseau :
• Utiliser --network pour spécifier le réseau
• Commande : docker run -d --name mysql-server --network my-app-net mysql:8.0
• Dans l'app, connecter par nom de conteneur (host: 'mysql-server', pas l'IP)
Vérifier la connexion :
• ping du nom : docker exec -it web-container ping mysql-server
• Ou tester la connexion applicative à la base de données - 4
Step 4: Automatiser avec docker-compose
Astuce avancée : docker-compose crée automatiquement le réseau
Définir le réseau dans docker-compose.yml :
• networks:
my-app-net:
driver: bridge
• Les services rejoignent le même réseau, résolution par nom automatique, config simple et fiable
Exemple docker-compose :
• Définir les services dans services
• Définir le réseau dans networks
• Les services utilisent le réseau spécifié, résolution par nom automatique
Méthode simple et pratique recommandée par Docker — applications conteneurisées plus stables et maintenables.
FAQ
Pourquoi le ping par nom de conteneur échoue-t-il ? Quelles sont les limites du réseau par défaut Docker ?
Limites du réseau par défaut :
• Pas de DNS intégré
• Accès uniquement par IP
• ping par nom échoue (unknown host)
• IP variable, inadapté à la production
Scénario : MySQL et Node.js tournent, mais l'app ne se connecte que par IP ; après redémarrage, l'IP change et la config devient invalide.
Comment résoudre l'interconnexion des conteneurs ? Comment configurer un réseau personnalisé ?
Étapes complètes :
1. Créer le réseau : docker network create my-app-net
2. Lancer avec --network my-app-net
3. Connecter l'app par nom : host: 'mysql-server'
4. Vérifier : ping par nom ou test de connexion applicative
Comment configurer le réseau des conteneurs avec docker-compose ?
Étapes de config :
• Définir le réseau dans docker-compose.yml (networks: my-app-net: driver: bridge)
• Les services rejoignent le même réseau
• Résolution par nom automatique
• Config simple et fiable
Exemple docker-compose :
• Définir les services dans services
• Définir le réseau dans networks
• Les services utilisent le réseau spécifié
• Résolution par nom automatique
Méthode simple et pratique recommandée par Docker — applications conteneurisées plus stables et maintenables.
10 min de lecture · Publié le: 17 déc. 2025 · Mis à jour le: 27 juil. 2026
Guide pratique Docker
Si vous arrivez depuis la recherche, le plus rapide est de passer à l’article précédent ou suivant de cette série.
Précédent
Modes réseau Docker : bridge/host/none/container — performance et choix de scénarios
Analyse approfondie des quatre modes réseau Docker (bridge/host/none/container) : principes, comparaison de performance et cas d'usage, pour faire le bon choix de configuration réseau, avec exemples pratiques et guide de décision.
Partie 18 sur 38
Suivant
Mapping de ports Docker : ne laissez pas « port déjà alloué » gâcher votre vendredi soir
Du diagnostic d'occupation de port à l'optimisation des performances : résoudre systématiquement tous les casse-têtes du mapping de ports Docker et dire adieu à l'erreur port already allocated
Partie 20 sur 38



Commentaires
Connectez-vous avec GitHub pour laisser un commentaire