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 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.
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.
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
Pour initialiser notre cluster swarm, il y a 3 étapes :
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
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)
Les sources sont sur Github et les containers publiés sur le Docker Hub.
eval "$(docker-machine env leader1)"
docker network create -d overlay swarmnet
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.
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)
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)
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 :
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
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.
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 :
A suivre …