# Docker Swarm

### Introduction

**Docker Swarm** est une surcouche native de Docker pour **orchestrer** un cluster de machines exécutant des conteneurs Docker.

Contrairement à une **exécution locale** de conteneurs, Swarm permet de déployer des conteneurs avec quelques avantages :

- Distribution automatique
- Haute disponibilité
- Scaling automatique
- Redondances
- Etc.

<p class="callout info">Docker Swarm transforme un ensemble de nœuds Docker en un **cluster** unique.</p>

[![logo-docker-swarm-300x296.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-09/scaled-1680-/JEMVeuGr4YlYItuM-logo-docker-swarm-300x296.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-09/JEMVeuGr4YlYItuM-logo-docker-swarm-300x296.png)

Chaque nœud peut être un **manager** (coordonne le cluster) ou un **worker** (exécute les tâches).  
Les services sont définis avec des règles de réplication, de placement et de mise à jour.

### Exemple

- Nous partons d'une application web hébergée sur **Nginx** avec une exigence de **haute disponibilité** et de **répartition de charge**.
- Nous disposons de plusieurs **instances Docker** (machines hôtes) et nous souhaitons que l'application soit toujours accessible, même si une machine tombe en panne.

```bash
# Sur la machine principale (noeud principal)
docker swarm init

# Sur chaque noeud
docker swarm join IP_NOEUD_PRINCIPAL:2377

# Création du service avec 3 instances
docker service create --name web --replicas 3 -p 80:80 nginx

# Vérifier le déploiement
docker service ls
docker service ps web
```

<p class="callout info">Le service Nginx est maintenant réparti sur plusieurs nœuds, avec équilibrage de charge.</p>

### Différence avec Docker Compose

**Docker Compose** est principalement utilisé pour le développement local ou le déploiement d'application sur une machine unique.  
L'ensemble des services, réseaux et volumes nécessaires sont détaillés dans le fichier `docker-compose.yml`.

**Docker Swarm** est conçu pour le déploiement en production sur plusieurs machines.  
Il offre des fonctionnalités d'orchestration qui ne sont pas disponibles avec **Docker Compose**.

<table border="1" id="bkmrk-fonctionnalit%C3%A9-docke" style="border-collapse: collapse; width: 100%; height: 204.656px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr style="height: 34.1094px;"><td style="height: 34.1094px;">**Fonctionnalité**</td><td style="height: 34.1094px;">**Docker Compose**</td><td style="height: 34.1094px;">**Docker Swarm**</td></tr></thead><tbody><tr style="height: 34.1094px;"><td style="height: 34.1094px;">**Scope**</td><td style="height: 34.1094px;">Machine locale</td><td style="height: 34.1094px;">Cluster</td></tr><tr style="height: 34.1094px;"><td style="height: 34.1094px;">**Orchestration**</td><td style="height: 34.1094px;">Basique</td><td style="height: 34.1094px;">Avancée</td></tr><tr style="height: 34.1094px;"><td style="height: 34.1094px;">**Scaling**</td><td style="height: 34.1094px;">Non</td><td style="height: 34.1094px;">Oui</td></tr><tr style="height: 34.1094px;"><td style="height: 34.1094px;">**Haute dispo**</td><td style="height: 34.1094px;">Non</td><td style="height: 34.1094px;">Oui</td></tr><tr style="height: 34.1094px;"><td style="height: 34.1094px;">**Load balancing**</td><td style="height: 34.1094px;">Non</td><td style="height: 34.1094px;">Oui</td></tr></tbody></table>

### Docker Secret

**Docker Swarm** propose une fonctionnalité **Docker Secrets** pour stocker et distribuer les données sensibles de manière sécurisée aux services qui en ont besoin.

**Exemple :**

```bash
# Création d'un secret
printf "my super secret password" | docker secret create my_secret -

# Utilisation avec un service
docker service create --name app --secret my_secret alpine:latest sh -c "cat /run/secrets/my_secret"

```

Dans cet exemple, le conteneur `alpine` accède au mot de passe via le fichier `/run/secrets/my_secret`.

Ce fichier est monté automatiquement par **Swarm** et n’est pas visible en dehors du conteneur.

<p class="callout warning">La fonctionnalité Docker Secret n'est disponible qu'avec Docker Swarm.  
Les volumes sont le meilleur moyen de gérer des informations sensible en dehors d'un cluster Docker Swarm.</p>