Docker Swarm pour l'orchestration des conteneurs

Publié: 2019-08-08

Tout sur Docker Swarm et comment il gère et orchestre tous les conteneurs d'un cluster.

Qu'est-ce que Docker Swarm ?

Docker Swarm est un mode de gestion d'un cluster de Docker Engines, d'où le nom Swarm. Le cluster d'hôtes Docker s'exécute en mode essaim composé de gestionnaires et de travailleurs. Les instances de docker-engine qui participent à l'essaim sont appelées nœuds.

Un déploiement d'essaim au niveau de la production se compose de nœuds Docker répartis sur plusieurs serveurs.

Pourquoi l'utiliser ? – Orchestration de conteneurs

Lorsque vous travaillez dans un environnement de production, des centaines de conteneurs Docker y exécutent plusieurs applications. La gestion de tous ces conteneurs peut être très pénible pour tous les ingénieurs DevOps ; c'est là que Docker Swarm vous aide. Il gère et orchestre facilement le cluster exécutant plusieurs conteneurs Docker.

Voici quelques-unes de ses caractéristiques :

  • Haute disponibilité - vise à n'offrir aucun temps d'arrêt ou panne.
  • Équilibrage de charge - allouer automatiquement les ressources et les demandes sur d'autres nœuds du cluster en cas de défaillance d'un nœud.
  • Décentralisé – plusieurs nœuds de gestion exécutés dans un environnement de production ; par conséquent, le cluster ne dépend jamais d'un seul nœud de gestionnaire.
  • Évolutivité - à l'aide d'une seule commande docker swarm, vous pouvez facilement augmenter ou réduire les conteneurs dans le cluster.

Orchestrer les conteneurs Docker

Maintenant que vous connaissez les bases de Docker Swarm, regardons un exemple de sa mise en œuvre.

Dans cet exemple, j'ai trois machines en cours d'exécution dans un cluster avec les détails ci-dessous :

 manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102

Pour initialiser le mode swarm dans docker, exécutez la commande ci-dessous sur le nœud du gestionnaire. Le drapeau --advertise-addr est utilisé pour s'annoncer aux nœuds qui peuvent rejoindre le cluster.

 geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104 Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

La commande ci-dessus générera un jeton qui sera utilisé par d'autres nœuds pour rejoindre ce cluster. Copiez la commande avec le jeton généré et exécutez-la sur les noeuds worker.

Exécution du jeton sur le nœud worker1.

 geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.

Exécution du jeton sur le nœud worker2.

 geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.

Maintenant, sur le nœud du gestionnaire, vous pouvez vérifier quels nœuds s'exécutent dans le cluster.

 geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6

Construisons l'image docker geekflare_mongodb que nous avons utilisée dans le didacticiel Dockerfile.

 docker build -t geekflare_mongodb .

Exécutez un conteneur de l'image Docker MongoDB en créant un service Swarm. 27017 est le numéro de port sur lequel MongoDB est exposé.

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. kok58xa4zi05psh3uy6s5x9e6 overall progress: 1 out of 1 tasks 1/1: running verify: Service converged

Vérifiez si le service docker swarm a démarré. MODE répliqué signifie que le conteneur a été répliqué sur tous les nœuds du cluster et REPLICAS 1/1 signifie qu'un seul service swarm est actuellement en cours d'exécution.

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp

Vérifions sur quel nœud du cluster ce service unique s'exécute. Il s'exécute sur le nœud manager1.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running about a minute ago

Exécutez la commande docker ps pour obtenir plus de détails sur le conteneur qui exécute ce service swarm.

 geekflare@manager1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/…" 2 minutes ago Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx

Vous pouvez également exécuter le service swarm en mode "global" au lieu du mode "répliqué" par défaut. Le mode global exécute une tâche du service swarm sur tous les nœuds du cluster.

Avant d'exécuter le service en mode global, permettez-moi de supprimer le conteneur en cours d'exécution existant.

 geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container

Démarrez le service swarm dans un conteneur Docker en mode global à l'aide de l'indicateur –mode.

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. mfw8dp0zylffppkllkcjl8391 overall progress: 3 out of 3 tasks utdr3dnngqf1: running lssbyfzuiuh3: running xs6jqp95lw4c: running verify: Service converged

Vérifiez si le service swarm a démarré en mode global. Étant donné que trois nœuds (1 gestionnaire, 2 travailleurs) s'exécutent dans le cluster, c'est pourquoi le nombre de répliques est de 3.

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp

3 services fonctionnent maintenant sur 3 nœuds, vérifiez-le en exécutant la commande ci-dessous.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running about a minute ago 3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 Running Running about a minute ago yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago

Ensuite, laissez-moi vous montrer comment vous pouvez définir le nombre de répliques. Avant cela, je supprimerai le conteneur actuel, qui est en cours d'exécution.

 geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container

Utilisez l'indicateur –replicas dans la commande et mentionnez le nombre de répliques souhaitées du service swarm. Par exemple, je veux avoir deux répliques du service swarm :

 geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. 4yfl41n7sfak65p6zqwwjq82c overall progress: 2 out of 2 tasks 1/2: running 2/2: running verify: Service converged

Vérifiez les services swarm en cours d'exécution. Vous pouvez voir qu'un réplica s'exécute sur le nœud manager1 et l'autre sur le nœud worker1.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago

Accédez au nœud worker1 et vérifiez si le conteneur docker exécute le service swarm.

 geekflare@worker1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/…" About a minute ago Up About a minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv

Pour arrêter ce conteneur, exécutez la commande ci-dessous.

 geekflare@worker1:~$ docker stop 5042b7f161cb 5042b7f161cb

Maintenant, à partir du nœud manager1, si vous vérifiez quels nœuds exécutent le service, vous verrez qu'il s'exécute sur le nœud manager1 et le nœud worker2. L'ÉTAT ACTUEL du nœud worker1 est Shutdown (car nous avons arrêté le conteneur exécutant le service). Mais puisque deux réplicas doivent s'exécuter de ce service, un autre service a été démarré sur le travailleur 2.

C'est ainsi que vous obtenez une haute disponibilité à l'aide de docker swarm.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 30 seconds ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 38 seconds ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 3 minutes ago

Il est très facile d'augmenter ou de réduire les conteneurs Docker. La commande ci-dessous augmentera le conteneur mongo à 5.

 geekflare@manager1:~$ docker service scale Mongo-Container=5 Mongo-Container scaled to 5 overall progress: 5 out of 5 tasks 1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged

Vérifiez le nombre de répliques du conteneur mongo en cours d'exécution, il doit y en avoir 5.

 geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp

Vérifiez où ces 5 répliques s'exécutent dans le cluster. 1 réplica s'exécute sur le nœud manager1 et 2 réplicas sur les deux nœuds de travail chacun.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 5 minutes ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 47 seconds ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 46 seconds ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 44 seconds ago

Dans votre cluster, si vous ne souhaitez pas que vos services s'exécutent sur des nœuds de gestionnaire et que vous souhaitez les conserver uniquement pour gérer les nœuds, vous pouvez vider le nœud de gestionnaire.

 geekflare@manager1:~$ docker node update --availability drain manager1 manager1

Vérifiez la disponibilité du nœud de gestionnaire.

 geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6

Vous verrez que les services ne s'exécutent plus sur le nœud du gestionnaire ; ils sont répartis sur les noeuds worker du cluster.

 geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 5 minutes ago "task: non-zero exit (137)" qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running 41 seconds ago e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown 44 seconds ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 3 minutes ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 3 minutes ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 3 minutes ago

C'était tout sur Docker Swarm et comment orchestrer les conteneurs en mode docker swarm. Essayez-les sur votre environnement de non-production pour avoir une idée de leur fonctionnement.