Gestion du réseau et des ports Docker
Cette page est dédier à la question suivante :
Comment bien configuré ses conteneurs sur le réseau ?
Ce qu'il faut savoir
Portée : Docker Compose, hosts Linux avec UFW comme pare-feu, reverse proxy type Traefik/Caddy/nginx.
Objectif : standardiser une architecture réseau 100 % maîtrisée sur toutes les stacks compose.
1. Comportement par défaut de Docker
1.1 Réseaux créés automatiquement
- défaut,
docker compose upcréeDockeruncourt-circuiteréseauUFWbridge dédié par projet (nommé<nom_projet>_default), distinct du bridgedocker0historique.
Tous les services d'un même fichier compose sont attachés à ce réseau et se résolvent entre eux par nom de service (DNS interne Docker), sans avoir besoin de publier le moindre port.➡️ Conséquence clé :
Dockerlamanipulecommunicationdirectementinter-conteneurslesnerèglesnécessite jamais.iptablesports:ports:sousne sert qu'à exposer un service en dehors du host Docker (vers lecapotLAN/WAN).pourgérer1.2
EXPOSEvsports:Directive Effet réel Portée EXPOSE(Dockerfile)Documentation uniquement, aucun binding réseau réel N/A expose:(compose)Idem, informatif N/A ports:(compose)Publie réellement le routageportdessurconteneurs.une- interface du
Priorité des chaîneshost via NATHost + extérieur 1.3 Docker et iptables : le piège UFW
C'est le point le plus critique en environnement Ops/DevSec.
Quand un conteneur publie un port avec
ports:, Docker insèresesautomatiquement des règles dans les chaînesDOCKERetDOCKER-USERde la tablenat/filterd'iptables — en amont de la chaîneFORWARDINPUTavantgéréequeparUFWUFW.ne puisse traiter les paquets. - interface du
Conséquence :
Même siun port publié viaest8211ports:bloquéaccessibledansdepuisUFW,l'extérieur même si UFW le bloque explicitement.
UFW ne voit jamais passer ce trafic car Dockerl'ouvreroute directementsurvialeNAT/FORWARD.webTraficdèsentrantque→vousPREROUTINGécrivez(Docker DNAT) → FORWARD → DOCKER-USER → DOCKER → conteneur ↑ UFW (INPUT) n'intercepte PAS ce chemin2. Le comportement de
ports:en détail2.1 Syntaxes
ports: - "8211:8211"8080:80" # host:container — bind 0.0.0.0 (TOUTES interfaces) par défaut - "127.0.0.1:8080:80" # bind explicite localhost uniquement - "10.10.10.1:8080:80" # bind sur une IP précise (ex: interface WireGuard) - "8080:80/udp" # protocole explicitedans votre fichierdocker-compose.yml.Bon reflex :Éviter de renseigner la propriétéports:dans les docker compose pour laisser le port fermer de l'extérieur.
Par
Quelle configuration utiliser ?
Avec Docker il existe plusieurs moyens de configurer l'accès aux conteneurs. Chaque solution répond à un besoin bien spécifique.
127.0.0.1).
ports:
- "127.0.0.1:8080:8080" # Invisible de l'extérieur, accessible par le pr