Swarm networks
Chapter objectives
- Understand overlay networks
- Configure the routing mesh
- Create custom networks
- Isolate applications
1 - Types of networks in Swarm
Overview
┌─────────────────────────────────────────────────────────────┐
│ Docker Swarm Networks │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐ │
│ │ Ingress │ │ Overlay │ │ docker_gwbridge│ │
│ │ (built-in) │ │ (user-def) │ │ (built-in) │ │
│ │ │ │ │ │ │ │
│ │ Load balancer │ │ Service-to- │ │ NAT pour les │ │
│ │ externe │ │ service comm │ │ conteneurs │ │
│ └───────────────┘ └───────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Default networks
| Network | Type | Use |
|---|---|---|
ingress | Overlay | Routing mesh for published ports |
docker_gwbridge | Bridge | External communication of containers |
# Voir les réseaux Swarm
docker network ls --filter scope=swarm
2 - Overlay network
Concept
An overlay network enables communication between containers on different physical nodes.
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 │
└────────────────────────────────────────────────┘
Create an overlay network
# 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
Use an overlay network
# 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
The routing mesh allows access to a published service from any node in the cluster, even if the container is not located there.
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 │
└─────────┘ └─────────┘ └─────────┘
Publish a 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
Host mode (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 | Use case |
|---|---|---|
ingress | Routing mesh (internal LB) | Standard web applications |
host | Direct on the node | Performance, sticky sessions |
4 - Service Discovery
Internal DNS
Swarm provides an internal DNS for service resolution:
# 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 | Use case |
|---|---|---|
vip | Single virtual IP | Standard applications |
dnsrr | DNS Round Robin | External load balancers, gRPC |
5 - Multi-service networks
Microservices architecture
# 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 - Encrypted networks
Enable encryption
# Créer un réseau chiffré
docker network create --driver overlay \
--opt encrypted \
secure-network
# Le trafic entre nœuds est chiffré via IPsec
When to use encryption
| Situation | Encryption |
|---|---|
| Trusted network (private datacenter) | Optional |
| Multi-cloud | Recommended |
| Sensitive data | Mandatory |
| Compliance (PCI-DSS, HIPAA) | Mandatory |
Performance
Encryption adds latency (~10%). Test before enabling in production.
7 - Advanced network configuration
Creation options
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
Attach standalone containers
# 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
Network aliases
# 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 - Network troubleshooting
Diagnostic tools
# 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
Check connectivity
# 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
Common problems
| Problem | Probable cause | Solution |
|---|---|---|
| Network timeout | Firewall ports closed | Open 4789/udp, 7946 |
| DNS does not resolve | Services on different networks | Connect to the same overlay |
| No connectivity | Incorrect MTU | Check MTU (1450 for VXLAN) |
Check networks
# 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 - External load balancing
With a 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
Summary
| Concept | Description |
|---|---|
| Overlay | Multi-node network (VXLAN) |
| Ingress | Routing mesh for published ports |
| VIP | Virtual IP for load balancing |
| DNSRR | DNS Round Robin |
| Encrypted | Encrypted traffic (IPsec) |
Key points
- Overlay networks enable inter-node communication
- The routing mesh distributes traffic automatically
- Use separate networks for isolation
- Enable encryption for sensitive data
Practical exercises
- Create an overlay network and deploy two services that communicate
- Test the routing mesh by accessing a service from different nodes
- Configure an internal network for a database
- Debug connectivity with netshoot