Réseaux Swarm
Objectifs du chapitre
- Comprendre les réseaux overlay
- Configurer le routing mesh
- Créer des réseaux personnalisés
- Isoler les applications
1 - Types de réseaux dans Swarm
Vue d'ensemble
┌─────────────────────────────────────────────────────────────┐
│ Docker Swarm Networks │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐ │
│ │ Ingress │ │ Overlay │ │ docker_gwbridge│ │
│ │ (built-in) │ │ (user-def) │ │ (built-in) │ │
│ │ │ │ │ │ │ │
│ │ Load balancer │ │ Service-to- │ │ NAT pour les │ │
│ │ externe │ │ service comm │ │ conteneurs │ │
│ └───────────────┘ └───────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Réseaux par défaut
| Réseau | Type | Usage |
|---|---|---|
ingress | Overlay | Routing mesh pour les ports publiés |
docker_gwbridge | Bridge | Communication externe des conteneurs |
# Voir les réseaux Swarm
docker network ls --filter scope=swarm
2 - Réseau Overlay
Concept
Un réseau overlay permet la communication entre conteneurs sur différents nœuds physiques.
Node 1 Node 2
┌──────────────────────┐ ┌──────────────────────┐
│ ┌──────────────┐ │ │ ┌──────────────┐ │
│ │ Container A │ │ │ │ Container B │ │
│ │ 10.0.0.2 │ │ │ │ 10.0.0.3 │ │
│ └──────┬───────┘ │ │ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌──────▼───────────┴──────────┴──────────▼───────┐ │
│ │ Overlay Network (10.0.0.0/24) │ │
│ │ VXLAN │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │ │ │ │
└──────────┼───────────┘ └──────────┼───────────┘
│ │
┌──────▼─────────────────────────────────▼──────┐
│ Physical Network │
└────────────────────────────────────────────────┘
Créer un réseau overlay
# Réseau overlay simple
docker network create --driver overlay my-overlay
# Avec configuration personnalisée
docker network create --driver overlay \
--subnet 10.10.0.0/16 \
--gateway 10.10.0.1 \
my-network
# Réseau attachable (pour les conteneurs standalone)
docker network create --driver overlay --attachable my-attachable
# Réseau chiffré
docker network create --driver overlay --opt encrypted my-secure
Utiliser un réseau overlay
# Créer un service sur le réseau
docker service create --name web \
--network my-overlay \
nginx
# Ajouter un réseau à un service existant
docker service update --network-add my-overlay web
# Retirer un réseau
docker service update --network-rm my-overlay web
3 - Routing Mesh
Concept
Le routing mesh permet d'accéder à un service publié depuis n'importe quel nœud du cluster, même si le conteneur ne s'y trouve pas.
Client Request (port 80)
│
▼
┌─────────────────────────────────────────────────────────────┐
│ ANY NODE IN SWARM │
│ (même sans conteneur) │
└─────────────────────────┬───────────────────────────────────┘
│ Ingress Network
▼
┌─────────────────────────────────────────────────────────────┐
│ Internal Load Balancer │
│ (Round Robin) │
└────────────┬────────────────┬────────────────┬──────────────┘
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ web.1 │ │ web.2 │ │ web.3 │
│ Node 1 │ │ Node 2 │ │ Node 3 │
└─────────┘ └─────────┘ └─────────┘
Publier un port
# Publication avec routing mesh (par défaut)
docker service create --name web -p 80:80 nginx
# Mode ingress explicite
docker service create --name web \
-p mode=ingress,published=80,target=80 \
nginx
Mode host (bypass routing mesh)
# Publier directement sur le nœud
docker service create --name web \
-p mode=host,published=80,target=80 \
--mode global \
nginx
| Mode | Description | Cas d'usage |
|---|---|---|
ingress | Routing mesh (LB interne) | Applications web standard |
host | Direct sur le nœud | Performance, sticky sessions |
4 - Service Discovery
DNS interne
Swarm fournit un DNS interne pour la résolution des services :
# Créer deux services sur le même réseau
docker network create --driver overlay backend
docker service create --name api \
--network backend \
--replicas 3 \
myapi:latest
docker service create --name db \
--network backend \
postgres:15
# Dans le conteneur api, vous pouvez résoudre :
# - db → IP du service db
# - api → VIP du service api
# - tasks.api → IPs de toutes les tâches api
Virtual IP (VIP) vs DNS Round Robin
# Mode VIP (par défaut)
# Une seule IP virtuelle, load balancing transparent
docker service create --name web --network my-overlay nginx
# Mode DNS Round Robin
# DNS retourne toutes les IPs, le client choisit
docker service create --name web \
--network my-overlay \
--endpoint-mode dnsrr \
nginx
| Mode | Description | Cas d'usage |
|---|---|---|
vip | IP virtuelle unique | Applications standard |
dnsrr | DNS Round Robin | Load balancers externes, gRPC |
5 - Réseaux multi-services
Architecture micro-services
# Exemple avec isolation réseau
services:
# Frontend - accessible depuis l'extérieur
nginx:
networks:
- frontend
ports:
- "80:80"
# API - connecte frontend et backend
api:
networks:
- frontend
- backend
# Database - uniquement backend
db:
networks:
- backend
networks:
frontend:
driver: overlay
backend:
driver: overlay
internal: true # Pas d'accès externe
Internet
│
▼
┌──────────────────────────────────────────────────────┐
│ Frontend Network │
│ ┌─────────┐ ┌─────────┐ │
│ │ nginx │────── ────────│ api │ │
│ └─────────┘ └────┬────┘ │
└────────────────────────────────┼─────────────────────┘
│
┌────────────────────────────────┼─────────────────────┐
│ Backend Network (internal) │
│ ┌───▼────┐ │
│ │ api │ │
│ └────┬───┘ │
│ │ │
│ ┌────▼───┐ │
│ │ db │ │
│ └────────┘ │
└──────────────────────────────────────────────────────┘
6 - Réseaux chiffrés
Activer le chiffrement
# Créer un réseau chiffré
docker network create --driver overlay \
--opt encrypted \
secure-network
# Le trafic entre nœuds est chiffré via IPsec
Quand utiliser le chiffrement
| Situation | Chiffrement |
|---|---|
| Réseau de confiance (datacenter privé) | Optionnel |
| Multi-cloud | Recommandé |
| Données sensibles | Obligatoire |
| Conformité (PCI-DSS, HIPAA) | Obligatoire |
Performance
Le chiffrement ajoute une latence (~10%). Testez avant d'activer en production.
7 - Configuration réseau avancée
Options de création
docker network create --driver overlay \
--subnet 10.20.0.0/16 \
--ip-range 10.20.10.0/24 \
--gateway 10.20.0.1 \
--opt com.docker.network.driver.mtu=1450 \
--opt encrypted \
my-network
Attacher des conteneurs standalone
# Créer un réseau attachable
docker network create --driver overlay --attachable debug-net
# Attacher un conteneur standalone
docker run -it --network debug-net alpine sh
Alias réseau
# Créer un service avec alias
docker service create --name db \
--network my-overlay \
--network-alias database \
--network-alias postgres \
postgres:15
# Les autres services peuvent utiliser :
# - db
# - database
# - postgres
8 - Dépannage réseau
Outils de diagnostic
# Conteneur de debug
docker run -it --network my-overlay nicolaka/netshoot
# Dans le conteneur
ping service-name
nslookup service-name
curl http://service-name:port
traceroute service-name
Vérifier la connectivité
# Tester depuis un service
docker service create --name debug \
--network my-overlay \
--mode global \
nicolaka/netshoot sleep infinity
# Exécuter des commandes
docker exec -it $(docker ps -q -f name=debug) ping api
Problèmes courants
| Problème | Cause probable | Solution |
|---|---|---|
| Timeout réseau | Ports firewall fermés | Ouvrir 4789/udp, 7946 |
| DNS ne résout pas | Services sur différents réseaux | Connecter au même overlay |
| Pas de connectivité | MTU incorrect | Vérifier MTU (1450 pour VXLAN) |
Vérifier les réseaux
# Inspecter un réseau
docker network inspect my-overlay
# Voir les conteneurs connectés
docker network inspect my-overlay --format '{{range .Containers}}{{.Name}} {{end}}'
# Voir les services sur un réseau
docker network inspect my-overlay --format '{{json .Services}}'
9 - Load Balancing externe
Avec un reverse proxy
# Traefik comme load balancer
version: "3.9"
services:
traefik:
image: traefik:v2.10
command:
- "--providers.docker.swarmMode=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik-public
deploy:
placement:
constraints:
- node.role == manager
web:
image: nginx
networks:
- traefik-public
deploy:
replicas: 3
labels:
- "traefik.enable=true"
- "traefik.http.routers.web.rule=Host(`example.com`)"
networks:
traefik-public:
driver: overlay
Résumé
| Concept | Description |
|---|---|
| Overlay | Réseau multi-nœuds (VXLAN) |
| Ingress | Routing mesh pour les ports publiés |
| VIP | IP virtuelle pour load balancing |
| DNSRR | DNS Round Robin |
| Encrypted | Trafic chiffré (IPsec) |
Points clés
- Les réseaux overlay permettent la communication inter-nœuds
- Le routing mesh distribue le trafic automatiquement
- Utilisez des réseaux séparés pour l'isolation
- Activez le chiffrement pour les données sensibles
Exercices pratiques
- Créez un réseau overlay et déployez deux services qui communiquent
- Testez le routing mesh en accédant à un service depuis différents nœuds
- Configurez un réseau interne pour une base de données
- Debuggez la connectivité avec netshoot