Comment créer un cluster de conteneurs Docker avec Docker Swarm et DigitalOcean sur Ubuntu 16.04

introduction

Docker Swarm est la solution native Docker pour déployer 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 que vous utilisiez un magasin clé-valeur externe tel queetcd ouConsul pour la découverte de services. 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 Ubuntu 16.04. 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 desofficial installer. Si Ubuntu 16.04 est en cours d'exécution sur votre machine locale, mais que Docker n'est pas installé, consultezHow To Install and Use Docker on Ubuntu 16.04 pour obtenir des instructions.

  • Un jeton d'API DigitalOcean. Si vous n'en avez pas, générez-le en utilisantthis 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 Ubuntu 16.04 localement, consultezHow To Provision and Manage Remote Docker Hosts with Docker Machine on Ubuntu 16.04 pour les instructions d'installation.

[[step-1 -—- provisioning-the-cluster-nodes]] == Étape 1 - Provisionnement des nœuds de cluster

Nous devons créer plusieurs hôtes Docker pour notre cluster. Pour rappel, la commande suivante provisionne un seul hôte Dockerized, où$DOTOKEN est une variable d'environnement qui évalue votre jeton d'API DigitalOcean:

docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token $DOTOKEN machine-name

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ésnode-1,node-2 etnode-3:

for i in 1 2 3; do docker-machine create --driver digitalocean \
--digitalocean-image  ubuntu-16-04-x64 \
--digitalocean-access-token $DOTOKEN node-$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
node-1   -        digitalocean   Running   tcp://111.111.111.111:2376             v1.12.2
node-2   -        digitalocean   Running   tcp://111.111.111.112:2376           v1.12.2
node-3   -        digitalocean   Running   tcp://111.111.222.222:2376         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.

[[step-2 -—- configuration-firewall-rules-to-allow-docker-swarm-traffic]] == É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 de chaque application de pare-feu ont été décrites dans un article séparé. Suivezthis 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.

[[step-3 -—- initializing-the-cluster-manager]] == Étape 3 - Initialisation du Cluster Manager

Nous avons décidé quenode-1 sera notre gestionnaire de cluster, alors connectez-vous au nœud depuis votre ordinateur local:

docker-machine ssh node-1

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

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

Vous verrez un résultat ressemblant à ce qui suit:

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

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

    docker swarm join \
    --token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \
    111.111.111.111:2377

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

Dans la sortie se trouve l'ID du nœud, qui esta35hhzdzf4g95w0op85tqlow1 dans cet exemple, et les instructions sur la façon d'ajouter les 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.

[[step-4 -—- add-nodes-to-the-cluster]] == É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.

Tout d'abord, connectez-vous ànode-2 depuis votre machine locale:

docker-machine ssh node-2

Exécutez ensuite cette commande, oùyour_swarm_token est le jeton que vous avez reçu lorsque vous avez créé le cluster à l'étape précédente, etmanager_node_ip_address est l'adresse IP du gestionnaire Swarm:

docker swarm join \
--token your_swarm_token \
manager_node_ip_address: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 denode-2, puis répétez ce processus avecnode-3 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.

[[step-5 -—- Managing-the-cluster]] == É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
2qhg0krj00i4d3as2gpb0iqer    node-2    Ready   Active
6yqh4bjki46p5uvxdw6d53gc0    node-3    Ready   Active
a35hhzdzf4g95w0op85tqlow1 *  node-1    Ready   Active        Leader

Cette sortie montre que nous avons affaire à un Docker Swarm à 3 nœuds et à ses nœuds - un gestionnaire et deux travailleurs. 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 doit indiquer l'état du cluster (active oupending), le nombre de nœuds dans le cluster et si le nœud particulier est un gestionnaire ou un travailleur.

Output...

Network: bridge host null overlay
Swarm: active
 NodeID: a35hhzdzf4g95w0op85tqlow1
 Is Manager: true
 ClusterID: f45u0lh7ag4qsl4o56yfbls31
 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: 104.236.239.4
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
...

Si vous répétez la même commande sur les nœuds worker, la ligneIs Manager doit afficherfalse.

[.tip] #Tip: Vous pouvez ajouter ou supprimer des nœuds du cluster à tout moment. De plus, un nœud de travail peut être promu au rang de gestionnaire et le gestionnaire peut être converti en travailleur.
#

Maintenant, obtenons un service en cours d'exécution sur le cluster.

[[step-6 -—- running-services-in-the-docker-swarm]] == Étape 6 - Exécution de services dans Docker Swarm

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 plus récent, les conteneurs sont déployés en tant que services à l'aide de la commandedocker service. Et comme la commandedocker node, la commandedocker 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 webserver nginx

Dans cette commande, nous mappons le port80 du conteneur Nginx sur le port80 du cluster afin que nous puissions accéder à la page Nginx par défaut de n'importe où.

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

docker service ls

La sortie devrait prendre cette forme. La colonneREPLICAS indique le nombre d'instances du service en cours d'exécution:

OutputID            NAME       REPLICAS  IMAGE  COMMAND
0ymctkanhtc1  webserver  1/1       nginx

Vous pouvez déterminer sur quels nœuds les services s'exécutent en utilisantdocker service ps suivi du nom du service.

docker service ps webserver

La sortie devrait ressembler à ceci:

OutputID                         NAME         IMAGE         NODE    DESIRED STATE  CURRENT STATE                ERROR
39yprxsaaekuif951cl0o4wau  webserver.1      nginx  node-1  Running        Running 7 hours ago

Dans cet exemple, le servicewebserver s'exécute surnode-1. Puisqu'il s'agit d'un serveur Web fonctionnant sur les ports par défaut, vous pouvez y accéder en pointant votre navigateur vershttp://node-1_ip_address. 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 souhaitons mettre à l'échelle le servicewebserver 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 webserver=5

Et la sortie dedocker service ps montrera sur quels nœuds les nouvelles instances ont été démarrées:

OutputID                         NAME         IMAGE  NODE    DESIRED STATE  CURRENT STATE               ERROR
39yprxsaaekuif951cl0o4wau  webserver.1      nginx  node-1  Running        Running 8 hours 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 surnode-3, l'une surnode-1 et l'autre surnode-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 le siteofficial documentation page. Et n'oubliez pas de vérifier les autresDocker-related articles sur DigitaloOcean.

Related