Faire des trucs #2 : Docker-compose pour scaler une appli web

Julien
Get news

Julien

Ingénieur de production
Backpacker quand la prod n'est pas down.
Curieux de nature, j'aime bien "faire des trucs" tech-related avec mes amis.
Si tu m'embêtes je t'automatise en Bash.
Julien
Get news

Git de l’article

Il existe des Hello World plus ou moins simples. Lorsqu’on parle de scaler une application (mettre à l’échelle pour servir plus d’utilisateurs, Scalability), le cas classique est le suivant :


On souhaite créer une application simple permettant de compter les pings (requêtes vers une URL spécifique) qu’elle a reçu. Il faut donc mettre en place une API Rest qui sera interrogée par les utilisateurs et un mécanisme de stockage pour le nombre de ping.

L’API devra implémenter deux URL :

/ping : incrémente le nombre de ping, renvoi le nom du serveur applicatif qui a traité la requête.

/total : renvoi le nombre de ping reçus

J’utiliserai Python 3.5 et Flask pour la partie applicative. Concernant le stockage, il s’agit de mémoriser une valeur qui est modifiée régulièrement, Redis est une base de données particulièrement adaptée à ce cas d’usage.

 

Il suffit de lancer le programme ci-contre pour avoir l’API disponible sur les interfaces de son ordinateur.

Il faut aussi démarrer un serveur Redis en faisant dans un autre terminal :

redis-server

Vous pouvez ensuite interroger l’API via cURL :

curl 127.0.0.1:5000/ping

curl 127.0.0.1:5000/total

 

Oui mais la on scale rien du tout en fait.

 

 

 

C’est vrai, pour scaler l’application qu’on vient de créer, on va ajouter des serveurs applicatifs. Ils seront identiques et communiqueront avec le même serveur Redis. Il nous faudra également un répartiteur de charge (Load Balancer) qui distribuera les requêtes des utilisateurs sur les serveurs. J’utiliserai HAproxy pour ça.

Scaler manuellement en ajoutant des serveurs applicatifs n’est pas pratique. De même que le déploiement de notre application. Il s’agit donc de trouver un moyen de packager et d’automatiser le déploiement. J’ai choisi d’utiliser Docker-compose.

Docker-compose repose sur 4 fichiers : le Dockerfile, docker-compose.yml, requierements.txt et le programme applicatif.

DockerFile : lance le programme dans les containeurs applicatifs, définit le port d’écoute des containeurs applicatifs.

docker-compose.yml : définit les containeurs qui seront lancés et leurs paramêtres.

requirements.txt : les containeurs applicatifs vont installer (via pip) les paquets définis dans ce fichier.

app.py : le code qui sera exécuté par les containeurs applicatifs.

 

Tout est prêt, il nous reste à build et démarrer notre application :

docker-compose up –build –scale app=2

–scale app=2  signifie qu’on souhaite créer 2 containeurs applicatifs.

Demo time !

 

Une fois qu’on a terminé avec notre application, on l’arrête en faisant :

docker-compose down

Git de l’article ou vous retrouverez la marche à suivre pour ce Hello World 🙂

Gif créé grâce à RecordIt.co
Schémas créés grâce à Draw.io

_______________________
Sharing is caring😜
Share on FacebookTweet about this on TwitterShare on LinkedIn


Comments