# Docker Swarm

## 🐳 Introduction

Docker Swarm est une fonctionnalité d'orchestration de Docker qui permet de transformer un groupe de machines (ou nœuds) en un **cluster Docker Swarm**. Ce cluster est utilisé pour déployer, gérer et surveiller des conteneurs Docker de manière centralisée.

### 🚀 **Pourquoi utiliser Docker Swarm ?**

Docker Swarm offre plusieurs avantages :

1. **Gestion centralisée** :
   * Vous pouvez gérer plusieurs machines Docker (appelées nœuds) comme un seul cluster.
   * Les tâches, comme le déploiement ou la mise à jour des services, se font à partir d'un nœud manager.
2. **Équilibrage de charge intégré** :
   * Le trafic est automatiquement réparti entre les réplicas d’un service.
3. **Haute disponibilité (HA)** :
   * En cas de panne d'un nœud worker, Docker Swarm redistribue automatiquement les conteneurs vers d'autres nœuds disponibles.
4. **Scalabilité facile** :
   * Vous pouvez facilement augmenter ou diminuer le nombre d'instances d’un service (réplicas).
5. **Compatibilité Docker native** :
   * Docker Swarm est directement intégré à Docker, sans besoin de logiciels tiers.

***

## 🏗️ **Mise en place d’un cluster Docker Swarm avec VMware**

### 🌟 **Pré-requis**

Avant de commencer :

1. **Logiciels nécessaires** :
   * **VMware Workstation/Fusion** : Pour créer des machines virtuelles.
   * **Docker** : Pour exécuter des conteneurs (à installer dans chaque VM).
   * **Docker Machine** : Pour automatiser la création et la gestion des machines Docker.
2. **Machines à créer** :
   * Nous allons créer 3 machines Docker :
     * **node1** : servira de **manager**.
     * **node2** et **node3** : serviront de **workers**.
3. **Réseau** :
   * Configurez un réseau NAT ou Bridge dans VMware (voir plus bas).

***

### 🔨 Création des machines avec Docker Machine et VMware

#### 🖥️ **Création des machines Docker**

Nous allons utiliser `docker-machine` pour créer les machines :

```bash
docker-machine create --driver vmware node1
docker-machine create --driver vmware node2
docker-machine create --driver vmware node3
```

📝 **Remarque** : Les machines seront créées dans le dossier par défaut de `docker-machine`, généralement :\
`C:\Users\%USERNAME%\.docker\machine\machines`.

***

### 🧹 **Ajout des machines dans VMware**

Après leur création, les machines peuvent ne pas apparaître automatiquement dans VMware. Pour les ajouter manuellement :

{% stepper %}
{% step %}
Cliquez avec le **bouton droit** dans la barre latérale de VMware.
{% endstep %}

{% step %}
Sélectionnez **"Scan for Virtual Machines"**.
{% endstep %}

{% step %}
Naviguez vers le répertoire des machines :

`C:\Users\%USERNAME%\.docker\machine\machines`
{% endstep %}

{% step %}
Ajoutez les fichiers `.vmx` pour chaque machine.
{% endstep %}
{% endstepper %}

<figure><img src="https://3132389590-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTgr1ZiAmgAVmZcVjYedk%2Fuploads%2F4D8NmHRuIZLBdOskP3NY%2Fimage.png?alt=media&#x26;token=03b8a43e-36e4-4a4c-84ca-fc5be59a916c" alt="" width="477"><figcaption></figcaption></figure>

***

### 📡 **Initialisation du cluster Docker Swarm**

#### 🖥️ **Connexion au nœud manager**

Le cluster Docker Swarm est initialisé depuis le **nœud manager**. Connectez-vous à `node1` :

```bash
docker-machine ssh node1
```

#### 🚀 **Initialisation du Swarm**

Sur `node1`, exécutez la commande suivante pour initialiser le Swarm. L’adresse utilisée doit être celle de `node1` sur le réseau (vous pouvez la vérifier avec `docker-machine ip node1`) :

```bash
docker swarm init --advertise-addr 192.168.253.145
```

* **Explication** :
  * `--advertise-addr` : Spécifie l’adresse IP utilisée pour communiquer avec les autres nœuds.

Résultat attendu :

```
Swarm initialized: current node (cu3vdhdtysaqzjuf20twcfhlv) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-58j0mfkvy70snrne6o5rqp6eldfxfijw4tpxljn2f01o4iy043-3sw50hj1qo06mjjuuw7g8pg8l 192.168.253.145:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
```

***

### ➕ Ajout des nœuds workers

#### 🔗 **Récupération du token**

Le Swarm génère un **token** permettant aux autres nœuds de rejoindre le cluster. Pour l’obtenir, exécutez sur `node1` :

```bash
docker swarm join-token worker
```

Cette commande affiche une autre commande à exécuter sur les workers (`node2` et `node3`).

#### 🤝 **Connexion des workers**

Sur chaque worker, connectez-vous et exécutez la commande donnée par `docker swarm join-token` :

Sur `node2` :

```bash
docker-machine ssh node2
docker swarm join --token SWMTKN-1-58j0mfkvy70snrne6o5rqp6eldfxfijw4tpxljn2f01o4iy043-3sw50hj1qo06mjjuuw7g8pg8l 192.168.253.145:2377
```

Sur `node3` :&#x20;

```bash
docker-machine ssh node3
docker swarm join --token SWMTKN-1-58j0mfkvy70snrne6o5rqp6eldfxfijw4tpxljn2f01o4iy043-3sw50hj1qo06mjjuuw7g8pg8l 192.168.253.145:2377
```

***

### ✅ Vérification du cluster

Revenez sur `node1` et exécutez la commande suivante pour vérifier l'état des nœuds du cluster :

```bash
docker node ls
```

Sortie attendue :

```
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
cu3vdhdtysaqzjuf20twcfhlv *   node1               Ready               Active              Leader              19.03.12
n4fux01ao9djab0lfdvb1iayr     node2               Ready               Active                                  19.03.12
s8p2sapjudxn2vez70llgdjwj     node3               Ready               Active                                  19.03.12
```

***

### 🛠️ Déploiement et gestion des services

#### 🌐 Déploiement d’un service Nginx

Pour déployer un service `Nginx` avec 2 réplicas, exécutez sur `node1` :

```bash
docker service create --name mon-nginx --replicas 2 -p 80:80 nginx
```

***

#### 📊 **Visualisation avec Docker Visualizer**

Pour surveiller le cluster visuellement, déployez Docker Visualizer :

```bash
docker service create \
  --name visualizer \
  --publish 8080:8080 \
  --constraint=node.role==manager \
  --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
  dockersamples/visualizer
```

<figure><img src="https://3132389590-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTgr1ZiAmgAVmZcVjYedk%2Fuploads%2FhTA53F5Xh2ONaamDNdTV%2Fimage.png?alt=media&#x26;token=d53f56d9-409d-4626-915b-6bace7b860d0" alt="" width="563"><figcaption><p><a href="http://192.168.253.145:8080/">http://192.168.253.145:8080/</a></p></figcaption></figure>

***

### 📈 **Mise à l’échelle des services**

Pour augmenter les réplicas de `mon-nginx` à 3, exécutez :

```bash
docker service scale mon-nginx=3
```

***

### 🔒 **Haute disponibilité (HA)**

Si un nœud worker tombe en panne, Docker redistribuera automatiquement les conteneurs vers d’autres nœuds. Testez cette fonctionnalité en arrêtant `node2` :&#x20;

```bash
docker-machine stop node2
```

Vérifiez que les conteneurs sont redistribués sur d'autres nœuds :

```bash
docker service ps mon-nginx
```

***

### 🗑️ **Suppression des services**

Pour supprimer un service, utilisez :

```bash
docker service rm mon-nginx
docker service rm visualizer
```

***

### 🛠️ **Supprimer un nœud du cluster Docker Swarm**

#### 🔗 **Retirer un worker ou un manager du cluster**

Sur le nœud à supprimer (par exemple, `node2` ou `node3`), exécutez :

```bash
docker-machine swarm leave
```

* **Pour forcer la suppression** (utile si le nœud est déconnecté ou inaccessible) :

  ```bash
  docker-machine swarm leave --force
  ```

***

### 🖥️ **Supprimer un nœud du cluster depuis le manager**

```bash
docker-machine rm node1 -y
docker-machine rm node2 -y
docker-machine rm node3 -y
```

Pour lister les nœuds et obtenir leur ID :

```bash
docker-machine ls
```
