TUTOS.EU

Docker et les microservices

Comme expliqué sur ce lien MS,

une architecture en microservices est une approche de la création d’une application serveur sous la forme d’un ensemble de petits services.
Chaque service s’exécute dans son propre processus et communique avec d’autres processus avec des protocoles comme HTTP/HTTPS, WebSockets ou AMQP etc ... 

Bon je vous laisse lire le pavé.

Bon en gros, de ma perception, on essaye de mettre un élément minimaliste par conteneur, on emboite les conteneurs comme des légos et on les fait communiquer ensemble pour avoir une architecture flexbile.

 

Pour comprendre on va appliquer l'exemple de xavki.

Il demande de créer 3 conteneurs :

  • 1 avec un serveur web nginx qui sera chargé d'afficher la page
  • 2 avec php pour modifier les variables affichées par la page

Et bien chaque conteneur sera un microservice.

Le conteneur web avec nginx permettra de communiquer avec l'extérieur pour afficher la page via le port 80, les 2 autres conteneurs vont avoir pour tâche, via un script, de faire évoluer une variable, et ils communiqueront tous ensemble au travers de fichiers qui seront dans un répertoire commun : 

					/var/www/html/

Le conteneur web avec nginx va être créé avec un dockerfile dont le contenu va donné ci-dessous.

Dans le détail, la commande Volume va permettre aux conteneurs d'avoir un répertoire de travail commun.
Entrypoint permet d'indiquer le premier processus à lancer avec le conteneur, ici nginx.
Comme on veut que cela soit le conteneur qui gère nginx et non le daemon de base, on ajoute la commande daemon off.

FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y nginx
VOLUME /var/www/html/
ENTRYPOINT ["nginx", "-g", "daemon off;"]
Lien vers le fichier : cliquez ici

les workers php vont faire tourner 2 scripts.
rollon.sh va calculer les variables
affichage.php va mettre à jour index.html

Les commandes copy prennent les fichiers sur la machine locale, dans le même répertoire que le dockerfile.

FROM php:7.2-cli
COPY rollon.sh /
COPY affichage.php /
RUN chmod 755 /rollon.sh
ENTRYPOINT ["./rollon.sh"]
Lien vers le fichier : cliquez ici

Le script rollon.sh va incrémenter une variable x.
le résultat va être stocké dans un fichier worker1.txt

#!/bin/bash
x=1
while true
do
echo $x > /var/www/html/worker1.txt
((x=x+100))
php /affichage.php
sleep 10
done
Lien vers le fichier : cliquez ici

Le script affichage.php va récupérer les valeurs qui sont dans worker1.txt et worker2.txt
puis il va modifier index.html

<?php
$file1='/var/www/html/worker1.txt';
$file2='/var/www/html/worker2.txt';
$Data1="";
$Data2="";

# worker1 data
if (file_exists($file1)) {
$fh = fopen($file1,'r');
while ($line = fgets($fh)) {
  $worker1 = $line;
}
fclose($fh);
}

# affichage
$File = "/var/www/html/index.html";
$Handle = fopen($File, 'w');
$Data1 = "worker 1 vaut ".$worker1."\n";
fwrite($Handle, $Data1);
$Data2 = "worker 2 vaut ".$worker2."\n";
fwrite($Handle, $Data2);
fclose($Handle);
Lien vers le fichier : cliquez ici

On va télécharger et décompresser les sources de l'exemple avec

apt-get install zip
cd
wget https://tutos.eu/vault/1213myapp.zip
unzip 1213myapp.zip
cd myapp
ls -l
Lien vers le fichier : cliquez ici

Vous devez voir quelque chose comme ceci :

Pour créer les workers, taper

cd worker1
docker build -t worker1 .
cd ..
cd worker2
docker build -t worker2 .
docker image ls
Lien vers le fichier : cliquez ici

Vous devez voir les 2 images

On construit l'image du serveur web et on le lancer avec

cd ..
cd serveurweb
docker build -t serveurweb .
docker run -tid -p 80:80 --name site serveurweb
Lien vers le fichier : cliquez ici

De là si vous entrez http:<l'ip de votre machine qui héberge docker> comme je ne sais pas moi http://192.168.0.25
nginx doit répondre

Maintenant lancez les workers php en indiquant que l'on veut utiliser le volume créé dans l'image du serveur web, cad /var/www/html/
On avait donné le nom 'site' à ce conteneur web.

docker run -tid --name worker1 --volumes-from site worker1
docker run -tid --name worker2 --volumes-from site worker2
Lien vers le fichier : cliquez ici

A cette étape si on entre la commande docker ps
on doit voir 3 conteneurs :
_ worker1
_ worker2
_ site

Et là si vous accédez de nouveau au site fourni par nginx, en premier affichage vous avez ceci, mais à chaque refresh les valeurs changent.

Téléchargement(s)

NomSite Web d origineDescription
1213myapp.zip https://gitlab.com/xavki/prese... Sources pour l'exemple de microservices de xavki


Article(s) précédent(s)