Aller au contenu
Conteneurs & Orchestration medium

Réseaux Docker : Bridge, Host, Overlay et plus

23 min de lecture

logo docker

Les conteneurs Docker sont isolés par défaut : ils ne peuvent pas communiquer entre eux ni avec l’extérieur sans configuration réseau. Docker propose 6 types de réseaux pour répondre à tous les scénarios : du développement local à la production distribuée. Ce guide vous apprend à choisir le bon réseau, à connecter vos conteneurs de manière sécurisée et à éviter les erreurs courantes.

  • Bridge : le réseau par défaut, idéal pour connecter des conteneurs sur un même hôte
  • Host : performances maximales en partageant le réseau de l’hôte
  • Overlay : communication entre conteneurs sur différents serveurs (Swarm/Kubernetes)
  • Macvlan/Ipvlan : intégration directe au réseau physique (applications legacy)
  • None : isolation totale pour les cas spéciaux de sécurité
  • Bonnes pratiques : sécurité, dépannage et optimisation réseau

Prérequis : Avoir lu le guide Docker : Guide Complet pour comprendre les bases des conteneurs.

Docker propose 6 drivers réseau natifs, chacun adapté à un cas d’usage spécifique. Le choix du bon réseau impacte directement la sécurité, les performances et la facilité de maintenance de vos applications conteneurisées.

Les 6 types de réseaux Docker : bridge, host, overlay, macvlan, ipvlan et none

TypeIsolationPerformanceMulti-hôtesCas d’usage principal
Bridge✅ BonneBonne❌ NonDéveloppement, apps multi-conteneurs
Host❌ Aucune⚡ Maximale❌ NonPerformance critique, monitoring
Overlay✅ BonneBonne✅ OuiProduction distribuée, Swarm
Macvlan✅ Excellente⚡ Très bonne❌ NonApplications legacy, intégration réseau physique
Ipvlan✅ Excellente⚡ Très bonne❌ NonEnvironnements avec restrictions MAC
None🔒 TotaleN/A❌ NonSécurité maximale, jobs batch

Avant de plonger dans chaque type, voici les commandes de base pour gérer les réseaux Docker :

Fenêtre de terminal
# Lister tous les réseaux
docker network ls
# Créer un réseau personnalisé
docker network create mon_reseau
# Inspecter un réseau (voir les conteneurs connectés, subnet, etc.)
docker network inspect mon_reseau
# Connecter un conteneur existant à un réseau
docker network connect mon_reseau mon_conteneur
# Déconnecter un conteneur d'un réseau
docker network disconnect mon_reseau mon_conteneur
# Supprimer un réseau
docker network rm mon_reseau
# Nettoyer les réseaux inutilisés
docker network prune

Le réseau bridge est le réseau par défaut de Docker. Quand vous lancez un conteneur sans spécifier de réseau, il rejoint automatiquement le bridge par défaut (docker0). Ce type de réseau crée un réseau privé interne à votre machine, où les conteneurs peuvent communiquer entre eux.

Analogie : Un réseau bridge, c’est comme un switch réseau virtuel installé sur votre machine. Chaque conteneur connecté reçoit une adresse IP privée et peut parler aux autres conteneurs du même switch.

Architecture du réseau Bridge Docker : conteneurs, bridge virtuel et NAT

Le bridge Docker fonctionne ainsi :

  1. Docker crée un bridge virtuel (docker0 par défaut) avec une plage d’adresses IP (ex: 172.17.0.0/16)
  2. Chaque conteneur reçoit une interface virtuelle eth0 connectée au bridge
  3. Les conteneurs communiquent entre eux via leurs adresses IP privées
  4. Pour sortir vers Internet, le trafic passe par des règles NAT (iptables)

Docker crée automatiquement un bridge nommé bridge (ou docker0), mais il est fortement recommandé de créer des bridges personnalisés pour vos applications.

FonctionnalitéBridge par défautBridge personnalisé
Résolution DNS❌ Par IP uniquement✅ Par nom de conteneur
Isolation❌ Tous les conteneurs✅ Seulement ceux connectés
Configuration❌ Limitée✅ Subnet, gateway, options

Pour créer un réseau bridge personnalisé, utilisez la commande docker network create :

Fenêtre de terminal
# Création d'un bridge personnalisé
docker network create --driver bridge mon_reseau
# Vérification
docker network ls

Sur un bridge personnalisé, Docker embarque un serveur DNS interne (127.0.0.11). Les conteneurs peuvent se joindre par leur nom au lieu d’utiliser des adresses IP. C’est l’avantage majeur par rapport au bridge par défaut.

Un conteneur peut être attaché à plusieurs réseaux simultanément :

Fenêtre de terminal
# Connecter un conteneur existant à un réseau
docker network connect mon_reseau mon_conteneur
# Vérifier les réseaux d'un conteneur
docker inspect mon_conteneur --format '{{json .NetworkSettings.Networks}}'

Exemple pratique : application web + base de données

Section intitulée « Exemple pratique : application web + base de données »

Imaginons une application web qui doit communiquer avec une base de données PostgreSQL. Voici comment configurer le réseau :

  1. Créez un réseau dédié à l’application

    Fenêtre de terminal
    docker network create --driver bridge app_network
  2. Lancez la base de données sur ce réseau

    Fenêtre de terminal
    docker run -d \
    --name db \
    --network app_network \
    -e POSTGRES_PASSWORD=secret \
    postgres:15
  3. Lancez l’application web sur le même réseau

    Fenêtre de terminal
    docker run -d \
    --name webapp \
    --network app_network \
    -p 8080:80 \
    -e DATABASE_HOST=db \
    mon_app_web
  4. Vérifiez la communication

    Fenêtre de terminal
    # Depuis le conteneur webapp, pingez la DB par son nom
    docker exec webapp ping -c 3 db

Dans cet exemple, l’application web peut se connecter à PostgreSQL en utilisant simplement db comme hostname, grâce à la résolution DNS automatique du bridge personnalisé.

Lors de la création d’un bridge, vous pouvez personnaliser plusieurs aspects :

Fenêtre de terminal
# Bridge avec subnet et gateway personnalisés
docker network create \
--driver bridge \
--subnet 10.10.0.0/24 \
--gateway 10.10.0.1 \
mon_reseau
# Désactiver la communication inter-conteneurs (isolation stricte)
docker network create \
--driver bridge \
--opt com.docker.network.bridge.enable_icc=false \
reseau_isole
# Attribuer une IP fixe à un conteneur
docker run -d \
--network mon_reseau \
--ip 10.10.0.100 \
nginx
OptionDescription
--subnetPlage d’adresses IP du réseau (ex: 10.10.0.0/24)
--gatewayPasserelle par défaut du réseau
--ip-rangeSous-plage pour l’attribution automatique d’IP
enable_icc=falseEmpêche les conteneurs de communiquer entre eux
enable_ip_masqueradeActive/désactive le NAT pour l’accès Internet

Le réseau host supprime complètement l’isolation réseau entre le conteneur et la machine hôte. Le conteneur partage directement l’interface réseau de l’hôte, sans aucune couche de virtualisation.

Analogie : Si le bridge est un switch virtuel, le mode host c’est comme brancher directement votre conteneur sur la carte réseau de la machine. Aucun intermédiaire, aucune traduction d’adresses.

Le mode host est réservé à des cas spécifiques où les performances réseau sont critiques :

Cas d’usagePourquoi host ?
Monitoring réseauAccès direct aux interfaces pour capturer le trafic
Applications à faible latenceÉlimination du NAT (~0.5ms de gain)
Serveurs de jeuxLatence minimale pour les connexions UDP
Outils de diagnosticAccès aux mêmes ports que l’hôte
Fenêtre de terminal
# Lancer un conteneur en mode host
docker run --network host nginx
# Vérifier : le conteneur utilise l'IP de l'hôte
docker exec mon_conteneur hostname -I
# Affiche l'adresse IP de la machine hôte
  • Pas de port mapping (-p n’a aucun effet) : le conteneur utilise directement les ports de l’hôte
  • Conflits de ports : si deux conteneurs utilisent le même port, le second échouera
  • Pas d’isolation réseau : le conteneur voit tout le réseau de l’hôte
  • Non disponible sur Docker Desktop (macOS/Windows) : fonctionne uniquement sur Linux natif

Le réseau overlay permet aux conteneurs de communiquer à travers plusieurs machines physiques. C’est la solution native de Docker pour les architectures distribuées, indispensable avec Docker Swarm ou dans des environnements de production multi-serveurs.

Analogie : Un overlay, c’est comme un VPN privé entre vos serveurs Docker. Les conteneurs pensent être sur le même réseau local, même s’ils sont physiquement sur des machines différentes.

Architecture du réseau Overlay Docker pour environnements multi-hôtes

Le réseau overlay fonctionne grâce à :

  1. VXLAN : encapsulation du trafic conteneur dans des paquets UDP
  2. Chiffrement IPsec (optionnel) : sécurisation du trafic entre nœuds
  3. DNS distribué : résolution des noms de conteneurs sur tous les nœuds

Le réseau overlay nécessite l’un de ces contextes :

  • Docker Swarm initialisé (recommandé)
  • Cluster Kubernetes avec le plugin CNI approprié
  • Docker en mode standalone avec un key-value store externe (etcd, Consul)
  1. Initialisez Docker Swarm (si pas déjà fait)

    Fenêtre de terminal
    docker swarm init
  2. Créez le réseau overlay

    Fenêtre de terminal
    docker network create \
    --driver overlay \
    --attachable \
    mon_overlay

    L’option --attachable permet aux conteneurs standalone (hors services Swarm) de rejoindre le réseau.

  3. Déployez des services sur ce réseau

    Fenêtre de terminal
    docker service create \
    --name api \
    --network mon_overlay \
    --replicas 3 \
    mon_api:latest
    docker service create \
    --name db \
    --network mon_overlay \
    postgres:15
  4. Vérifiez la communication inter-nœuds

    Fenêtre de terminal
    # Depuis n'importe quel réplica de l'API
    docker exec $(docker ps -q -f name=api) ping -c 3 db

Par défaut, le trafic overlay n’est pas chiffré. Pour les données sensibles, activez le chiffrement :

Fenêtre de terminal
docker network create \
--driver overlay \
--opt encrypted \
reseau_securise
OptionDescription
--attachablePermet aux conteneurs standalone de rejoindre le réseau
--encryptedActive le chiffrement IPsec du trafic
--subnetDéfinit le sous-réseau (ex: 10.0.0.0/24)
--gatewayPasserelle du réseau overlay

Le réseau Macvlan : apparaître comme un périphérique physique

Section intitulée « Le réseau Macvlan : apparaître comme un périphérique physique »

Le réseau macvlan attribue à chaque conteneur sa propre adresse MAC. Le conteneur apparaît alors comme un périphérique physique distinct sur le réseau local, avec sa propre adresse IP dans le même sous-réseau que l’hôte.

Analogie : Avec macvlan, votre conteneur obtient sa propre carte réseau virtuelle. Du point de vue du réseau, c’est comme si vous aviez branché un nouvel ordinateur sur le switch.

ScénarioPourquoi Macvlan ?
Applications legacyNécessitent une adresse IP accessible directement depuis le réseau
Intégration entrepriseLe conteneur doit apparaître comme un serveur classique
DHCP externeLe conteneur obtient son IP du serveur DHCP de l’entreprise
Multicast/BroadcastApplications qui utilisent ces protocoles
Fenêtre de terminal
# Créer un réseau macvlan connecté à l'interface eth0
docker network create \
--driver macvlan \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
-o parent=eth0 \
mon_macvlan
# Lancer un conteneur avec une IP dans le réseau local
docker run -d \
--network mon_macvlan \
--ip 192.168.1.100 \
--name serveur_web \
nginx

Le conteneur serveur_web est maintenant accessible à l’adresse 192.168.1.100 depuis n’importe quelle machine du réseau local.

ModeDescription
bridge (défaut)Les conteneurs communiquent entre eux et avec le réseau externe
privateLes conteneurs sont isolés les uns des autres
passthruUn seul conteneur par interface, accès direct
VEPATrafic passe par un switch externe capable de hairpin
Fenêtre de terminal
# Macvlan en mode private (isolation entre conteneurs)
docker network create \
--driver macvlan \
-o macvlan_mode=private \
-o parent=eth0 \
--subnet 192.168.1.0/24 \
reseau_prive

Le réseau ipvlan est similaire à macvlan, mais au lieu d’attribuer une adresse MAC unique à chaque conteneur, tous les conteneurs partagent l’adresse MAC de l’hôte. Seules les adresses IP sont distinctes.

CritèreMacvlanIpvlan
Adresse MACUnique par conteneurPartagée (celle de l’hôte)
Restrictions réseauPeut poser problème si limite de MACAucune restriction MAC
Mode L3Non supporté✅ Supporté
PerformanceExcellenteExcellente
  • Environnements avec limites d’adresses MAC : certains switches ou hyperviseurs limitent le nombre de MAC par port
  • Haute densité de conteneurs : évite l’explosion du nombre d’adresses MAC
  • Mode L3 : routage au niveau IP sans broadcast ARP

Mode L2 (couche liaison) : les conteneurs sont sur le même segment réseau que l’hôte

Fenêtre de terminal
docker network create \
--driver ipvlan \
-o ipvlan_mode=l2 \
-o parent=eth0 \
--subnet 192.168.1.0/24 \
ipvlan_l2

Mode L3 (couche réseau) : routage entre sous-réseaux, pas de broadcast ARP

Fenêtre de terminal
docker network create \
--driver ipvlan \
-o ipvlan_mode=l3 \
-o parent=eth0 \
--subnet 10.10.0.0/24 \
ipvlan_l3

Le réseau none désactive complètement l’accès réseau du conteneur. Aucune interface réseau n’est attachée (sauf loopback 127.0.0.1). Le conteneur est totalement isolé du monde extérieur.

Analogie : Un conteneur avec --network none, c’est comme un ordinateur sans carte réseau. Il peut fonctionner, mais ne peut ni envoyer ni recevoir de données sur le réseau.

ScénarioPourquoi none ?
Jobs batchTraitement de données sans besoin de réseau
Tests de sécuritéVérifier qu’une application fonctionne sans réseau
Conteneurs sensiblesEmpêcher toute fuite de données par le réseau
SandboxExécuter du code non fiable en isolation
Fenêtre de terminal
# Conteneur totalement isolé du réseau
docker run --network none -d --name batch_job mon_script
# Vérification : seul loopback est disponible
docker exec batch_job ip addr
# Affiche uniquement l'interface lo (127.0.0.1)
# Tentative de ping vers l'extérieur
docker exec batch_job ping -c 1 google.com
# ping: google.com: Network is unreachable
SymptômeCause probableSolution
Conteneur ne peut pas joindre InternetNAT/masquerade désactivésysctl net.ipv4.ip_forward=1
DNS ne résout pas les noms de conteneursUtilisation du bridge par défautCréer un bridge personnalisé
connection refused entre conteneursConteneurs sur des réseaux différentsConnecter les deux au même réseau
Latence élevéeOverlay sans optimisationVérifier MTU, désactiver chiffrement si non nécessaire
Port déjà utilisé (mode host)Conflit avec service sur l’hôteUtiliser un autre port ou passer en bridge
Fenêtre de terminal
# Voir les réseaux d'un conteneur
docker inspect -f '{{json .NetworkSettings.Networks}}' mon_conteneur | jq
# Tester la connectivité depuis un conteneur
docker exec mon_conteneur ping -c 3 autre_conteneur
docker exec mon_conteneur nslookup autre_conteneur
# Voir les règles iptables Docker
sudo iptables -L -n -t nat | grep -i docker
# Inspecter le bridge Docker
docker network inspect bridge
# Logs du daemon Docker (problèmes réseau)
journalctl -u docker.service | grep -i network
  • Isolez les applications : un réseau bridge par stack applicative
  • Limitez la communication : utilisez enable_icc=false si les conteneurs n’ont pas besoin de se parler
  • Chiffrez les overlay en production pour les données sensibles
  • Évitez le mode host sauf nécessité absolue de performance
  • Nommez vos réseaux de manière explicite : frontend_net, backend_net, monitoring_net
  • Documentez les plages d’adresses utilisées pour éviter les conflits
  • Utilisez des subnets fixes en production pour faciliter le debugging
  • Bridge : idéal pour la plupart des cas (overhead minimal)
  • Host : uniquement si le NAT est un goulot d’étranglement mesuré
  • Overlay : ajustez le MTU si vous constatez des problèmes de fragmentation

Théorie, c’est bien. Pratique, c’est mieux. Pour vraiment maîtriser Docker et les réseaux de conteneurs, je mets à ta disposition une série de TP concrets prêts à l’emploi sur mon dépôt GitHub.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

7 questions
5 min.
80%

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre