Réseaux Docker
Docker crée son propre réseau virtuel. Comprendre les drivers réseau est essentiel pour faire communiquer les conteneurs entre eux et avec l'extérieur.
Les drivers réseau
graph TD
HW[Interface réseau hôte eth0/192.168.1.x]
BR[Bridge docker0
172.17.0.0/16]
C1[Conteneur 1
172.17.0.2]
C2[Conteneur 2
172.17.0.3]
NET[Réseau personnalisé
172.18.0.0/16]
C3[Conteneur 3
172.18.0.2]
C4[Conteneur 4
172.18.0.3]
HW --> BR
BR --> C1
BR --> C2
HW --> NET
NET --> C3
NET --> C4
| Driver | Description | Usage |
|---|---|---|
| bridge | Réseau privé virtuel (défaut) | Conteneurs sur un même hôte |
| host | Partage la pile réseau hôte | Haute performance, pas d'isolation réseau |
| none | Aucun réseau | Conteneurs isolés complètement |
| overlay | Multi-hôtes | Docker Swarm / clustering |
Créer et utiliser des réseaux personnalisés
# Créer un réseau bridge personnalisé
docker network create mon-reseau
# Créer avec sous-réseau spécifique
docker network create --subnet 192.168.100.0/24 --gateway 192.168.100.1 mon-reseau
# Lister les réseaux
docker network ls
# Inspecter un réseau
docker network inspect mon-reseau
# Lancer des conteneurs sur ce réseau
docker run -d --name web --network mon-reseau nginx
docker run -d --name db --network mon-reseau mysql:8
# Les conteneurs se joignent par leur nom (DNS Docker interne)
docker exec web ping db # fonctionne !
Avantage réseau personnalisé : résolution DNS automatique par nom de conteneur. Sur le réseau bridge par défaut, les conteneurs ne se voient que par IP.
Exposition des ports
# Publier un port (hôte:conteneur)
docker run -d -p 8080:80 nginx # accessible de partout
docker run -d -p 127.0.0.1:8080:80 nginx # accessible que depuis localhost
# Publier tous les ports exposés (EXPOSE dans Dockerfile) sur des ports aléatoires
docker run -d -P nginx
docker port nginx # voir les mappings
# Connecter un conteneur existant à un second réseau
docker network connect mon-reseau2 mon-conteneur
Cas concret : réseau isolé pour une app web + DB
# Réseau interne (DB non exposée sur l'hôte)
docker network create app-network
# Base de données : uniquement visible sur app-network
docker run -d --name postgres --network app-network -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=myapp postgres:16
# Application web : exposée sur le port 8000 de l'hôte
docker run -d --name web-app --network app-network -p 8000:8000 -e DATABASE_URL=postgresql://postgres:secret@postgres/myapp mon-app:latest
# La DB n'est pas accessible depuis l'hôte directement
# Seule web-app peut joindre postgres (par son nom)
Erreurs fréquentes
- Réseau bridge par défaut : pas de DNS : les conteneurs sur le réseau
bridgepar défaut ne se voient que par IP, pas par nom. Toujours créer un réseau personnalisé pour le DNS. - Oublier d'ouvrir le pare-feu hôte :
-p 8080:80ajoute une règle iptables, mais un pare-feu système (firewalld, ufw) peut bloquer le trafic. - Exposer inutilement les ports DB : une base de données ne devrait jamais être exposée avec
-p 5432:5432en production. Utiliser un réseau Docker interne.
À retenir
- Réseau bridge personnalisé → DNS par nom de conteneur.
-p hôte:conteneur→ accès depuis l'extérieur.- Ne pas exposer les ports de bases de données sur l'hôte.
docker network create+--network mon-reseau→ isolation propre.