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.
Configurer l'environnement Docker pour host1 :
eval $(docker-machine env host1)
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
Configurer l'environnement Docker pour host2 :
eval $(docker-machine env host2)
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
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
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
Configurer l'environnement Docker pour host3 :
eval $(docker-machine env host3)
Ajouter host3 comme manager :
docker swarm join --token SWMTKN-1-466ggg4bq26m5xc1rpt67fjff0qs2vi00varfhfb5ke3s0p5xw-3yicuu5zr4ycx2mt0addhfoq6 192.168.253.150:2377
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
Promouvoir host2 en Manager :
Depuis un manager, exécutez :
docker node promote host2
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
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
Connectez-vous au nœud exécutant le conteneur :
eval $(docker-machine env host1)
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
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.
Mettre à l’échelle le service ping-test
à 9 réplicas :
docker service update --replicas 9 ping-test
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
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.
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 interne9200
sur le port public9200
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
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 port9200
est exposé sur tous les nœuds.
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 :
Obtenez l’adresse IP correcte :
docker-machine ip host1
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 :
Quittez le cluster sur les nœuds défectueux :
docker swarm leave --force
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
) :
Augmentez les ressources des machines virtuelles dans VMware.
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