Déploiement et Orchestration avec Docker Swarm

Déploiement avec Docker Machine et Docker Swarm

🚀 Créer et Configurer les Machines Virtuelles

🛠️ Créer les Machines Virtuelles

docker-machine create --driver vmware host1
docker-machine create --driver vmware host2
docker-machine create --driver vmware host3

Chaque commande configure une machine virtuelle minimale avec Docker préinstallé.

🔍 Vérifier la Création

Listez les machines pour vérifier leur état :

docker-machine ls

Exemple de sortie :

NAME    ACTIVE   DRIVER   STATE     URL                          SWARM   DOCKER      ERRORS
host1   *        vmware   Running   tcp://192.168.253.150:2376           v19.03.12
host2   -        vmware   Running   tcp://192.168.253.151:2376           v19.03.12
host3   -        vmware   Running   tcp://192.168.253.152:2376           v19.03.12

🐳 Initialiser Docker Swarm

🔄 Réinitialiser l’Environnement Docker Local

Avant d’initialiser Docker Swarm, configurez votre environnement Docker pour pointer vers host1, car c'est cette machine qui sera utilisée comme manager.

1

Configurer l'environnement Docker pour host1 :

eval $(docker-machine env host1)
2

Trouver l’adresse IP de host1 :

Obtenez l’adresse IP de host1 avec la commande suivante :

docker-machine ip host1

Exemple de sortie :

192.168.253.150

Utilisez cette adresse IP pour l’initialisation du cluster.

🐳 Initialiser le Cluster Swarm

Initialisez le cluster Swarm sur host1 en utilisant son adresse IP :

docker swarm init --advertise-addr 192.168.253.150

Exemple de sortie :

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

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

    docker swarm join --token SWMTKN-1-466ggg4bq26m5xc1rpt67fjff0qs2vi00varfhfb5ke3s0p5xw-1dcbwk9n2lhks45joxwappju3 192.168.253.150:2377

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

Notez le token, vous en aurez besoin pour ajouter des nœuds.


🔗 Ajouter des Machines au Cluster

🖥️ Ajouter host2 comme Nœud

1

Configurer l'environnement Docker pour host2 :

eval $(docker-machine env host2)
2

Ajouter host2 comme nœud au cluster :

Utilisez le token généré lors de l'initialisation du cluster :

docker swarm join --token SWMTKN-1-466ggg4bq26m5xc1rpt67fjff0qs2vi00varfhfb5ke3s0p5xw-1dcbwk9n2lhks45joxwappju3 192.168.253.150:2377
3

Vérifier l'ajout :

Revenez sur host1 (le manager) pour vérifier :

eval $(docker-machine env host1)
docker node ls

Exemple de sortie :

ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
q8rpf08cgvuteweoywuvanf40 *   host1      Ready     Active         Leader           19.03.12
2bmiiswoenlqj4sn3vbbp0caa     host2      Ready     Active                          19.03.12

🌟 Ajouter host3 comme Manager

1

Générer un token pour ajouter un manager :

Sur host1, exécutez :

eval $(docker-machine env host1)
docker swarm join-token manager

Exemple de sortie :

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

    docker swarm join --token SWMTKN-1-466ggg4bq26m5xc1rpt67fjff0qs2vi00varfhfb5ke3s0p5xw-3yicuu5zr4ycx2mt0addhfoq6 192.168.253.150:2377
2

Configurer l'environnement Docker pour host3 :

eval $(docker-machine env host3) 
3

Ajouter host3 comme manager :

docker swarm join --token SWMTKN-1-466ggg4bq26m5xc1rpt67fjff0qs2vi00varfhfb5ke3s0p5xw-3yicuu5zr4ycx2mt0addhfoq6 192.168.253.150:2377
4

Vérifier l'ajout :

Revenez sur host1 et exécutez :

eval $(docker-machine env host1)
docker node ls

Exemple de sortie :

ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
q8rpf08cgvuteweoywuvanf40 *   host1      Ready     Active         Leader           19.03.12
2bmiiswoenlqj4sn3vbbp0caa     host2      Ready     Active                          19.03.12
3jiespj24sq06wuspfksvfttv     host3      Ready     Active         Reachable        19.03.12

💼 Promouvoir un Nœud du Cluster

1

Promouvoir host2 en Manager :

Depuis un manager, exécutez :

docker node promote host2
2

Vérifiez la promotion :

docker node ls

Exemple de sortie :

ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
q8rpf08cgvuteweoywuvanf40 *   host1      Ready     Active         Leader           19.03.12
2bmiiswoenlqj4sn3vbbp0caa     host2      Ready     Active         Reachable        19.03.12
3jiespj24sq06wuspfksvfttv     host3      Ready     Active         Reachable        19.03.12

🎯 Exécuter un Service dans le Cluster

🚀 Créer un service avec docker service create

Pour lancer un service à partir de l'image alpine qui effectue un ping :

docker service create --name ping-test alpine ping 8.8.8.8

Exemple de sortie :

rn8iua29i44zwjl45v8dx6g2e
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service rn8iua29i44zwjl45v8dx6g2e converged

Le code affiché est l'identifiant unique du service (dans cet exemple, rn8iua29i44zwjl45v8dx6g2e).

🔍 Vérifier où le conteneur est déployé

Utilisez la commande suivante pour afficher les informations sur le service :

docker service ps ping-test

Exemple de sortie :

ID             NAME          IMAGE           NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
pp8w9g4924ub   ping-test.1   alpine:latest   host1     Running         Running 18 seconds ago

Cela montre que le service ping-test est déployé sur le nœud host1.

📜 Afficher les logs du conteneur

1

Connectez-vous au nœud exécutant le conteneur :

eval $(docker-machine env host1)
2

Identifiez l'ID du conteneur :

docker ps

Exemple de sortie :

CONTAINER ID   IMAGE           COMMAND          CREATED          STATUS          PORTS     NAMES
8e61f093a2fe   alpine:latest   "ping 8.8.8.8"   29 seconds ago   Up 28 seconds             ping-test.1.pp8w9g4924ubi8w2xg93ob47z
3

Affichez les logs :

docker logs 8e61f093a2fe   

Cela montre les pings exécutés par le conteneur.


🚀 Passer à l’échelle un service du cluster

Pour augmenter le nombre d'instances de votre service ping-test, utilisez la commande suivante :

docker service update --replicas 6 ping-test

🔍 Vérifiez les réplicas

Utilisez la commande suivante pour vérifier que les réplicas sont bien déployés :

docker service ps ping-test

Exemple de sortie :

ID             NAME          IMAGE           NODE      DESIRED STATE   CURRENT STATE                ERROR     PORTS
pp8w9g4924ub   ping-test.1   alpine:latest   host1     Running         Running about a minute ago
r9cb57ufv08p   ping-test.2   alpine:latest   host3     Running         Running 19 seconds ago
yu4bpsttz6rk   ping-test.3   alpine:latest   host3     Running         Running 19 seconds ago
mp2xhwvqznem   ping-test.4   alpine:latest   host1     Running         Running 23 seconds ago
uyendopsd6gz   ping-test.5   alpine:latest   host2     Running         Running 20 seconds ago
zio6mrj1fuu1   ping-test.6   alpine:latest   host2     Running         Running 20 seconds ago

📊 Passer à l’Échelle un Service avec 3 Copies par Hôte

🔄 Augmenter le Nombre de Réplicas pour Correspondre à 3 Copies par Hôte

Si vous avez trois nœuds dans votre cluster (par exemple : host1, host2, et host3), pour obtenir trois copies par hôte, vous devez ajuster le nombre total de réplicas en fonction du nombre de nœuds. Dans ce cas, cela signifie : 3 réplicas x 3 nœuds = 9 réplicas au total.

1

Mettre à l’échelle le service ping-test à 9 réplicas :

docker service update --replicas 9 ping-test
2

Vérifier que les réplicas sont bien répartis sur les trois nœuds :

docker service ps ping-test

Exemple de sortie attendue :

ID             NAME          IMAGE           NODE      DESIRED STATE   CURRENT STATE                ERROR     PORTS
pp8w9g4924ub   ping-test.1   alpine:latest   host1     Running         Running about a minute ago
r9cb57ufv08p   ping-test.2   alpine:latest   host3     Running         Running 37 seconds ago
yu4bpsttz6rk   ping-test.3   alpine:latest   host3     Running         Running 37 seconds ago
mp2xhwvqznem   ping-test.4   alpine:latest   host1     Running         Running 41 seconds ago
uyendopsd6gz   ping-test.5   alpine:latest   host2     Running         Running 37 seconds ago
zio6mrj1fuu1   ping-test.6   alpine:latest   host2     Running         Running 37 seconds ago
x3hp2nsvpwi8   ping-test.7   alpine:latest   host2     Running         Running 8 seconds ago
xh1uu8zph5e6   ping-test.8   alpine:latest   host3     Running         Running 8 seconds ago
att3bp7i5rhq   ping-test.9   alpine:latest   host1     Running         Running 8 seconds ago
3

Vérifier l'équilibrage des réplicas : Chaque nœud (host1, host2, host3) doit exécuter exactement 3 copies du service ping-test.


🌐 Exposer un Service

🔑 Concepts Clés : Pourquoi exposer un service ?

  • Portabilité des services : Docker Swarm permet de rendre un service accessible via un port public sur tous les nœuds du cluster.

  • Équilibrage de charge : Les requêtes entrantes sont automatiquement réparties sur toutes les instances du service, quelle que soit leur localisation dans le cluster.

  • Accessibilité uniforme : Le service reste accessible via n'importe quel nœud, sans que le client sache exactement où se trouvent les conteneurs.

⚙️ Déploiement d'un Service Elasticsearch

🚀 Créer le Service Elasticsearch

Elasticsearch est un moteur de recherche basé sur Lucene, utilisé pour indexer et rechercher des données. Il fournit une API REST simple pour interagir avec les données.

1

Créer un service nommé search avec 4 réplicas :

docker service create --name search --publish 9200:9200 --replicas 4 elasticsearch:8.16.1
  • --name search : Nomme le service.

  • --publish 9200:9200 : Expose le port interne 9200 sur le port public 9200 de chaque nœud.

  • --replicas 4 : Crée 4 instances du service Elasticsearch.

  • elasticsearch:8.16.1 : Utilise l’image officielle Elasticsearch version 8.16.1.

⚠️ Remarque :

  • Elasticsearch nécessite au moins 2 Go de mémoire pour fonctionner correctement. Assurez-vous que vos nœuds ont suffisamment de ressources.

  • Vous pourriez rencontrer des erreurs de configuration liées à la mémoire ou à l’environnement réseau d’Elasticsearch.

🔍 Vérifier le Déploiement du Service

1

Lister les services actifs :

docker service ls

Exemple de sortie :

ID             NAME        MODE         REPLICAS   IMAGE                  PORTS
rn8iua29i44z   ping-test   replicated   9/9        alpine:latest
20e84tp1864t   search      replicated   4/4        elasticsearch:8.16.1   *:9200->9200/tcp
  • MODE : replicated indique que le service est répliqué.

  • REPLICAS : Montre combien d'instances fonctionnent (par exemple, 0/4 signifie qu'aucune instance n’est encore prête).

  • PORTS : Indique que le port 9200 est exposé sur tous les nœuds.

2

Observer le statut des réplicas :

docker service ps search

Exemple de sortie :

ID             NAME           IMAGE                  NODE      DESIRED STATE   CURRENT STATE               ERROR                         PORTS
r0o7w1lvjey6   search.1       elasticsearch:8.16.1   host2     Ready           Ready 3 seconds ago
ym8ic47gy7iz    \_ search.1   elasticsearch:8.16.1   host1     Shutdown        Failed 4 seconds ago        "task: non-zero exit (1)"
mtnmn133g32x    \_ search.1   elasticsearch:8.16.1   host2     Shutdown        Failed 14 seconds ago       "task: non-zero exit (1)"
6nzwj27jg1vw    \_ search.1   elasticsearch:8.16.1   host1     Shutdown        Failed 25 seconds ago       "task: non-zero exit (137)"
cafgjacgy6k7    \_ search.1   elasticsearch:8.16.1   host3     Shutdown        Failed 37 seconds ago       "task: non-zero exit (1)"
9dcyl8n6wcoi   search.2       elasticsearch:8.16.1   host1     Running         Running 32 seconds ago
i6uhlj0yrfzk    \_ search.2   elasticsearch:8.16.1   host3     Shutdown        Failed 37 seconds ago       "task: non-zero exit (1)"
4mfw65clvy6l    \_ search.2   elasticsearch:8.16.1   host3     Shutdown        Failed 51 seconds ago       "task: non-zero exit (1)"
6hoa41ymupxa    \_ search.2   elasticsearch:8.16.1   host3     Shutdown        Failed about a minute ago   "task: non-zero exit (1)"
t4rxmdnhsuyg    \_ search.2   elasticsearch:8.16.1   host3     Shutdown        Failed about a minute ago   "task: non-zero exit (78)"
yasdn54lhut3   search.3       elasticsearch:8.16.1   host2     Running         Running 32 seconds ago
w1htw2zqug5f    \_ search.3   elasticsearch:8.16.1   host3     Shutdown        Failed 37 seconds ago       "task: non-zero exit (1)"
marhmnqy86zw    \_ search.3   elasticsearch:8.16.1   host2     Shutdown        Failed 51 seconds ago       "task: non-zero exit (78)"
dfre186br02n    \_ search.3   elasticsearch:8.16.1   host1     Shutdown        Failed about a minute ago   "task: non-zero exit (1)"
u9jeac054i6n    \_ search.3   elasticsearch:8.16.1   host1     Shutdown        Failed about a minute ago   "task: non-zero exit (1)"
o1oikcrr7nof   search.4       elasticsearch:8.16.1   host3     Ready           Ready 2 seconds ago
ccs24ntu28ll    \_ search.4   elasticsearch:8.16.1   host2     Shutdown        Failed 2 seconds ago        "task: non-zero exit (1)"
sfvxaommjvm5    \_ search.4   elasticsearch:8.16.1   host1     Shutdown        Failed 13 seconds ago       "task: non-zero exit (1)"
pd0m63npm80o    \_ search.4   elasticsearch:8.16.1   host2     Shutdown        Failed 23 seconds ago       "task: non-zero exit (1)"
xrsk5ss6cz3c    \_ search.4   elasticsearch:8.16.1   host3     Shutdown        Failed 35 seconds ago       "task: non-zero exit (78)"

🗑️ Supprimer un Service

Une fois les tests terminés, vous pouvez supprimer les services déployés sur votre cluster, comme ping et search.

🛠️ Supprimer les services actifs

Utilisez la commande suivante pour supprimer tous les services en cours d'exécution :

docker service rm $(docker service ls -q)
  • docker service ls -q : Liste uniquement les identifiants (ID) des services actifs.

  • docker service rm : Supprime les services spécifiés.

🔍 Vérification de la suppression

Pour confirmer que tous les services ont été supprimés, exécutez :

docker service ls

Exemple de sortie attendue (vide) :

ID      NAME      MODE      REPLICAS      IMAGE      PORTS

Aucun service n'apparaît dans la liste, indiquant qu'ils ont bien été supprimés.


🔧 Astuces pour Dépannage

⚠️ Erreur lors de l’ajout d’un nœud Si un nœud ne parvient pas à rejoindre le cluster, voici les actions à entreprendre :

  • Vérifiez que la machine virtuelle est active dans VMware :

    docker-machine ls
  • Assurez-vous que le démon Docker est actif sur la machine :

    docker-machine ssh <nom_nœud> "systemctl status docker"
  • Vérifiez la connectivité réseau entre le manager et le nœud :

    ping <IP_Nœud>
    Test-NetConnection -ComputerName <IP_Nœud> -Port 2377

🌐 Problème d’adresse IP incorrecte

Si l'adresse IP spécifiée dans --advertise-addr est incorrecte, corrigez-la :

1

Obtenez l’adresse IP correcte :

docker-machine ip host1
2

Assurez-vous que cette IP est accessible depuis les autres nœuds :

ping <IP_Manager>

🔄 Réinitialisation du Cluster Swarm

Si le cluster ne fonctionne plus correctement, réinitialisez-le proprement :

1

Quittez le cluster sur les nœuds défectueux :

docker swarm leave --force
2

Réinitialisez le cluster sur le manager :

docker swarm init --advertise-addr <IP_Manager>

🛑 Problèmes de ressources (Mémoire/CPU)

Si certains services échouent (ex. : non-zero exit (1) ou 137) :

1

Augmentez les ressources des machines virtuelles dans VMware.

2

Identifiez les problèmes spécifiques via les logs :

docker logs <container_id>
docker service ps <nom_service>

📝 Résumé des Commandes

Commande

Description

docker-machine create

Crée une nouvelle machine virtuelle.

docker-machine ls

Liste toutes les machines Docker.

docker-machine ip <nom_machine>

Affiche l’adresse IP d’une machine.

docker swarm init

Initialise un cluster Docker Swarm.

docker swarm join

Ajoute un nœud au cluster Swarm.

docker swarm join-token manager

Génère un token pour ajouter un manager.

docker node ls

Liste les nœuds du cluster.

docker node promote <nom_nœud>

Promeut un nœud en manager.

docker node demote <nom_nœud>

Rétrograde un manager en nœud worker.

docker service create

Crée un service dans le cluster.

docker service ls

Liste tous les services actifs.

docker service ps <nom_service>

Affiche les tâches associées à un service.

docker service update

Met à jour un service existant (scaling, etc).

docker service rm <nom_service>

Supprime un service du cluster.

docker logs <id_conteneur>

Affiche les logs d’un conteneur.


🎯 Conclusion

Cette documentation vous a guidé à travers toutes les étapes nécessaires pour déployer et gérer un cluster Docker Swarm. En créant plusieurs machines virtuelles avec docker-machine, vous avez appris à configurer un environnement Swarm robuste avec un manager et des nœuds workers. L’initiation du cluster avec docker swarm init et l’ajout de nœuds via docker swarm join vous ont permis de bâtir une infrastructure distribuée efficace.

L’exécution des services à l’aide de docker service create et leur mise à l’échelle dynamique avec docker service update --replicas démontrent la puissance de Swarm pour l’orchestration de conteneurs. Grâce au réseau overlay, les services comme Dockercoins peuvent communiquer de manière transparente sur l’ensemble du cluster. L’intégration du Global Scheduling a mis en lumière la capacité de Swarm à exécuter des services uniformément sur tous les nœuds, tandis que les Rolling Updates ont illustré la mise à jour progressive des services sans interruption.

L’application Dockercoins a servi d’exemple concret pour orchestrer plusieurs services interdépendants et suivre leurs performances en temps réel via une interface Web. En cas de problèmes, les astuces de dépannage vous ont fourni les outils pour résoudre des erreurs courantes, telles que les défaillances réseau, les adresses IP incorrectes et les limites de ressources.

Last updated