Tout sur le Docker Swarm et la façon dont il gère et orchestre tous les conteneurs d'un cluster.
What is Docker Swarm?
Docker swarm est un mode de gestion d'un cluster de moteurs Docker, 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 du moteur docker 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.
Why use it? – Container Orchestration
Lorsque vous travaillez dans un environnement de production, des centaines de conteneurs docker exécuteront plusieurs applications. La gestion de tous ces conteneurs peut être très pénible pour tous les DevOps ingénieurs; c'est là que Docker Swarm vous aide. Il gère et orchestre le cluster exécutant facilement plusieurs conteneurs Docker.
Voici quelques-unes de ses caractéristiques:
- La haute disponibilité - vise à n'offrir aucun temps d'arrêt ou panne.
- L'équilibrage de charge - allouez automatiquement les ressources et les demandes sur les autres nœuds du cluster en cas de défaillance d'un nœud.
- Décentralisé - plusieurs nœuds de gestion s'exécutent 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.
Orchestrate Docker Containers
Maintenant que vous connaissez les bases de Docker Swarm, regardons un exemple de sa mise en œuvre.
Dans cet exemple, j'ai trois machines fonctionnant 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 le docker, exécutez la commande ci-dessous sur le nœud du gestionnaire. Le drapeau --advertise-addr
est utilisé pour se faire connaître auprès des 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 nœuds 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 de 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 le geekflare_mongodb
image de docker que nous avons utilisée dans Tutoriel 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ées 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 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 exécuter le service Swarm dans "global" mode également 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 nœuds de calcul) sont en cours d'exécution dans le cluster, c'est pourquoi le nombre de réplicas 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 que vous voulez du service swarm. Par exemple, je souhaite 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 est en cours d'exécution 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 son exécution 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 comme deux réplicas doivent exécuter ce service, un autre service a été démarré sur le worker 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épliques sur les deux nœuds worker 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 fonctionnent plus sur le nœud du gestionnaire; ils sont répartis sur les nœuds de calcul 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 à propos de Docker Swarm et comment orchestrer des conteneurs en mode essaim docker. Essayez-les sur votre environnement hors production pour avoir une idée de leur fonctionnement.