Maîtrisez les 6 types de réseaux Docker : bridge, host, overlay, macvlan, ipvlan, none. Guide complet pour connecter, isoler et sécuriser vos conteneurs.
L’issue s’ouvre déjà remplie avec le titre et l’adresse de cette page.
Un conteneur Docker lancé sans option n'est pas isolé : il rejoint le bridge par défaut, où il joint ses voisins par adresse IP et sort vers Internet par une règle NAT. Ce qui lui manque, et qui surprend, c'est la résolution par nom. Docker propose 6 drivers réseau, du poste de développement à la production distribuée. Ce guide vous apprend à choisir le bon, à mesurer ce que chacun autorise vraiment, et à éviter les erreurs courantes.
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.
La colonne qui décide dans presque tous les cas est Multi-hôtes : si vos conteneurs tournent sur plusieurs machines, seul overlay répond, tous les autres drivers s'arrêtent aux frontières de l'hôte. La colonne Isolation vient ensuite : elle indique si un conteneur compromis voit uniquement ses voisins de réseau ou l'ensemble de la pile réseau de la machine. Les mentions de performance sont qualitatives : l'écart entre bridge et host reste marginal tant que vous ne saturez pas la carte réseau.
Ces sept commandes couvrent le cycle de vie complet d'un réseau Docker. Retenez surtout docker network inspect : c'est la seule qui affiche à la fois le subnet, la passerelle et la liste des conteneurs réellement attachés, donc le premier réflexe quand deux conteneurs ne se voient pas. Attention à docker network prune : il supprime tous les réseaux sans conteneur attaché, y compris ceux que vous venez de créer pour une stack à l'arrêt.
Fenêtre de terminal
# Lister tous les réseaux
dockernetworkls
# Créer un réseau personnalisé
dockernetworkcreatemon_reseau
# Inspecter un réseau (voir les conteneurs connectés, subnet, etc.)
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.
Le schéma ci-dessous montre les trois éléments qui expliquent la plupart des incidents réseau sur un poste de développement : le bridge virtuel côté hôte, la paire d'interfaces veth qui relie chaque conteneur à ce bridge, et les règles NAT qui traduisent l'adresse privée du conteneur en adresse de l'hôte pour sortir vers Internet. Regardez d'abord où passe la frontière : tout ce qui est au-dessus du bridge appartient au namespace réseau du conteneur, tout ce qui est en dessous appartient à l'hôte.
Réseau bridge Docker : trois conteneurs en 172.17.0.2 à 172.17.0.4 et les règles iptables NAT du port mapping se raccordent au bridge docker0 (172.17.0.1), relié à l'interface eth0 de l'hôte (192.168.1.10) qui sort vers Internet ; les conteneurs se joignent par nom.Machine hôte : les conteneurs se joignent par nomInternetContainer Aeth0 172.17.0.2, port 8080Container Beth0 172.17.0.3, port 5432Container Ceth0 172.17.0.4, port 6379iptables NAT-p 8080:8080 (port mapping)Bridge docker0 (172.17.0.1)eth0 hôte (192.168.1.10)
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.
Sur Docker Engine 29.1.3, la première et la troisième réussissent, la
deuxième échoue. L'isolation supposée du bridge par défaut n'existe pas : ce
qui manque est le DNS, pas le cloisonnement.
L'isolation entre deux réseaux personnalisés, elle, est réelle : un conteneur
de l'un ne joint pas l'adresse d'un conteneur de l'autre, ce qui se vérifie
de la même façon en quelques secondes.
La commande docker network create utilise le driver bridge par défaut, --driver bridge est donc redondant ici mais rend l'intention explicite dans un script. Sans option de subnet, Docker choisit lui-même une plage libre dans 172.16.0.0/12. Vérifiez le résultat avec docker network ls : le nouveau réseau doit apparaître avec le scope local et un identifiant court de 12 caractères.
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, ce qui sert à publier un service sur un réseau frontal tout en gardant l'accès à une base de données sur un réseau privé. Chaque rattachement ajoute une interface dans le conteneur et une entrée DNS supplémentaire. La sortie de docker inspect ci-dessous est un objet JSON indexé par nom de réseau : c'est là que vous lisez l'adresse IP attribuée sur chacun, et donc que vous confirmez qu'un conteneur qui « ne répond pas » n'est tout simplement pas sur le bon réseau.
Imaginons une application web qui doit communiquer avec une base de données PostgreSQL. Voici comment configurer le réseau :
Créez un réseau dédié à l'application
Fenêtre de terminal
dockernetworkcreate--driverbridgeapp_network
Lancez la base de données sur ce réseau
Fenêtre de terminal
dockerrun-d\
--namedb\
--networkapp_network\
-ePOSTGRES_PASSWORD=secret\
postgres:15
Lancez l'application web sur le même réseau
Fenêtre de terminal
dockerrun-d\
--namewebapp\
--networkapp_network\
-p8080:80\
-eDATABASE_HOST=db\
mon_app_web
Vérifiez la communication
Fenêtre de terminal
# Depuis le conteneur webapp, pingez la DB par son nom
dockerexecwebappping-c3db
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é.
Ces options servent surtout à deux besoins : éviter les collisions de plages IP avec le réseau de l'entreprise, et durcir l'isolation entre conteneurs. Le point important à retenir : --ip ne fonctionne que sur un réseau personnalisé. Sur le bridge par défaut, le démon refuse la demande avec user specified IP address is supported on user defined networks only. Le tableau qui suit distingue les drapeaux de la commande (--subnet, --gateway, --ip-range) des options de driver passées avec -o ou --opt (enable_icc, enable_ip_masquerade) : ce ne sont pas les mêmes préfixes et c'est une source d'erreur fréquente.
Fenêtre de terminal
# Bridge avec subnet et gateway personnalisés
dockernetworkcreate\
--driverbridge\
--subnet10.10.0.0/24\
--gateway10.10.0.1\
mon_reseau
# Désactiver la communication inter-conteneurs (isolation stricte)
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.
Le seul cas vraiment incontournable est le premier : un agent qui doit voir les interfaces physiques de la machine, comme une sonde de capture de trafic, ne peut pas travailler depuis un namespace réseau isolé. Pour les trois autres, mesurez avant de basculer : le gain de latence dépend de votre charge et le mode host vous fait perdre toute isolation, ce qui n'est jamais un bon échange sans chiffre à l'appui.
Le mode host se demande à l'exécution avec --network host, aucune configuration préalable n'est nécessaire. La vérification qui compte est la deuxième commande : hostname -I doit renvoyer exactement les adresses de la machine hôte, et non une adresse en 172.x. Si vous voyez une adresse privée Docker, c'est que le conteneur est resté sur un bridge.
Ces limitations ne sont pas des détails de configuration : elles changent la façon dont vous déployez. La deuxième est celle qui surprend le plus en production, parce qu'elle transforme un simple redémarrage en conflit de port silencieux quand le service de l'hôte occupe déjà l'écoute. Vérifiez toujours avec ss -tlnp avant de basculer un conteneur en mode host.
Pas de publication de ports (-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
Support partiel hors Linux natif : Docker Desktop 4.34 et versions ultérieures propose le réseau host, mais uniquement pour des conteneurs Linux, après activation dans les réglages, et sans les protocoles situés sous TCP/UDP
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.
Ce schéma répond à une question précise : comment deux conteneurs qui ne partagent aucun câble se retrouvent sur le même sous-réseau logique. La réponse tient dans le tunnel VXLAN dessiné entre les nœuds, qui emballe les trames des conteneurs dans des paquets UDP routés normalement par votre réseau physique. Conséquence pratique visible sur le schéma : chaque nœud doit pouvoir joindre les autres sur le port 4789/UDP, sinon le réseau se crée sans erreur mais aucun trafic ne passe.
Réseau overlay Docker : quatre conteneurs répartis sur deux hôtes partagent le sous-réseau my_overlay 10.0.0.0/24 et se joignent par nom, grâce à un tunnel VXLAN chiffré (IPsec optionnel) entre hôtes, coordonné par le manager Docker Swarm.Hôte 1 (worker node)Hôte 2 (worker node)Réseau overlay my_overlay (10.0.0.0/24)communication par nom entre hôtesTunnel VXLAN chiffré (IPsec optionnel)Docker Swarm Managerweb-frontend10.0.0.2api-service10.0.0.3database10.0.0.4cache-redis10.0.0.5
Le driver overlay de Docker Engine n'existe que dans le mode Swarm. C'est un point à vérifier avant toute autre chose : sur un démon Docker isolé, docker network create --driver overlay échoue, et le contournement historique par magasin clé-valeur externe n'est plus une option. Côté pare-feu, prévoyez d'ouvrir les ports entre les nœuds avant les tests, faute de quoi la création réussira sans que le trafic ne circule.
Docker Swarm initialisé : docker swarm init sur le premier nœud, docker swarm join sur les autres
Ports ouverts entre nœuds : 2377/TCP pour la gestion du cluster, 7946/TCP et 7946/UDP pour la découverte, 4789/UDP pour le trafic overlay
Kubernetes n'utilise pas ce driver : un cluster Kubernetes passe par un plugin CNI (Calico, Cilium, Flannel) qui remplace entièrement la couche réseau de Docker
La séquence ci-dessous se déroule entièrement sur le nœud manager : c'est lui qui propage la définition du réseau vers les autres nœuds. Un détail à ne pas manquer, un réseau overlay créé sans --attachable reste invisible depuis docker run et n'accepte que des services Swarm, ce qui donne un message network not manually attachable déroutant lors des premiers essais.
Initialisez Docker Swarm (si pas déjà fait)
Fenêtre de terminal
dockerswarminit
Créez le réseau overlay
Fenêtre de terminal
dockernetworkcreate\
--driveroverlay\
--attachable\
mon_overlay
L'option --attachable permet aux conteneurs standalone (hors services Swarm) de rejoindre le réseau.
Ces quatre paramètres se posent à la création du réseau et ne se modifient pas ensuite : changer le sous-réseau d'un overlay impose de le recréer, donc de recréer les services qui l'utilisent. Notez la différence de syntaxe entre les drapeaux propres à la commande et l'option de driver du chiffrement, passée par --opt : c'est l'erreur la plus courante sur cette section.
Option
Description
--attachable
Permet aux conteneurs standalone de rejoindre le réseau
--opt encrypted
Active le chiffrement IPsec du trafic (option de driver, pas de drapeau --encrypted)
--subnet
Définit le sous-réseau (ex: 10.0.0.0/24)
--gateway
Passerelle du réseau overlay
Glissez pour voir
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.
Le dénominateur commun de ces quatre scénarios : l'application refuse de fonctionner derrière une traduction d'adresses. Un logiciel de supervision qui découvre ses équipements par broadcast, un serveur qui doit apparaître dans l'inventaire réseau avec sa propre adresse, un client DHCP intégré, tous cassent dès qu'un NAT s'interpose. Si votre application accepte un simple port publié, restez sur un bridge : macvlan demande une coordination avec l'équipe réseau que le bridge évite.
Scénario
Pourquoi Macvlan ?
Applications legacy
Nécessitent une adresse IP accessible directement depuis le réseau
Intégration entreprise
Le conteneur doit apparaître comme un serveur classique
DHCP externe
Le conteneur obtient son IP du serveur DHCP de l'entreprise
Trois valeurs doivent correspondre au réseau physique réel, pas à un plan d'adressage inventé : le --subnet, la --gateway et l'interface parent. Relevez-les avec ip route et ip -br link sur l'hôte avant de lancer la commande, en remplaçant eth0 par le nom réel de votre carte, souvent enp0s3 ou ens18 sur les distributions récentes. Réservez également une plage d'adresses hors du périmètre DHCP avec --ip-range, sinon le serveur DHCP de l'entreprise finira par attribuer une adresse déjà prise par un conteneur.
Fenêtre de terminal
# Créer un réseau macvlan connecté à l'interface eth0
dockernetworkcreate\
--drivermacvlan\
--subnet192.168.1.0/24\
--gateway192.168.1.1\
-oparent=eth0\
mon_macvlan
# Lancer un conteneur avec une IP dans le réseau local
dockerrun-d\
--networkmon_macvlan\
--ip192.168.1.100\
--nameserveur_web\
nginx
Le conteneur serveur_web est maintenant accessible à l'adresse 192.168.1.100 depuis n'importe quelle machine du réseau local.
Dans la quasi-totalité des déploiements, vous garderez le mode bridge par défaut et ne toucherez pas à cette option. Les trois autres répondent à des contraintes de commutateur : private et VEPA existent pour forcer le trafic entre conteneurs à repasser par l'équipement réseau, donc à être filtré et journalisé par lui. Le mode se choisit à la création avec l'option de driver -o macvlan_mode=, il n'est pas modifiable ensuite.
Mode
Description
bridge (défaut)
Les conteneurs communiquent entre eux et avec le réseau externe
private
Les conteneurs sont isolés les uns des autres
passthru
Un seul conteneur par interface, accès direct
VEPA
Trafic passe par un switch externe capable de hairpin
Glissez pour voir
Fenêtre de terminal
# Macvlan en mode private (isolation entre conteneurs)
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.
La ligne décisive de ce tableau est la première. Une adresse MAC unique par conteneur est ce qui pose problème dans deux environnements très répandus : les commutateurs configurés avec du port security, qui coupent le port au-delà d'un certain nombre d'adresses, et les hyperviseurs qui n'autorisent pas le mode promiscuous sur une carte virtuelle. Dans ces deux cas, ipvlan passe là où macvlan est bloqué, pour un fonctionnement par ailleurs équivalent.
Le signal le plus fiable est un incident, pas une préférence de conception : si votre port de commutateur se désactive ou si vos conteneurs macvlan deviennent injoignables au-delà de quelques instances, vous êtes dans le premier cas ci-dessous. Le troisième point, le mode L3, relève d'un choix d'architecture assumé et suppose que vos routeurs connaissent la route vers le sous-réseau des conteneurs.
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
Ipvlan propose deux façons de raccorder les conteneurs, et la différence porte sur qui gère l'accessibilité. En L2, l'hôte répond aux requêtes ARP et vos conteneurs se comportent comme des machines du réseau local, sans configuration côté routeur. En L3, l'hôte devient un routeur pour un sous-réseau qui lui est propre : plus aucun broadcast ne sort, mais vos équipements réseau doivent connaître la route statique vers ce sous-réseau, sinon les réponses ne reviendront jamais.
Mode L2 (couche liaison) : les conteneurs sont sur le même segment réseau que l'hôte
Fenêtre de terminal
dockernetworkcreate\
--driveripvlan\
-oipvlan_mode=l2\
-oparent=eth0\
--subnet192.168.1.0/24\
ipvlan_l2
Mode L3 (couche réseau) : routage entre sous-réseaux, pas de broadcast ARP
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.
Le point commun de ces situations est que l'absence de réseau est une garantie recherchée, pas une contrainte subie. Le mode none ferme la sortie de données par le réseau au niveau du noyau et non par une règle de pare-feu : il n'y a pas d'interface à contourner. C'est ce qui en fait une réponse solide pour exécuter un traitement sur des données confidentielles ou un binaire dont vous n'avez pas la source.
Scénario
Pourquoi none ?
Jobs batch
Traitement de données sans besoin de réseau
Tests de sécurité
Vérifier qu'une application fonctionne sans réseau
Deux vérifications suffisent à confirmer l'isolation. La première liste les interfaces : seule lo doit apparaître, aucune eth0. La seconde tente une sortie, et le message d'erreur diffère selon la cible : viser un nom de domaine échoue dès la résolution DNS, viser une adresse IP échoue plus loin, au moment de l'émission, faute de route. Les deux confirment l'isolation, mais seul le test par adresse IP prouve qu'aucune route ne sort du conteneur.
Lisez ce tableau de gauche à droite en partant du symptôme observé, pas de la cause supposée. Les deux premières lignes couvrent l'écrasante majorité des tickets sur un poste de développement : le transfert IP désactivé sur l'hôte, souvent par un durcissement système ou un VPN d'entreprise, et l'usage du bridge par défaut qui prive vos conteneurs de la résolution par nom. Avant d'appliquer une solution, confirmez la cause avec les commandes de diagnostic qui suivent : appliquer un correctif au hasard masque le vrai problème.
Symptôme
Cause probable
Solution
Conteneur ne peut pas joindre Internet
NAT/masquerade désactivé
sysctl net.ipv4.ip_forward=1
DNS ne résout pas les noms de conteneurs
Utilisation du bridge par défaut
Créer un bridge personnalisé
connection refused entre conteneurs
Conteneurs sur des réseaux différents
Connecter les deux au même réseau
Latence élevée
Overlay sans optimisation
Vérifier MTU, désactiver chiffrement si non nécessaire
Prenez ces commandes dans l'ordre : elles vont du plus proche du conteneur au plus proche du système. La première dit sur quels réseaux se trouve réellement le conteneur, ce qui règle la moitié des cas. Si les deux conteneurs partagent bien un réseau, nslookup sépare un problème de résolution de noms d'un problème de routage. Les règles iptables et les journaux du démon ne servent qu'ensuite, quand le conteneur ne sort pas vers Internet alors que la communication interne fonctionne.
Ces trois familles de règles se hiérarchisent : la sécurité d'abord, parce qu'un réseau mal cloisonné se corrige difficilement une fois la production lancée, l'organisation ensuite, parce qu'elle conditionne votre capacité à diagnostiquer, la performance en dernier, parce qu'elle ne devient un sujet qu'avec des mesures à l'appui.
Le principe qui gouverne les quatre points ci-dessous est le moindre privilège appliqué au réseau : un conteneur ne doit pouvoir joindre que ce dont il a besoin. Le gain concret est mesurable lors d'une compromission, un conteneur frontal piraté ne doit pas pouvoir balayer la base de données d'une autre stack. Commencez par le premier point, il apporte à lui seul l'essentiel du cloisonnement pour un coût de mise en place nul.
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
Ces conventions coûtent quelques minutes à la création et font gagner des heures au premier incident. La plus rentable est la troisième : un subnet fixe rend vos adresses de conteneurs prévisibles entre deux redémarrages, donc utilisables dans une règle de pare-feu ou un tableau de bord. Sans elle, Docker réattribue les plages dans l'ordre de création et vos références deviennent fausses après un docker network prune.
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
Le message principal de cette section est de ne rien changer sans mesure. Le surcoût du bridge reste invisible pour une application web classique, et basculer en mode host « pour aller plus vite » revient à sacrifier l'isolation sans preuve de gain. Le seul réglage qui se justifie souvent est le troisième : sur un réseau overlay, l'encapsulation VXLAN consomme des octets dans chaque paquet, ce qui provoque des blocages sur les gros transferts si le MTU n'est pas ajusté.
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.
Ce questionnaire porte sur les points où les erreurs coûtent le plus cher : le choix du driver selon la topologie, la différence entre bridge par défaut et bridge personnalisé, et les conditions d'usage du réseau overlay. Comptez cinq minutes, le seuil de réussite est fixé à 80 %.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
7 questions
5 min.
80% requis
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
⏱️--:--
0 / 7
Vérification
(0/0)
--:--
0%
0Correctes
0À revoir
0:00Temps
-Niveau
Score par domaine
Un domaine regroupe plusieurs guides et reçoit plusieurs questions : son score est plus fiable qu'un score par thème, qui porte souvent sur une seule question.
Bilan
Points forts
Aucun sujet réussi à 80 % sur au moins deux questions pour l’instant.