Skip to main content

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

NetworkTypeUse
ingressOverlayRouting mesh for published ports
docker_gwbridgeBridgeExternal 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
ModeDescriptionUse case
ingressRouting mesh (internal LB)Standard web applications
hostDirect on the nodePerformance, 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
ModeDescriptionUse case
vipSingle virtual IPStandard applications
dnsrrDNS Round RobinExternal 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

SituationEncryption
Trusted network (private datacenter)Optional
Multi-cloudRecommended
Sensitive dataMandatory
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

ProblemProbable causeSolution
Network timeoutFirewall ports closedOpen 4789/udp, 7946
DNS does not resolveServices on different networksConnect to the same overlay
No connectivityIncorrect MTUCheck 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

ConceptDescription
OverlayMulti-node network (VXLAN)
IngressRouting mesh for published ports
VIPVirtual IP for load balancing
DNSRRDNS Round Robin
EncryptedEncrypted 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

  1. Create an overlay network and deploy two services that communicate
  2. Test the routing mesh by accessing a service from different nodes
  3. Configure an internal network for a database
  4. Debug connectivity with netshoot

← Services and Tasks | Stacks and deployment →