Docker Swarm par l’exemple

Docker Swarm est l’outil proposé par Docker pour assurer la gestion de clusters Docker, le routage, la scalabilité, … Je vous propose quelques exemples mettant en oeuvre Virtualbox, AWS, Azure et OVH.

Voici les liens vers toute la série :

Docker-Compose

Docker propose depuis longtemps déjà docker-compose qui offre la possibilité de “composer” un ensemble de container sur une seule et même machine, mais également de “scaler” les containers toujours sur un même serveur.

Docker Swarm

Mais comment orchestrer un ensemble de containers non plus sur un seul serveur, mais répartis sur plusieurs serveurs ? Plusieurs alternatives s’offrent à nous, Apache Mesos, Google Kubernetes, CoreOS, RancherOS, entre autres. Docker se devait de proposer son alternative en améliorant la version existante de Docker Swarm et c’est ce qui a été fait avec la version 1.12.

Un exemple de Docker Swarm avec Virtualbox

Le plan de bataille de création du cluster docker swarm :

  • Créer 3 machines virtuelles avec la commande docker-machine
    • 1 VM leader (machine docker swarm qui “héberge” le système de discovery des services docker)
    • 2 VM worker (machine docker swarm qui participent à l’hébergement des services)
  • Créer un réseau d’échange au sein du cluster docker swarm (optionel)
  • Démarrer les services de container au sein du cluster
  • Vérifier les communications
  • Scaler le service en démarrant de nouvelles instances de containers Docker

Les commandes docker

Création des VM Virtalbox avec docker-machine

Nous allons donc démarrer la création de 3 VM Virtualbox, un leader et 2 workers :

docker-machine create \
      --engine-env 'DOCKER_OPTS="-H unix:///var/run/docker.sock"' \
      --driver virtualbox \
leader1
docker-machine create \
      --engine-env 'DOCKER_OPTS="-H unix:///var/run/docker.sock"' \
      --driver virtualbox \
worker1
docker-machine create \
      --engine-env 'DOCKER_OPTS="-H unix:///var/run/docker.sock"' \
      --driver virtualbox \
worker2

Démarrage du cluster docker swarm

Pour initialiser notre cluster swarm, il y a 3 étapes :

  • l’init du leader docker swarm
  • la récupération du token de sécurité swarm
  • le connexion des workers au leader docker swarm avec la commande docker swarm join
eval "$(docker-machine env leader1)"

docker swarm init \
	--listen-addr $(docker-machine ip leader1) \
	--advertise-addr $(docker-machine ip leader1)

token=$(docker swarm join-token -q worker)

eval "$(docker-machine env worker1)"
docker swarm join --token $token $(docker-machine ip leader1):2377
eval "$(docker-machine env worker2)"
docker swarm join --token $token $(docker-machine ip leader1):2377

Mise en oeuvre de services docker swarm

Pour cet exemple de mise en oeuvre du cluster Docker swarm, je vous propose une stack web composée de 4 services :

![docker swarm webstack service](/images/docker/docker swarm webstack.jpg)

  • un loadbalancer Haproxy
  • un cache web Varnish
  • un serveur web H2O
  • un serveur d’application php7

Les sources sont sur Github et les containers publiés sur le Docker Hub.

Création d’un réseau dédié (optionel)

eval "$(docker-machine env leader1)"
docker network create -d overlay swarmnet

Démarrage des services de notre stack web

Pour démarrer les différents services la version docker 1.12 nous offre la commande docker service create :

docker service create \
	--name phpfpm \
	--network swarmnet \
	--publish 9000:9000 \
itwars/phpfpm
docker service create \
	--name web \
	--network swarmnet \
	--publish 8001:8001 \
itwars/h2o
docker service create \
	--name cache \
	--network swarmnet \
	--publish 8000:8000 \
itwars/varnish
docker service create \
	--name lb \
	--network swarmnet \
	--publish 80:80 \ 
itwars/haproxy

Dès que nous activons nos services docker, les logs s’affichent dans la console, car j’ai configuré haproxy pour qu’il fasse un GET HTTP à intervalle régulier, de même pour varnish.

Visualisation de notre cluster et de la stack de services

Il existe un outil sympathique qui permets de visualiser le cluster docker swarm ainsi créé et de visualiser les containers qui sont déployés dans le cluster. Nous allons démarrer ce container sur le leader1 :

docker run -it -d -p 5000:5000 \
	-e HOST=$(docker-machine ip leader1) \
	-e PORT=5000 \
	-v /var/run/docker.sock:/var/run/docker.sock \
manomarks/visualizer

Taper la commande :

docker-machine ip leader1

Vous obtiendrez l’adresse ip du leader. Maintenant ouvrez votre navigateur préféré avec l’url suivant : http://[ip leader]:5000

![docker swarm en action](/images/docker/docker swarm.jpg)

Test de scalabilité du service web

Nous allons maintenant demandé une augmentation des ressources web avec la commande docker service scale :

eval $(docker-machine env leader1)
docker service scale web=10

![docker swarm scale](/images/docker/docker swarm scale.jpg)

Test de load balancing du cluster swarm

Nous avons plusieurs instances de notre serveur web, nous allons saisir dans notre navigateur l’url suivant : http://[ip leader]. La page afficher indique le hostname du serveur web qui a répondu et affiche le résultat de la commande phpinfo().

Si vous rafraichissez la page plusieurs fois vous allez constater que le hostname change en fonction du serveur qui répond.

Donc, on peut en déduire plusieurs éléments :

  • le cluster réparti bien les requêtes au sein des instances web
  • le leader a bien collecté les informations des nouveaux services web démarrés avec la commande docker service scale
  • pour finir on peut réaliser la même action en entrant dans l’url l’ip de n’importe quel membre du cluster swarm, qu’il soit leader ou worker.

Nettoyage et suppression du cluster

eval "$(docker-machine env leader1)"
docker service rm lb cache web phpfpm
docker rmi itwars/h2o itwars/varnish itwars/haproxy itwars/phpfpm

eval "$(docker-machine env worker2)"
docker swarm leave
eval "$(docker-machine env worker1)"
docker swarm leave
eval "$(docker-machine env leader1)"
docker swarm leave --force

docker-machine rm worker2 --force
docker-machine rm worker1 --force
docker-machine rm leader1 --force

Script de mise en cluster et sources de l’exemple docker swarm

L’ensemble des sources et l’automatisation de cet exemple de mise en oeuvre d’un cluster de services docker swarm est disponible sur Github.

Conclusion sur docker swarm et les prochaines étapes

Voilà pour la démonstration avec Virtualbox. La version docker 1.12 ajoute énormément de fonctionnalités, mais pas encore un équivalent abouti de docker-compose. Dans les prochains articles je vais vous proposer de poursuivre nos tests avec :

  • un exemple de Docker Swarm avec AWS
  • un exemple de Docker Swarm avec Azure
  • un exemple de Docker Swarm avec OVH Public Cloud

A suivre …