Cloud : IaaS + Docker Swarm, Config et Secret sur Swarm, stop au volumes as Config

Cloud 22 juin 2025
🎯 Objectif : DĂ©couvrez dans cette page, comment utiliser les configs services et les secrets services dans Docker Swarm Mode.

Introduction

L'anti-pattern volume as config

Pour dĂ©ployer sur l'orchestrateur Docker Swarm, il est possible d'utiliser la syntaxe compose en emportant quelques Ă©lĂ©ments supplĂ©mentaires: Compose file version 3 reference | Docker Documentation

L'anti-pattern parle ici d'utiliser les volumes comme espace de stockage embarquant un fichier de configuration. Cependant, il est fortement dĂ©conseillĂ© d'utiliser cette mĂ©thode. 

Pourquoi est-ce un anti-pattern ?

Prenons un cas d'usage simple utilisant le service Nginx nĂ©cessitant un fichier de configuration. 

Notre Swarm possĂšde 3 nƓuds, un manager et deux worker. Lors du dĂ©ploiement, le service est lancĂ© sur un nƓud alĂ©atoire et crĂ©er son volume. c'est Ă  partir d'ici, que l'on va pouvoir modifier le fichier de configuration Nginx depuis l'extĂ©rieur.

Cette solution fonctionne, cependant, si le service Nginx vient Ă  tomber, il peux ĂȘtre recrĂ©er alĂ©atoire sur une autre nƓud. Il est donc fort probable de se retrouver dans la situation suivante.

Solution

Pour solutionner cette situation, Swarm Mode a apporté une nouvelle fonctionnalité dans la structure des fichiers compose. Le champ "config".

Pour cela, reprenons le cas d'usage Nginx.

Voici notre fichier de configuration "site.conf"

server {
  listen 443 ssl;
  server_name localhost;
  ssl_certificate /run/secrets/site.crt;
  ssl_certificate_key /run/secrets/site.key;

  location / {
  root /usr/share/nginx/html;
  index index.html index.htm;
  }
}

On utilise ensuite la syntaxe compose pour déployer notre service sur le Swarm.

networks:
  public:
    driver: overlay

configs:
  nginx_config:

    file: ./site.conf
services:
  web:
    image: nginx
  networks:
    - public
  ports:
    - "80:80"
  configs:
    - source: nginx_config
      target: /etc/nginx/conf.d/site.conf

La configuration créée va ĂȘtre stocker dans le noeud manager, puis lors du lancement du service, montĂ©e dans le container.

Dans le cas ou le service tombe et qu'il est remontĂ© dans un autre nƓud, il va accĂ©der Ă  nouveau Ă  sa configuration.

Si c'est le nƓud Manager qui tombe, l'ensemble du cluster tombe.

Dans le cas ou le Swarm possÚde plusieurs Managers, la configuration est stockée sur chacun d'entre eux pour un maximum de résilience.

Nous avons omis un dĂ©tail ici cependant. Pour ĂȘtre accessible en HTTPS, Nginx Ă  besoin de deux fichier que l'on peux voir dans "site.conf", le certificat : "site.crt" et la clĂ© de chiffrement : "site.key".

 En situation rĂ©elle : utilisation des Secrets services

En situation rĂ©el, ces fichiers sont des donnĂ©es sensibles et nĂ©cessitent d'ĂȘtre traitĂ©s diffĂ©remment. Pour cela, nous allons utiliser les "Secrets configuration".

networks:
  public:
    driver: overlay

configs:
  nginx_config:
    file: ./site.conf

secrets:
  cert_secret:
    file: ./site.crt
  key_secret:
    file: ./site.key

services:
  web:
    image: nginx
  networks:
    - public
  ports:
    - "80:80"
  configs:
    - source: nginx_config
      target: /etc/nginx/conf.d/site.conf
  secrets:
    - cert_secret
    - key_secret

Ici on créer deux secrets correspondant au certificat ainsi qu'a la clés que nous indiquons ensuite dans le service comme on peux le faire avec les networks.

🔍 A savoir : par dĂ©faut, les fichiers sont montĂ©s dans le container dans "/run/secrets/<secret_name>" pour les secrets et dans "/<config_name>" pour les configs. Il est possible de spĂ©cifier l'emplacement grĂące a la balise "target".

Mots clés

Romain GEORGES

Open Source evangelist & Ruby enthousiast