Réseaux Docker
Objectifs du chapitre
- Comprendre les types de réseaux Docker
- Créer et configurer des réseaux
- Connecter des conteneurs entre eux
- Isoler les applications
1 - Introduction aux réseaux Docker
Pourquoi les réseaux Docker ?
Les réseaux Docker permettent :
- Communication entre conteneurs
- Isolation des applications
- Résolution DNS automatique
- Contrôle du trafic réseau
Les réseaux par défaut
# Lister les réseaux
docker network ls
# Résultat
NETWORK ID NAME DRIVER SCOPE
abc123... bridge bridge local
def456... host host local
ghi789... none null local
2 - Types de réseaux (drivers)
Bridge (par défaut)
┌─────────────────────────────────────────────────────────────┐
│ Hôte │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ docker0 (bridge) │ │
│ │ 172.17.0.1 │ │
│ └────────┬─────────────────┬─────────────────┬────────┘ │
│ │ │ │ │
│ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ │
│ │ Container │ │ Container │ │ Container │ │
│ │ 172.17.0.2│ │ 172.17.0.3│ │ 172.17.0.4│ │
│ └───────────┘ └───────────┘ └───────────┘ │
└─────────────────────────────────────────────────────────────┘
- Réseau isolé sur l'hôte
- Les conteneurs peuvent communiquer entre eux
- NAT pour accéder à l'extérieur
Host
# Le conteneur utilise directement le réseau de l'hôte
docker run --network host nginx
# Pas d'isolation réseau
# Port 80 du conteneur = Port 80 de l'hôte
None
# Aucune interface réseau
docker run --network none alpine ip addr
# Uniquement loopback (127.0.0.1)
Overlay (Swarm)
- Communication entre plusieurs hôtes Docker
- Utilisé avec Docker Swarm
- Chiffrement disponible
Macvlan
# Chaque conteneur a sa propre adresse MAC
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 \
mon-macvlan
Comparaison
| Driver | Isolation | Multi-hôte | Usage |
|---|---|---|---|
| bridge | Oui | Non | Développement, production simple |
| host | Non | Non | Performance maximale |
| none | Totale | Non | Sécurité maximale |
| overlay | Oui | Oui | Swarm, clusters |
| macvlan | Oui | Non | Intégration réseau existant |
3 - Gestion des réseaux
Créer un réseau
# Réseau bridge simple
docker network create mon-reseau
# Avec configuration personnalisée
docker network create \
--driver bridge \
--subnet 172.20.0.0/16 \
--ip-range 172.20.240.0/20 \
--gateway 172.20.0.1 \
mon-reseau-custom
# Réseau interne (sans accès externe)
docker network create --internal mon-reseau-interne
Lister et inspecter
# Lister les réseaux
docker network ls
# Filtrer
docker network ls --filter driver=bridge
# Inspecter un réseau
docker network inspect mon-reseau
# Voir les conteneurs connectés
docker network inspect mon-reseau --format '{{range .Containers}}{{.Name}} {{end}}'
Supprimer des réseaux
# Supprimer un réseau
docker network rm mon-reseau
# Supprimer les r éseaux non utilisés
docker network prune
# Forcer
docker network prune -f
4 - Connecter des conteneurs
Au démarrage
# Connecter à un réseau spécifique
docker run -d --name web --network mon-reseau nginx
# Avec une IP fixe
docker run -d --name db \
--network mon-reseau \
--ip 172.20.0.10 \
postgres:15
Après démarrage
# Connecter un conteneur existant
docker network connect mon-reseau mon-conteneur
# Avec une IP spécifique
docker network connect --ip 172.20.0.20 mon-reseau mon-conteneur
# Déconnecter
docker network disconnect mon-reseau mon-conteneur
Conteneur sur plusieurs réseaux
# Créer deux réseaux
docker network create frontend
docker network create backend
# Connecter un conteneur aux deux réseaux
docker run -d --name api --network frontend mon-api
docker network connect backend api
# L'API peut communiquer avec frontend ET backend
5 - Résolution DNS
DNS automatique dans les réseaux personnalisés
# Créer un réseau
docker network create mon-app
# Lancer des conteneurs
docker run -d --name db --network mon-app postgres:15
docker run -d --name web --network mon-app nginx
# Les conteneurs peuvent se résoudre par leur nom
docker exec web ping db
# PING db (172.20.0.2): 56 data bytes
Aliases réseau
# Créer un alias
docker run -d \
--name postgres-primary \
--network mon-app \
--network-alias db \
--network-alias database \
postgres:15
# Les deux alias fonctionnent
docker exec web ping db
docker exec web ping database
DNS Round-Robin
# Plusieurs conteneurs avec le même alias
docker run -d --name web1 --network mon-app --network-alias web nginx
docker run -d --name web2 --network mon-app --network-alias web nginx
docker run -d --name web3 --network mon-app --network-alias web nginx
# Le DNS retourne toutes les IPs (load balancing basique)
docker run --rm --network mon-app alpine nslookup web
6 - Communication entre conteneurs
Exemple : Application Web + Base de données
# Créer le réseau
docker network create webapp
# Lancer la base de données
docker run -d \
--name db \
--network webapp \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=myapp \
postgres:15
# Lancer l'application
docker run -d \
--name app \
--network webapp \
-e DATABASE_URL=postgres://postgres:secret@db:5432/myapp \
-p 3000:3000 \
mon-app
Exemple : Architecture microservices
# Créer les réseaux
docker network create frontend
docker network create backend
# Base de données (backend uniquement)
docker run -d \
--name postgres \
--network backend \
-e POSTGRES_PASSWORD=secret \
postgres:15
# API (frontend + backend)
docker run -d \
--name api \
--network backend \
-e DB_HOST=postgres \
mon-api
docker network connect frontend api
# Frontend (frontend uniquement)
docker run -d \
--name nginx \
--network frontend \
-p 80:80 \
nginx
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────── frontend ────────────────┐ │
│ │ │ │
│ │ ┌───────────┐ ┌───────────┐ │ │
│ │ │ nginx │ ───── │ api │ │ │
│ │ │ :80 │ │ │ │ │
│ │ └───────────┘ └─────┬─────┘ │ │
│ │ │ │ │
│ └─────────────────────────────┼────────────┘ │
│ │ │
│ ┌──────────────── backend ────┼────────────┐ │
│ │ │ │ │
│ │ ┌─────▼─────┐ │ │
│ │ │ postgres │ │ │
│ │ │ :5432 │ │ │
│ │ └───────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
7 - Publication de ports
Syntaxe
# Format
-p [IP_HOTE:]PORT_HOTE:PORT_CONTENEUR[/PROTOCOLE]
# Exemples
-p 8080:80 # Toutes les interfaces
-p 127.0.0.1:8080:80 # Localhost uniquement
-p 80:80 -p 443:443 # Plusieurs ports
-p 8080:80/tcp # TCP explicite
-p 5000:5000/udp # UDP
Publier tous les ports exposés
# Publie tous les ports EXPOSE sur des ports aléatoires
docker run -d -P nginx
# Voir les ports assignés
docker port mon-conteneur
# 80/tcp -> 0.0.0.0:32768
Vérifier les ports
# Ports d'un conteneur
docker port mon-conteneur
# Dans docker ps
docker ps --format "table {{.Names}}\t{{.Ports}}"
# Depuis l'extérieur
curl http://localhost:8080
8 - Sécurité réseau
Réseaux internes
# Créer un réseau sans accès externe
docker network create --internal secure-net
# Les conteneurs ne peuvent pas accéder à Internet
docker run --network secure-net alpine ping google.com
# ping: bad address 'google.com'
Isolation des applications
# Application 1 sur son propre réseau
docker network create app1-net
docker run -d --name app1-db --network app1-net postgres:15
docker run -d --name app1-web --network app1-net -p 8001:80 nginx
# Application 2 sur son propre réseau
docker network create app2-net
docker run -d --name app2-db --network app2-net postgres:15
docker run -d --name app2-web --network app2-net -p 8002:80 nginx
# app1 ne peut PAS communiquer avec app2
Bonnes pratiques
# ✅ Utiliser des réseaux personnalisés (pas bridge par défaut)
docker network create mon-app
# ✅ Exposer uniquement les ports nécessaires
-p 127.0.0.1:3000:3000 # Localhost uniquement
# ✅ Utiliser des réseaux internes pour les BDD
docker network create --internal db-net
# ✅ Séparer frontend et backend
docker network create frontend
docker network create --internal backend
9 - Debugging réseau
Inspecter la connectivité
# Voir la configuration réseau d'un conteneur
docker inspect mon-conteneur --format '{{json .NetworkSettings.Networks}}'
# Tester la connectivité
docker exec mon-conteneur ping autre-conteneur
# Voir les connexions
docker exec mon-conteneur netstat -an
# Résolution DNS
docker exec mon-conteneur nslookup service-name
Outils de debug
# Conteneur de debug avec outils réseau
docker run -it --network mon-reseau nicolaka/netshoot
# Dans le conteneur netshoot
ping db
nslookup web
curl http://api:3000
tcpdump -i eth0
Problèmes courants
| Problème | Cause probable | Solution |
|---|---|---|
| Conteneur inaccessible | Pas sur le même réseau | docker network connect |
| DNS ne résout pas | Réseau bridge par défaut | Utiliser un réseau personnalisé |
| Port inaccessible | Non publié | Ajouter -p port:port |
| Connection refused | Service pas démarré | Vérifier les logs |
Résumé
| Commande | Description |
|---|---|
docker network create | Créer un réseau |
docker network ls | Lister les réseaux |
docker network inspect | Détails d'un réseau |
docker network connect | Connecter un conteneur |
docker network disconnect | Déconnecter un conteneur |
docker network rm | Supprimer un réseau |
docker network prune | Nettoyer les réseaux |
| Driver | Usage |
|---|---|
| bridge | Applications isolées (défaut) |
| host | Performance, pas d'isolation |
| none | Sécurité maximale |
| overlay | Multi-hôte (Swarm) |
Points clés
- Utilisez des réseaux personnalisés pour le DNS automatique
- Isolez les applications avec des réseaux séparés
- Publiez uniquement les ports nécessaires
- Utilisez des réseaux internes pour les services sensibles
Exercices pratiques
- Créez un réseau et faites communiquer deux conteneurs par leur nom
- Configurez une architecture avec frontend/backend isolés
- Testez la résolution DNS entre conteneurs
- Créez un réseau interne et vérifiez l'absence d'accès externe