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.