Ochrestrez vos Containers avec Docker Swarm
Mise à jour :
Docker Swarm est un outil d’orchesration de conteneurs conçu pour simplifier et optimiser le déploiement et la gestion d’applications à grande échelle. Docker Swarm permet de regrouper plusieurs hôtes Docker, appelés “nœuds”, en un seul cluster. Cette capacité de regroupement facilite grandement la coordination et la distribution des tâches entre les différents nœuds.
Pourquoi Utiliser Docker Swarm ?
Dans le domaine de la gestion des conteneurs, Docker Swarm se distingue par plusieurs atouts clés qui en font un choix privilégié pour certaines enreprises. Ce chapitre explore pourquoi Docker Swarm est un outil incontournable pour les débutants cherchant à déployer et gérer des applications conteneurisées.
Facilité d’utilisation et Intégration Native avec Docker : Docker Swarm est conçu pour s’intégrer parfaitement avec l’écosystème Docker, offrant une expérience utilisateur cohérente et familière. Cette intégration signifie que les utilisateurs de Docker trouveront en Docker Swarm un environnement naturel, avec des commandes et des interfaces qu’ils connaissent déjà. Cette familiarité réduit la courbe d’apprentissage et facilite l’adoption de la technologie.
Haute Disponibilité et Mise à l’Échelle Automatique : L’un des principaux avantages de Docker Swarm est sa capacité à assurer une haute disponibilité des applications. En répartissant les conteneurs sur différents nœuds, Docker Swarm garantit que si un nœud tombe en panne, les conteneurs qu’il héberge peuvent être rapidement redéployés sur d’autres nœuds. De plus, la mise à l’échelle automatique permet aux applications de répondre dynamiquement à des charges de travail fluctuantes, ce qui est important pour maintenir des performances optimales.
Répartition de Charge et Tolérance aux Pannes : Docker Swarm offre des fonctionnalités avancées de répartition de charge, distribuant intelligemment les requêtes entrantes entre les conteneurs pour équilibrer la charge et optimiser l’utilisation des ressources. Cette répartition assure une meilleure performance et une réponse plus rapide des applications. En outre, la tolérance aux pannes intégrée dans Docker Swarm aide à maintenir les applications en ligne même en cas de défaillance de certains composants, réduisant ainsi les temps d’arrêt et améliorant la fiabilité.
Gestion Simplifiée des Secrets et des Configurations : La gestion des secrets et des configurations est un aspect essentiel de la sécurité et de la gestion des applications. Docker Swarm facilite cette tâche en offrant des outils intégrés pour gérer de manière sécurisée les mots de passe, les clés API, les fichiers de configuration, etc. Cette gestion centralisée des secrets aide à renforcer la sécurité tout en simplifiant le processus de déploiement et de mise à jour des applications.
Architecture de Docker Swarm
L’architecture de Docker Swarm est conçue pour être à la fois robuste et flexible, offrant aux utilisateurs un cadre de travail efficace pour la gestion de conteneurs. Ce chapitre se penche sur les composants clés de cette architecture et explique comment ils s’articulent pour former un système cohérent et performant.
Nœuds Managers et Workers : le Cœur du Swarm : Un cluster Docker Swarm est composé de deux types de nœuds : les managers et les workers. Les nœuds managers sont responsables de la gestion de l’état du cluster, y compris la gestion des tâches, la planification des conteneurs et la prise de décisions clés pour le fonctionnement du cluster. Les nœuds workers, quant à eux, sont chargés d’exécuter les conteneurs et les services définis par les managers. Cette séparation des rôles assure une organisation efficace et une répartition claire des responsabilités au sein du cluster.
Raft Consensus Algorithm : Assurer la Cohérence et la Fiabilité : Docker Swarm utilise l’algorithme de consensus Raft pour maintenir un état cohérent à travers le cluster. Cet algorithme garantit que toutes les modifications apportées à l’état du cluster (comme la création ou la mise à jour de services) sont effectuées de manière sûre et cohérente, même en cas de défaillance de certains nœuds managers. Grâce à Raft, Docker Swarm assure une haute fiabilité et évite les problèmes de divergence d’état qui pourraient autrement perturber le fonctionnement du cluster.
Services et Tâches : Unités de Travail de Swarm : Dans Docker Swarm, les applications sont déployées sous forme de services. Un service définit un état désiré pour l’application, comme le nombre de réplicas de conteneur à exécuter. Chaque instance d’un service est appelée une tâche. Les managers orchestrent la création et la gestion de ces tâches, s’assurant qu’elles s’exécutent selon les spécifications du service. Cette abstraction des applications en services et tâches permet une gestion plus souple et une meilleure scalabilité.
Réseau Overlay et Découverte de Services : Docker Swarm utilise des réseaux overlay pour permettre la communication entre les conteneurs sur différents nœuds. Cela permet aux conteneurs de se connecter de manière transparente, comme s’ils étaient sur le même hôte. De plus, la découverte de services intégrée simplifie la communication entre les différents services, permettant aux conteneurs de se localiser et de communiquer entre eux sans configuration complexe.
Stockage et Volumes dans Swarm : La gestion du stockage est un aspect essentiel de Docker Swarm. Les volumes peuvent être utilisés pour persister les données au-delà du cycle de vie des conteneurs individuels. Docker Swarm permet de définir des stratégies pour le montage de ces volumes sur les conteneurs, assurant ainsi la disponibilité des données là où elles sont nécessaires.
Prérequis pour Docker Swarm
Avant de commencer à configurer Docker Swarm, il est important de s’assurer que certains prérequis sont remplis. Cette étape est fondamentale pour garantir le bon fonctionnement et la sécurité de votre cluster Docker Swarm.
Installation de Docker
Le premier prérequis est, naturellement, l’installation de Docker. Assurez-vous que Docker est installé sur toutes les machines qui feront partie de votre cluster Docker Swarm. Docker doit être à jour pour éviter les problèmes de compatibilité. Pour vérifier si Docker est installé et connaître sa version, utilisez la commande :
docker --version
Configuration du Réseau
Dans cette documentation je n’utiliserais qu’un seul noeud. Par contre si vous souhaitez le faire sur plusieurs, Docker Swarm nécessite que les machines soient en mesure de communiquer entre elles. Il est donc important de configurer correctement le réseau. Assurez-vous que les ports nécessaires sont ouverts et accessibles. Par exemple, le port TCP 2377 est utilisé pour la communication entre les nœuds managers et les ports TCP/UDP 7946 ainsi que le port UDP 4789 sont utilisés pour la communication entre les nœuds.
Initialisation d’un Cluster Docker Swarm sur un Seul Nœud
L’initialisation d’un cluster Docker Swarm, même sur un seul nœud, est un processus simple mais essentiel. Cela permet de mettre en place l’infrastructure nécessaire pour orchestrer vos conteneurs. Suivons les étapes pour initialiser un cluster Docker Swarm sur un unique nœud.
Pour initialiser le mode Swarm, utilisez la commande suivante :
docker swarm initSwarm initialized: current node (gxjcih2gwrxjs8w3nym3awsij) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3xqq5w9tx20sojtag0vweq4snsldrz6yed8c27408hh5odz2sy-5oksdnnuxqjk4c8se47p8iqbv 192.168.121.47:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Cette commande transforme votre Docker en un nœud manager de Docker Swarm. Elle configure également le nœud pour qu’il puisse gérer les déploiements et orchestrer les conteneurs.
Même si vous utilisez un seul nœud, il est utile de noter le token de worker. Ce token sera nécessaire si vous décidez d’ajouter des nœuds workers à l’avenir. Pour récupérer le token, utilisez :
docker swarm join-token worker
Gardez ce token en lieu sûr, car il sera requis pour ajouter des nœuds workers à votre cluster.
Après l’initialisation, il est important de vérifier que tout fonctionne correctement. Utilisez la commande suivante pour voir l’état de votre cluster Swarm :
docker node lsID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSIONgxjcih2gwrxjs8w3nym3awsij * ubuntu2204.localdomain Ready Active Leader 24.0.7
Cette commande affiche la liste des nœuds dans le cluster et indique si votre nœud est actif et prêt à orchestrer des conteneurs.
Comprendre les Fichiers Stack.yaml et Leurs Différences avec Docker Compose
Lorsque vous travaillez avec Docker Swarm, les fichiers stack.yaml
jouent un
rôle central. Ces fichiers ressemblent beaucoup aux fichiers
docker-compose.yml
utilisés dans Docker Compose, mais il y a des différences
clés à comprendre.
Tout d’abord, examinons les similitudes. Les deux formats de fichiers sont écrits en YAML et servent à définir des services, des réseaux et des volumes dans un environnement Docker. Vous pouvez spécifier des configurations de conteneurs, des variables d’environnement, des ports, etc., dans les deux types de fichiers.
Gestion d’Orchestration : La principale différence réside dans leur
utilisation. Docker Compose est principalement utilisé pour définir et
exécuter des applications multi-conteneurs sur un seul hôte. Il est idéal pour
le développement, les tests et les environnements de production de petite
taille. En revanche, les fichiers stack.yaml
sont utilisés avec Docker Swarm,
qui est conçu pour l’orchestration de conteneurs sur plusieurs hôtes,
offrant une haute disponibilité et une meilleure montée en charge.
Dans Docker Swarm, les fichiers stack.yaml
peuvent inclure des spécificités
qui ne sont pas présentes ou nécessaires dans Docker Compose. Par exemple, dans
Swarm, vous pouvez spécifier des paramètres de déploiement pour vos services,
tels que le nombre de réplicas, les contraintes de déploiement sur certains
nœuds, ou les politiques de mise à jour.
Exemple de Spécification de Déploiement :
services: mon_service: image: mon_image deploy: replicas: 5 update_config: parallelism: 2 delay: 10s
Dans cet exemple, le service mon_service
est configuré pour avoir 5 réplicas,
avec une politique de mise à jour spécifiant comment les mises à jour doivent
être déployées.
Un point important est que les fichiers docker-compose.yml
peuvent souvent
être utilisés directement ou avec peu de modifications dans Docker Swarm.
Cependant, pour tirer pleinement parti des fonctionnalités avancées de Swarm, il
est recommandé d’adapter et d’optimiser les fichiers pour ce dernier.
Création de Votre Premier Fichier Stack.yaml
La création d’un fichier stack.yaml
est une étape essentielle pour déployer
des services sur Docker Swarm. Ce fichier définit les spécifications de
votre application dans un format compréhensible par Docker. Abordons étape par
étape comment créer ce fichier.
Définir les services : La première section de votre fichier doit décrire les services. Un service dans Docker Swarm est une définition d’une tâche à exécuter sur un conteneur. Par exemple, si votre application nécessite un serveur web et une base de données, vous définirez deux services.
services: web: image: nginx ports: - "80:80" db: image: postgres environment: POSTGRES_PASSWORD: mon_mot_de_passe
Dans cet exemple, deux services sont définis : web
utilisant l’image nginx
et db
utilisant l’image postgres
. La section ports
sous web
indique que
le port 80 du conteneur sera mappé sur le port 80 de l’hôte.
Les réseaux permettent de connecter vos services entre eux. Dans Docker Swarm, vous pouvez définir des réseaux pour isoler la communication entre les services.
networks: mon_reseau:
Ce simple exemple crée un réseau nommé mon_reseau
.
Les volumes sont utilisés pour stocker et gérer les données. Ils sont particulièrement importants pour les bases de données ou pour conserver des données spécifiques en dehors des conteneurs.
volumes: db_data:
Ici, db_data
est un volume qui pourrait être utilisé par le service de base de
données pour stocker les données de manière persistante.
Déploiement de la Stack sur Docker Swarm
Après avoir créé et configuré votre fichier stack.yaml
, l’étape suivante
consiste à déployer la stack sur Docker Swarm. Ce processus implique la mise en
place de vos services, réseaux et volumes définis dans le fichier stack.yaml
sur le cluster Swarm. Suivons les étapes pour un déploiement réussi.
Pour déployer votre stack, utilisez la commande docker stack deploy
. Cette
commande prend en charge la création et la mise à jour des services dans votre
stack. Assurez-vous d’être connecté au nœud manager de votre Swarm pour exécuter
cette commande. Voici comment déployer une stack nommée ma_stack
:
docker stack deploy -c stack.yaml ma_stackCreating network ma_stack_defaultCreating service ma_stack_webCreating service ma_stack_db
Cette commande indique à Docker de lire la configuration de votre stack depuis
le fichier mon_stack.yaml
et de déployer les services sous le nom de stack
ma_stack
.
Après le déploiement, il est important de vérifier que tout fonctionne comme prévu. Vous pouvez voir l’état des services dans votre stack en utilisant :
docker stack services ma_stackID NAME MODE REPLICAS IMAGE PORTSac93y3421md7 ma_stack_db replicated 1/1 postgres:latestr83dedfnvufy ma_stack_web replicated 1/1 nginx:latest *:80->80/tcp
Cette commande affiche une liste de tous les services dans votre stack, avec des informations sur leur état, le nombre de réplicas et d’autres détails utiles.
Pour dépanner ou simplement suivre ce qui se passe, vous pouvez consulter les logs de vos services. La commande suivante vous permet de voir les logs d’un service spécifique :
docker logs ma_stack_web.1.t0epe9gh2qo9ytk1cym5vae8a2023/12/07 12:57:10 [notice] 1#1: using the "epoll" event method2023/12/07 12:57:10 [notice] 1#1: nginx/1.25.32023/12/07 12:57:10 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)2023/12/07 12:57:10 [notice] 1#1: OS: Linux 5.15.0-88-generic2023/12/07 12:57:10 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:10485762023/12/07 12:57:10 [notice] 1#1: start worker processes2023/12/07 12:57:10 [notice] 1#1: start worker process 292023/12/07 12:57:10 [notice] 1#1: start worker process 30/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d//docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh/docker-entrypoint.sh: Configuration complete; ready for start up
Vous pouvez aussi contrôler que le port 80 réponds bien sur votre machine :
curl http://localhost<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>html { color-scheme: light dark; }body { width: 35em; margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p>
<p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p></body></html>