meta données pour cette page
Déployer un service avec un cluster Swarm (Docker)
Dans les autres tutoriels présentés dans cette introduction, on utilisait une seule machine pour faire tourner une application web. Ici nous allons utiliser une technique surnommée “swarm” qui va permettre de déployer des groupes de conteneurs répartie sur plusieurs machines. On les appellera “services”.
À titre d'information notre infrastructure sera dans le même réseau logique dont les ces ports d'écoutes seront utilisé :
- 2377/TCP pour la gestion du cluster
- 4789/TCP ou UDP pour la communication entre les nœuds
- 4789/TPC ou UDP pour le flux réseau des conteneurs
On part du principe que ces machines ont qu'une seule interface réseau avec la distribution Debian 8.7 d'installé.
Pré-requis
Avant de poursuivre le tutoriel, installons les bon outils :
sudo curl -sSL get.docker.com |sh sudo curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
On définit l'utilisateur qui aura le droit de les utiliser :
sudo usermod -aG docker mon_utilisateur
Création du cluster
La seconde étape à suivre après avoir configuré nos machines et installé Docker, on doit initialiser un manager qui aura pour rôle de configurer, surveiller et répartir les conteneurs entre les différents nœuds ; Il aura le rôle d'ordonnanceur.
Initialisons swarm depuis le manager ayant l'IP 192.168.1.201 :
docker swarm init --advertise-addr 192.168.1.201
On obtient ce type de réponse dont le token est à conserver :
To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-3yav8q8oxd83oblkcdmncjt347mv75vtdr87r6qm0tsadvdzu1-dg044uheyryz66r4tslgap0i9 \ 192.168.1.201:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Comme indiqué plus haute sur le schéma, ces nœuds sont présentés physiquement par les serveurs (192.168.1.202 à 192.168.1.204) dont sur chacune d'elles : on lance la commande suivante pour les lier au manager :
docker swarm join --token SWMTKN-1-3yav8q8oxd83oblkcdmncjt347mv75vtdr87r6qm0tsadvdzu1-dg044uheyryz66r4tslgap0i9 192.168.1.201
Progressivement, on peut voir depuis le manager que les nœuds sont disponible :
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS i332al5j05psp5pnt090vp344 swarm3 Ready Active ktr5opwle2o6izyb3mwnqr5ot swarm4 Ready Active u514vq6ofmkcpqgwo1yucbzhk swarm2 Ready Active ug8m4woh6oi7vu3bi5jyhhjjk * swarm1 Ready Active Leader
Déployer des services
Une fois que nous avons notre cluster, on admet que nous avons besoin d'une infrastructure avec des serveurs web et d'une base de donnée :
- docker-compose.yml
version: '3' services: site: image: eboraas/apache-php ports: - "80:80" deploy: replicas: 3 bdd: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: mysql MYSQL_DATABASE: mysql
Pour ajouter d'autres directives, elles sont disponible dans la documentation de Docker.mon_projet_wordpress
Il suffira de lancer cette commande :
docker stack deploy -c docker-compose.yml mon_projet
On obtient ceci :
docker service ls
ID NAME MODE REPLICAS IMAGE 2rh7h98paewc mon_projet_site replicated 3/3 eboraas/apache-php:latest uvk05ebv8llq mon_projet_bdd replicated 1/1 mysql:5.7
Admettons que l'on souhaite dupliquer le service contenant une application web :
docker service scale mon_projet_site=10
Il y sera donc dupliqué 10 fois sur les différents nœuds :
docker service ps mon_projet_site
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS qvo50v6lp2nq mon_projet_site.1 eboraas/apache-php:latest swarm1 Running Running 3 hours ago kajgmo9qt6rf mon_projet_site.2 eboraas/apache-php:latest swarm1 Running Running about a minute ago ejtidxhj477f mon_projet_site.3 eboraas/apache-php:latest swarm1 Running Running about a minute ago xvzylw8kjv2a mon_projet_site.4 eboraas/apache-php:latest swarm3 Running Running about a minute ago varfjwehe1ku mon_projet_site.5 eboraas/apache-php:latest swarm2 Running Running about a minute ago jw2dfkt6596s mon_projet_site.6 eboraas/apache-php:latest swarm2 Running Running about a minute ago n547zl9yj8cr mon_projet_site.7 eboraas/apache-php:latest swarm1 Running Running about a minute ago msa8hxcxvs6z mon_projet_site.8 eboraas/apache-php:latest swarm2 Running Running about a minute ago aq2tx2kml5ic mon_projet_site.9 eboraas/apache-php:latest swarm3 Running Running about a minute ago vkfz0h53why4 mon_projet_site.10 eboraas/apache-php:latest swarm3 Running Running about a minute ago
Techniquement la répartition des conteneurs s'effectuent au niveau de la consommation mémoire. C'est pour cette raison que les conteneurs sont répartie sur les 3 première machine du cluster. Cette stratégie utilisé par défaut est appelé Spread.
Sur chacun des nœuds on peut voir en détail les conteneurs en exécution :
docker stack ps mon_projet
Si l'on souhaite se connecter à un conteneur pour exécuter une commande spécifique :
docker exec -it mon_projet_site.2.kajgmo9qt6rfw1gprwz590asx bash docker exec -it mon_projet_site.2.kajgmo9qt6rfw1gprwz590asx hostname
Pour se détacher du terminal, on tape les touches : <CTRL> + <P> puis en restant uniquement la touche enfoncé <CTRL>, faites <Q>.
Détruire le projet
Pour supprimer toute l'infrastructure d'un seul coup :
docker stack rm mon_projet
Détruire la liaison d'un nœud
Lorsqu'il n'y a plus de conteneurs en fonction sur le swarm4 par exemple. Il suffira d’exécuter ceci :
docker swarm leave
Depuis le manager, on obtient quelque chose du genre :
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS i332al5j05psp5pnt090vp344 swarm3 Ready Active ktr5opwle2o6izyb3mwnqr5ot swarm4 Down Active u514vq6ofmkcpqgwo1yucbzhk swarm2 Ready Active ug8m4woh6oi7vu3bi5jyhhjjk * swarm1 Ready Active Leader
Pour le supprimer définitivement, on doit utiliser son ID :
docker node rm ktr5opwle2o6izyb3mwnqr5ot