Comment créer un cluster de conteneurs Docker avec Docker Swarm et DigitalOcean sur CentOS 7

introduction

Docker Swarm est la solution native de Docker pour le déploiement d’un cluster d’hôtes Docker. Vous pouvez l’utiliser pour déployer rapidement un cluster d’hôtes Docker s’exécutant sur votre ordinateur local ou sur des plates-formes cloud prises en charge.

Avant Docker 1.12, la configuration et le déploiement d’un cluster d’hôtes Docker nécessitaient l’utilisation d’un magasin de valeurs-clés externe, tel que etcd ou Consul. pour la découverte du service. Cependant, avec Docker 1.12, un service de découverte externe n’est plus nécessaire, car Docker est livré avec un magasin de clés-valeurs en mémoire qui fonctionne sans configuration.

Dans ce didacticiel, vous apprendrez à déployer un cluster de machines Docker à l’aide de la fonctionnalité Swarm de Docker 1.12 sur DigitalOcean. Chaque nœud Docker du cluster exécutera CentOS 7. Bien que vous puissiez exécuter un cluster composé de dizaines, de centaines ou de milliers d’hôtes Docker, le cluster que nous allons configurer dans ce tutoriel sera composé d’un nœud de gestionnaire et de deux nœuds de travail, pour un total de trois membres du cluster. . Une fois ce didacticiel terminé, vous pourrez ajouter plus de nœuds à votre cluster facilement.

Conditions préalables

Pour ce tutoriel, vous aurez besoin de:

  • Une machine locale avec Docker installé. Votre machine locale peut exécuter n’importe quelle distribution Linux, ou même Windows ou macOS. Pour Windows et macOS, installez Docker à l’aide du programme d’installation officiel https://www.docker.com/products/docker. Si CentOS 7 fonctionne sur votre ordinateur local mais que Docker n’est pas installé, voir https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-centos-7 [ Comment installer et utiliser Docker sur CentOS 7] pour obtenir des instructions.

  • Un jeton d’API DigitalOcean. Si vous n’en avez pas, générez-le à l’aide de his guide. Lorsque vous générez un jeton, assurez-vous qu’il a une portée en lecture-écriture. C’est la valeur par défaut. Par conséquent, si vous ne modifiez aucune option lors de sa génération, elle disposera de fonctionnalités de lecture-écriture. Pour faciliter son utilisation sur la ligne de commande, veillez à affecter le jeton à une variable comme indiqué dans cet article.

  • Docker Machine installé sur votre ordinateur local, que vous utiliserez pour créer trois hôtes. Sous Windows et macOS, l’installation de Docker comprend Docker Machine. Si vous exécutez CentOS 7 localement, voir https://www.digitalocean.com/community/tutorials/how-to-provision-and-manage-remote-rocker-hosts-with-docker-machine-on-centos- 7 [Comment configurer et gérer des hôtes Docker distants avec Docker Machine sur CentOS 7] pour obtenir des instructions d’installation.

Étape 1 - Mise en service des nœuds de cluster

Nous devons créer plusieurs hôtes Docker pour notre cluster. En tant que rappel, la commande suivante fournit un seul hôte dockerisé, où + $ DOTOKEN + est une variable d’environnement qui correspond à votre jeton d’API DigitalOcean:

docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $

Imaginez que vous ayez à le faire pour configurer un cluster composé d’au moins trois nœuds, alimentant un hôte à la fois.

Nous pouvons automatiser le processus de provisionnement d’un nombre illimité d’hôtes Docker à l’aide de cette commande, associée à quelques scripts Bash simples. Exécutez cette commande sur votre machine locale pour créer trois hôtes Docker, nommés + noeud-1 +, + noeud-2 + et + noeud-3 +:

for i in ; do docker-machine create --driver digitalocean \
--digitalocean-image  centos-7-0-x64 \
--digitalocean-access-token  $i; done

Une fois la commande terminée, vous pouvez vérifier que toutes les machines ont été créées en visitant votre tableau de bord DigitalOcean ou en tapant la commande suivante:

docker-machine ls

La sortie doit ressembler à la suivante et servir de référence rapide pour rechercher l’adresse IP des nœuds:

OutputNAME     ACTIVE   DRIVER         STATE     URL                          SWARM   DOCKER    ERRORS
  -        digitalocean   Running   tcp://             v1.12.2
  -        digitalocean   Running   tcp://             v1.12.2
  -        digitalocean   Running   tcp://             v1.12.2

À ce stade, les trois hôtes dockerisés ont été créés et vous avez l’adresse IP de chaque hôte. Ils exécutent également tous Docker 1.12.x, mais ne font pas encore partie d’un cluster Docker. Dans les étapes suivantes, nous allons configurer les règles de pare-feu qui permettront aux nœuds de fonctionner en tant que membres d’un cluster, choisir l’un des nœuds et en faire le gestionnaire de Docker Swarm, puis configurer le reste en tant que travailleurs Docker Swarm.

Étape 2 - Configuration des règles de pare-feu pour autoriser le trafic Docker Swarm

Un cluster doit avoir au moins un nœud servant de gestionnaire, bien que trois gestionnaires soient recommandés pour une installation de production. Pour cette configuration, sélectionnons le premier nœud et en faisons le gestionnaire Swarm. Les deux autres noeuds seront les noeuds de travail.

Certains ports réseau doivent être ouverts sur les nœuds qui feront partie d’un cluster pour que le cluster fonctionne correctement. Cela implique de configurer le pare-feu pour autoriser le trafic via ces ports. Étant donné que trois applications de pare-feu différentes peuvent être utilisées pour accomplir cette tâche, les commandes que vous devez exécuter sur les nœuds pour chaque application de pare-feu ont été décrites dans un article séparé. Suivez his guide et configurez les pare-feu pour chaque hôte. Ouvrez les ports appropriés sur le gestionnaire, puis répétez l’opération pour ouvrir les ports sur les deux nœuds clients.

Une fois cette étape terminée, vous pouvez initialiser le gestionnaire de cluster.

Étape 3 - Initialisation du gestionnaire de cluster

Nous avons décidé que ++ serait notre gestionnaire de cluster, alors connectez-vous au nœud à partir de votre machine locale:

docker-machine ssh

L’invite de commande changera pour refléter le fait que vous êtes maintenant connecté à ce nœud particulier. Pour configurer le noeud en tant que gestionnaire Swarm, tapez la commande suivante:

docker swarm init --advertise-addr

+ node_ip_address + est l’adresse IP du nœud. Vous pouvez l’obtenir à la sortie de + docker-machine ls + ou de votre tableau de bord DigitalOcean.

Vous verrez une sortie ressemblant à ceci:

OutputSwarm initialized: current node () is now a manager.

To add a worker to this swarm, run the following command:

   docker swarm join \
   --token SWMTKN-1-57m6beujakwyx0t2j5mglpi9juf8czapp8kf2tj3gudkgjkoda-0eg0x08w7uvyxiacmmx0zv67o \
   111.111.111.111:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

La sortie contient l’ID du nœud, * 2n4y8bwu6s7c1kwdryd945zv1 * dans cet exemple, ainsi que les instructions relatives à l’ajout des autres nœuds au cluster.

Alors maintenant, vous avez un Docker Swarm avec un gestionnaire configuré. Ajoutons les nœuds restants en tant que travailleurs.

Étape 4 - Ajout de nœuds au cluster

Pour terminer cette étape, vous voudrez peut-être ouvrir un autre terminal et laisser l’onglet du terminal ou la fenêtre que vous avez utilisé pour vous connecter au gestionnaire Swarm seul pour le moment.

Commencez par vous connecter à + ​​node-2 + depuis votre machine locale:

docker-machine ssh

Puis exécutez cette commande, où + your_swarm_token + est le jeton que vous avez reçu lors de la création du cluster à l’étape précédente, et + manager_node_ip_address + est l’IP du gestionnaire Swarm:

docker swarm join \
--token  \
:2377

Une fois la commande exécutée avec succès, vous verrez cette réponse:

OutputThis node joined a swarm as a worker.

Déconnectez-vous de `, puis répétez ce processus avec ` pour l’ajouter à votre cluster.

Vous avez maintenant ajouté deux nœuds de travail au cluster. Si les règles de pare-feu ont été configurées correctement, vous disposez maintenant d’un serveur Docker Swarm fonctionnel, avec tous les nœuds synchronisés.

Étape 5 - Gestion du cluster

Une fois que les nœuds de gestionnaire et de travail ont été affectés au cluster, toutes les commandes de gestion de Docker Swarm doivent être exécutées sur les nœuds de gestionnaire. Revenez donc au terminal que vous avez utilisé pour ajouter le gestionnaire et tapez cette commande pour afficher tous les membres du cluster:

docker node ls

Le résultat devrait ressembler à ceci:

OutputID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4smt8qechkvb8qp02nwo2oe6t *      Ready   Active        Leader
5wzik3knakgj0c24jmtmiy5oq        Ready   Active
7f6ws6oladh94xnmbfdhanokm        Ready   Active

Cette sortie montre que nous avons affaire à un Docker Swarm à 3 nœuds et à ses nœuds - un gestionnaire et deux ouvriers. Pour afficher les autres commandes de gestion que vous pouvez exécuter sur le nœud du gestionnaire, tapez:

docker node --help

Pour obtenir des informations détaillées sur le cluster, vous pouvez utiliser la commande suivante sur le gestionnaire ou les travailleurs (il s’agit d’une commande générique de Docker):

docker info

La sortie doit être de ce type et indiquer le statut du cluster (* actif * ou * en attente *), le nombre de nœuds du cluster et indiquer si le nœud particulier est un gestionnaire ou un opérateur.

Output...

Network: null host overlay bridge
Swarm: active
NodeID: 4smt8qechkvb8qp02nwo2oe6t
Is Manager: true
ClusterID: 31i554ti23njgxg28av52hv47
Managers: 1
Nodes: 3
Orchestration:
 Task History Retention Limit: 5
Raft:
 Snapshot Interval: 10000
 Heartbeat Tick: 1
 Election Tick: 3
Dispatcher:
 Heartbeat Period: 5 seconds
CA Configuration:
 Expiry Duration: 3 months
Node Address: 111.111.111.111
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.10.0-327.22.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux

...

Si vous répétez la même commande sur les nœuds de travail, la ligne * Is Manager * devrait afficher + false +.

Maintenant, obtenons un service actif sur le cluster.

Étape 6 - Services en cours dans l’essaim de dockers

Maintenant que vous avez un Docker Swarm opérationnel, exécutons un conteneur de test et voyons comment le gestionnaire le gère. Sur une machine exécutant Docker Engine 1.12 ou une version plus récente, les conteneurs sont déployés en tant que services à l’aide de la commande + docker service +. Et comme la commande + docker node, la commande` + docker service` ne peut être exécutée que sur un nœud de gestionnaire.

Alors, déployons un service de serveur Web en utilisant l’image de conteneur officielle de Nginx:

docker service create -p 80:80 --name  nginx

Dans cette commande, nous mappons le port + 80 + dans le conteneur Nginx sur le port + 80 + du cluster afin que nous puissions accéder à la page Nginx par défaut où que vous soyez.

Pour voir quels services s’exécutent sur un cluster, tapez:

docker service ls

La sortie devrait prendre cette forme. La colonne * REPLICAS * indique le nombre d’instances du service en cours d’exécution:

OutputID            NAME       REPLICAS  IMAGE  COMMAND
ch7xnvy8upho  webserver  1/1       nginx

Vous pouvez déterminer les nœuds sur lesquels les services s’exécutent en utilisant + docker service ps + suivi du nom du service.

docker service ps

La sortie devrait ressembler à ceci:

OutputID                         NAME         IMAGE         NODE    DESIRED STATE  CURRENT STATE           ERROR
4pfbvs7sh5mugtzckw4czhcfm  webserver.1  nginx         node-1  Running        Running 2 minutes ago

Dans cet exemple, le service + webserver + est exécuté sur + node-1 +. Étant donné qu’il s’agit d’un serveur Web fonctionnant sur les ports par défaut, vous pouvez y accéder en dirigeant votre navigateur sur + http: // +. Essaie. Vous verrez la page par défaut de Nginx.

Grâce à la magie des réseaux maillés, un service exécuté sur un nœud est accessible sur n’importe quel autre nœud du cluster. Par exemple, vous pouvez également accéder à ce service en pointant votre navigateur sur l’adresse IP de n’importe quel nœud du cluster, pas seulement celui sur lequel il est exécuté. Essaie.

Une autre fonctionnalité de Docker Swarm est la possibilité de redimensionner un service, c’est-à-dire de créer des instances supplémentaires d’un service. Supposons que nous voulions redimensionner le service + webserver + que nous avons démarré précédemment à cinq instances. Pour ce faire, il suffit de taper la commande suivante et le système créera quatre instances supplémentaires:

docker service scale =5

Et la sortie de + docker service ps + indiquera sur quels nœuds les nouvelles instances ont été démarrées:

OutputID                         NAME             IMAGE  NODE    DESIRED STATE  CURRENT STATE               ERROR
4pfbvs7sh5mugtzckw4czhcfm  webserver.1      nginx  node-1  Running        Running 3 minutes ago
1er2rbrnj6ltanoe47mb653wf  webserver.2      nginx  node-3  Running        Running 14 seconds ago
evassgyvruh256ebv5pj3bqcz  webserver.3      nginx  node-3  Running        Running 14 seconds ago
d453agrdpgng47klbl6yfjnka  webserver.4      nginx  node-1  Running        Running 18 seconds ago
2hsdevx178rg15gqxhzrsnmg6  webserver.5      nginx  node-2  Running        Running 14 seconds ago

Cela montre que deux des quatre nouvelles instances ont été démarrées sur + node-3 +, une a été démarrée sur + node-1 + et l’autre démarrée sur + node-2 +.

Enfin, si un service tombe en panne, il est automatiquement redémarré sur le même nœud ou sur un nœud différent, si le nœud initial n’est plus disponible.

Conclusion

Vous avez constaté à quel point il est facile de configurer un Docker Swarm à l’aide de Docker Engine 1.12 et du nouveau mode Swarm. Vous avez également vu comment effectuer quelques tâches de gestion sur le cluster. Mais il y a encore plus. Pour afficher les commandes Docker Swarm disponibles, exécutez la commande suivante sur votre gestionnaire Swarm.

docker swarm --help

Pour plus d’informations sur Docker Swarm, visitez la page official documentation. Et n’oubliez pas de consulter d’autres Docker-related articles sur DigitaloOcean.