Swarm : réseau et secrets
Swarm apporte deux fonctionnalités réseau et sécurité absentes de Docker standalone : les overlay networks pour la communication inter-nœuds chiffrée, et les secrets natifs pour distribuer des données sensibles aux services sans les exposer dans les variables d'environnement ou les images.
Overlay networks
Un réseau overlay crée un réseau virtuel qui s'étend sur tous les nœuds du cluster. Les containers sur différents nœuds communiquent comme s'ils étaient sur le même hôte.
# Créer un overlay network
docker network create --driver overlay --attachable \ # permet aux containers standalone de se connecter
--opt encrypted \ # chiffre le trafic inter-nœuds (VXLAN + IPsec)
app-net
# Créer un réseau overlay interne (pas d'accès Internet)
docker network create --driver overlay --internal db-net# Dans un compose.yml Swarm
networks:
app-net:
driver: overlay
driver_opts:
encrypted: "true"
db-net:
driver: overlay
internal: trueIngress et routing mesh
Swarm publie automatiquement les ports via son routing mesh : une requête sur le port 80 de n'importe quel nœud du cluster est routée vers un replica disponible, quel que soit le nœud où il tourne.
# Publier un port en mode ingress (routing mesh, défaut)
docker service create --publish published=80,target=80,mode=ingress nginx:alpine
# Publier un port en mode host (direct, sans routing mesh)
docker service create --publish published=80,target=80,mode=host --mode global \ # nécessaire avec mode=host
nginx:alpineSecrets Swarm
Les secrets Swarm sont chiffrés au repos dans la base Raft et distribués uniquement aux services qui en ont besoin, montés en tmpfs dans /run/secrets/. Jamais en variable d'environnement, jamais dans les logs.
# Créer un secret depuis stdin
echo "MotDePasseDB_Tr3sSecret" | docker secret create db_password -
# Depuis un fichier
docker secret create ssl_cert ./certs/server.crt
# Lister les secrets
docker secret ls# Attacher un secret à un service
docker service create --secret db_password --secret source=ssl_cert,target=/certs/server.crt,uid=1000,mode=0400 myapp:latest# Dans compose.yml Swarm
services:
api:
secrets:
- db_password
- source: ssl_cert
target: /certs/server.crt
mode: 0400
secrets:
db_password:
external: true # secret créé via docker secret create
ssl_cert:
file: ./certs/server.crt # créé au deploy# Dans l'application : lire le secret depuis le fichier
with open('/run/secrets/db_password') as f:
db_password = f.read().strip()Configs Swarm
# Distribuer des fichiers de config non-sensibles aux services
docker config create nginx_conf ./nginx.conf
docker service create --config source=nginx_conf,target=/etc/nginx/nginx.conf nginx:alpine