Orchestrateurs - Swarm
Docker Swarm
Docker swarm est la solution de Docker pour exécuter Docker sur plusieurs hôtes.
La solution n'a jamais résolu les problèmes complexes et d'échelle de la production.
Aujourd'hui le produit est toujours disponible mais n'a plus de visibilité pour l'avenir.
Introduction à Swarm
Se grouper par 2 ou 3 pour créer un cluster à partir de vos VM respectives (il faut utiliser une commande Swarm pour récupérer les instructions nécessaires :
docker swarm init
devrait vous orienter).Si grouper plusieurs des VM n'est pas possible, vous pouvez faire un cluster à un seul noeud, ou bien créer un cluster multi-nodes très simplement avec l'interface du site Play With Docker, il faut s'y connecter avec vos identifiants Docker Hub. Vous pouvez vous connecter à ces VM en SSH.
Vous pouvez faire
docker swarm --help
pour obtenir des infos manquantes, ou fairedocker swarm leave --force
pour réinitialiser votre configuration Docker Swarm si besoin.N'hésitez pas à regarder dans les logs avec
systemctl status docker
comment se passe l'élection du nœud leader, à partir du moment où vous avez plus d'un manager.
Créer un service
Afin de visualiser votre installation Swarm, utilisons : https://github.com/dockersamples/docker-swarm-visualizer
docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer
En ligne de commande
En ligne de commande :
docker service create --name whoami --replicas 5 -p 9999:80 traefik/whoami
Avec la clé deploy:
A l'aide de la propriété deploy:
de docker compose, créer un service en 5 exemplaires (replicas
) à partir de l'image traefik/whoami
accessible sur le port 9999
et connecté au port 80
des 5 replicas.
Correction
services:
whoami:
image: traefik/whoami
ports:
- 9999:80
deploy:
replicas: 5
Accédez à votre service depuis un node et actualisez plusieurs fois la page (Ctrl+Maj+R sinon le cache du navigateur vous embêtera). Les informations affichées changent. Pourquoi ?
- Lancez une commande
service scale
pour changer le nombre de replicas de votre service et observez le changement avecdocker service ps hello
La stack example-voting-app
Cloner l'application
example-voting-app
ici : https://github.com/dockersamples/example-voting-appLire le schéma d'architecture de l'app
example-voting-app
sur Github.Lire attentivement le fichier
docker-stack.yml
. Ce sont des fichiers Docker Compose classiques avec différentes options liées à un déploiement via Swarm. Quelles options semblent spécifiques à Docker Swarm ? Ces options permettent de configurer des fonctionnalités d'orchestration.
Avec
docker swarm init
, transformer son installation Docker en une installation Docker compatible avec Swarm. Lisez attentivement le message qui vous est renvoyé.Déployer la stack du fichier
docker-stack.yml
:docker stack deploy --compose-file docker-stack.yml vote
docker stack ls
indique 6 services pour la stackvote
. Observer également l'output dedocker stack ps vote
et dedocker stack services vote
. Qu'est-ce qu'un service dans la terminologie de Swarm ?Accéder aux différents front-ends de la stack grâce aux informations contenues dans les commandes précédentes. Sur le front-end lié au vote, actualiser plusieurs fois la page. Que signifie la ligne
Processed by container ID […]
? Pourquoi varie-t-elle ?Scaler la stack en ajoutant des replicas du front-end lié au vote avec l'aide de
docker service --help
. Accédez à ce front-end et vérifier que cela a bien fonctionné en actualisant plusieurs fois.
puis spécifier quelques options d'orchestration exclusives à Docker Swarm : que fait
mode: global
? N'oubliez pas de redéployer votre Compose file.Avec Portainer ou avec docker-swarm-visualizer, explorer le cluster ainsi créé.
Opérer sur le cluster
Trouver la commande pour déchoir et promouvoir l'un de vos nœuds de
manager
àworker
et vice-versa.Puis sortir un nœud du cluster (
drain
) :docker node update --availability drain <node-name>
Installons Portainer
Portainer est une interface web de base pour gérer un cluster docker.
docker service create \
--name portainer \
--publish 9000:9000 \
--constraint 'node.role == manager' \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
portainer/portainer \
-H unix:///var/run/docker.sock
- Listez les services
- Inspectez le service portainer avec l'option --pretty
- Ouvrez la page avec
firefox http://$(docker-machine ip <machine_manager>):9000
-->
Facultatif : déployer une nouvelle image pour un service de example-voting-app
Tenter :
- de rebuild les différentes images à partir de leur Dockerfile,
- puis d'éditer votre fichier Docker Compose (
docker-stack.yml
) pour qu'il se base sur l'image que vous venez de reconstruire. - et de déployer ces images, potentiellement en faisant varier les options de
update_config:
. Un message de warning devrait apparaître, pourquoi ?
Facultatif : Gérer les données sensibles dans Swarm avec les secrets Docker
créer un secret avec :
echo "This is a secret" | docker secret create my_secret_data
permettre l'accès au secret via :
docker service create --name monservice --secret my_secret_data redis:alpine
lire le contenu secret dans :
/var/run/my_secret_data
Facultatif : cluster Postgres haute dispo et Swarm
Objectif : Déployer un cluster postgres répliqué avec Swarm
Indice : https://www.crunchydata.com/blog/an-easy-recipe-for-creating-a-postgresql-cluster-with-docker-swarm