Table des matières

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é :

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