Docker : le quinzième pas.

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger).

Maintenant il me faut faire un script d’arrêt des containers, on va donc arrêter un container qui a le status à OK et qui a une charge de 0.

Voici le script que je propose, ce script permet en plus de fixer notre bug sur la précédente version 😉 .

#!/bin/bash
cd /docker/app/server/
i=0
flag="KO"
inodemax=0
inodestop=0
for inode in $(ls -R)
do
if
    [ -d $inode ]
then
    cd $inode 
    inodeval=$(echo $inode);
    status="KO"
    for filename in $(ls -R)
    do
	  if
	     [ -f $filename ]
	  then
	    if [ $filename = "status" ]
	      then
	      status=$(cat /docker/app/server/$inode/$filename)
	      load=$(cat /docker/app/server/$inode/load)
            fi	
          fi
    done	
    if [ $status = "OK" ]
      then
      echo "Status is OK for $inode"
      if [ $load = 0 ]	
	then 
	echo "Il n'y a pas de charge $load"
        flag="OK"	
        inodestop=$inodeval
      fi
    fi    
    cd /docker/app/server/
fi
done
if [ $flag = "OK" ]
  then
  echo "On va arreter ce containter : $inodestop";
  docker stop my-server7-$inodestop
  #Pour fixer notre bug ;)
  echo "KO" > /docker/app/server/$inodestop/status
fi
echo "Fin du script";

Et un petit test :

[root@localhost ~]# ./stop_container.bash 
Status is OK for 1
Il n'y a pas de charge 0
Status is OK for 2
Il n'y a pas de charge 0
Status is OK for 3
Il n'y a pas de charge 0
Status is OK for 4
Il n'y a pas de charge 0
Status is OK for 5
Il n'y a pas de charge 0
Status is OK for 6
Il n'y a pas de charge 0
On va arreter ce containter : 6
my-server7-6
Fin du script
[root@localhost ~]# ./stop_container.bash 
Status is OK for 1
Il n'y a pas de charge 0
Status is OK for 2
Il n'y a pas de charge 0
Status is OK for 3
Il n'y a pas de charge 0
Status is OK for 4
Il n'y a pas de charge 0
Status is OK for 5
Il n'y a pas de charge 0
On va arreter ce containter : 5
my-server7-5
Fin du script

Maintenant je place tous les scripts dans /docker/scripts/ (c’est plus propre que sous /root/)

[root@localhost ~]# mkdir /docker/scripts
[root@localhost ~]# cp *.bash /docker/scripts/.
[root@localhost ~]# ls /docker/scripts/
build_haproxy.bash  create_container.bash  stop_container.bash  test_load.bash  view_load.bash

Et je finalise mon script test_load.bash :

[root@localhost ~]# cat test_load.bash 
#!/bin/bash
cd /docker/app/server/
i=0
load=0
max=0
for inode in $(ls -R)
do
if
    [ -d $inode ]
then
    cd $inode 
    status="KO"
    for filename in $(ls -R)
    do
	  if
	     [ -f $filename ]
	  then
	    if [ $filename = "status" ]
	      then
	      status=$(cat /docker/app/server/$inode/$filename)
	      cload=$(cat /docker/app/server/$inode/load)	
	      cmax=$(cat /docker/app/server/$inode/max) 
            fi	
          fi
    done	
    if [ $status = "OK" ]
      then
      echo "Status is OK for $inode: max $cmax load $cload"
      load=`expr $load + $cload`
      max=`expr $max + $cmax`
    fi
    cd /docker/app/server/
fi
done
echo "La charge actuelle est de $load/$max";
pourc=$(( $load * 100 / $max))
 echo "$load/$max" >> /docker/scripts/log.txt
#On fixe le seuil à 0% ce qui est extrême on devrait surement mettre 25%
if [ $pourc -eq 0 ]
  then
  # On fixe le minimum à 10 ressources.
  if [ $max -gt 10 ]
     then
     logger -t CheckLoad "On n'a plus de charge on stoppe un container"
     echo "On peut arreter des containers";
     /docker/scripts/stop_container.bash
     echo "On refait la configuration de haproxy"
     /docker/scripts/build_haproxy.bash
     echo "On recharge haproxy"
     docker restart mon-haproxy-v15c
  fi
fi
#On fixe le seuil a 70% avant de lancer de nouveaux containers
if [ $pourc -gt 70 ]
  then
  logger -t CheckLoad "On a de la charge on lance un container"
  echo "On doit faire un nouveau container"
  /docker/scripts/create_container.bash
  echo "On refait la configuration de haproxy"
  /docker/scripts/build_haproxy.bash
  echo "On recharge haproxy"
  docker restart mon-haproxy-v15c  
fi
echo "Fin du script";

Et notre phase de test :

[root@localhost ~]# ./test_load.bash 
Status is OK for 1: max 5 load 0
Status is OK for 2: max 5 load 0
Status is OK for 3: max 5 load 0
La charge actuelle est de 0/15
On peut arreter des containers
Status is OK for 1
Il n'y a pas de charge 0
Status is OK for 2
Il n'y a pas de charge 0
Status is OK for 3
Il n'y a pas de charge 0
On va arreter ce containter : 3
my-server7-3
Fin du script
Fin du script
[root@localhost ~]# grep "CheckLoad" /var/log/messages 
Apr 16 15:20:44 localhost CheckLoad: On n'a plus de charge on stoppe un container

On passe donc ce script dans la crontab.

[root@localhost ~]# crontab -l
* * * * * /docker/scripts/test_load.bash

On lance notre logiciel de charge :

[root@localhost ~]# ./client_stress localhost 80
Start 
Nombre 500 le temps 2 
Nombre 1000 le temps 4 
Nombre 1500 le temps 6 
Nombre 2000 le temps 8 
Nombre 2500 le temps 13 
Nombre 3000 le temps 17 
Nombre 3500 le temps 22 
Nombre 4000 le temps 26 
Nombre 4500 le temps 30 
Nombre 5000 le temps 35 
Nombre 5500 le temps 39 
Nombre 6000 le temps 41 
Nombre 6500 le temps 46 
Nombre 7000 le temps 50 
Nombre 7500 le temps 54 
Nombre 8000 le temps 57 
Nombre 8500 le temps 64 
Nombre 9000 le temps 70 
^C
Vous avez du nouveau courrier dans /var/spool/mail/root
[root@localhost ~]# tail -f /docker/scripts/log.txt 
0/10
0/10
0/10
1/10
1/10
4/10
4/10

On ne peut pas dire que cela soit le gros stress, ce qui est normal car on n’a qu’une tâche qui fait le stress. On va donc faire un petit script pour un plus gros stress 😉 Voici le script que je vous propose, j’arrête après 120 secondes le test :

[root@localhost ~]# cat gros_stress.bash 
#!/bin/bash

timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 &
timeout 120 ./client_stress localhost 80 

echo "Fin de la charge"

Le résultat :

[root@localhost ~]# ./gros_stress.bash 
Start 
Start 
Start 
Start 
Start 
...
Nombre 1500 le temps 99 
Nombre 1500 le temps 119 
Fin de la charge
Vous avez du nouveau courrier dans /var/spool/mail/root

Les logs :

[root@localhost ~]# tail -f /docker/scripts/log.txt 
3/10
4/10
0/10
0/10
4/10
4/10
0/10
4/10
4/10
2/10

Visiblement j’ai un bugs 🙁 La charge ne monte jamais au dessus de 4 alors que j’ai 16 process en parallèle. Je vais donc passer sur la dernière version de serveur (server8) pour avoir plus d’information. Au passage je vais faire un script pour mettre le debug et le syslog à 0 sur tous les serveurs.

[root@localhost ~]# ./gros_stress.bash 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Start 
Nombre 500 le temps 6 
Nombre 500 le temps 6 
Nombre 500 le temps 7 
Nombre 500 le temps 8 
Nombre 500 le temps 8 
Nombre 500 le temps 8 
Nombre 500 le temps 8 
Nombre 500 le temps 8 
Nombre 500 le temps 8 
Nombre 500 le temps 8 
Nombre 500 le temps 8 
Nombre 500 le temps 8 
Nombre 500 le temps 8 
Nombre 1000 le temps 9 
Nombre 500 le temps 9 
Nombre 1000 le temps 9 
Nombre 1000 le temps 14 
Nombre 1000 le temps 15 
Nombre 1000 le temps 17 
Nombre 1000 le temps 18 
connect: Connection refused
connect: Connection refused
connect: Connection refused
connect: Connection refused
Nombre 1000 le temps 19 
Fin de la charge
Vous avez du nouveau courrier dans /var/spool/mail/root
Nombre 500 le temps 24 
Nombre 1000 le temps 27 
Nombre 1500 le temps 30 
Nombre 1000 le temps 32 
Nombre 2000 le temps 32 
Nombre 1500 le temps 33 
Nombre 1500 le temps 35 
Nombre 2500 le temps 35 
Nombre 2000 le temps 36 
Nombre 2000 le temps 37 
Nombre 3000 le temps 37 
Nombre 2500 le temps 40 
Nombre 1000 le temps 41 
Nombre 1000 le temps 42 
Nombre 2500 le temps 43 
Nombre 1500 le temps 51 
Nombre 3500 le temps 51 
Nombre 3000 le temps 59 
Nombre 1500 le temps 61 
Nombre 3000 le temps 72 
Nombre 1500 le temps 88 
Nombre 4000 le temps 88 
Nombre 2000 le temps 97 
Vous avez du nouveau courrier dans /var/spool/mail/root
Nombre 2000 le temps 110 
Nombre 4500 le temps 111

On observe une coupure du haxproxy ce qui est normal car on le relance, ensuite si on regarde les logs :

[root@localhost ~]# tail -f /docker/scripts/log.txt 
0/0
0/0
0/0
0/20
11/15
8/20
8/20
0/20
0/15
0/10

[root@localhost ~]# grep "CheckLoad" /var/log/messages | tail -n3
Apr 16 16:22:01 localhost CheckLoad: On a de la charge on lance un container
Apr 16 16:25:01 localhost CheckLoad: On n'a plus de charge on stoppe un container
Apr 16 16:26:01 localhost CheckLoad: On n'a plus de charge on stoppe un container


[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
dc75f255cd90        my-server7          "/sbin/server8"          8 minutes ago       Up 8 minutes        0.0.0.0:8087->80/tcp     my-server7-2
1f84fca3adf1        my-server7          "/sbin/server8"          8 minutes ago       Up 8 minutes        0.0.0.0:8086->80/tcp     my-server7-1
51b94f30c07e        my-haproxy-v15      "/docker-entrypoint.s"   5 hours ago         Up 7 minutes        0.0.0.0:80->80/tcp       mon-haproxy-v15c
2fc533c55725        postgres            "/docker-entrypoint.s"   44 hours ago        Up 44 hours         0.0.0.0:5432->5432/tcp   postgres2

Le point a régler c’est l’arrêt du haxproxy. Mais le but c’était de démontrer la facilité de monter et démonter un container. L’utilisation de script simplifie grandement la vie !

Un dernier script pour arrêter le mode débug et syslog sur tous les containers :

[root@localhost ~]# cat stop_debug.bash 
#!/bin/bash
cd /docker/app/server/
i=0
load=0
max=0
for inode in $(ls -R)
do
if
    [ -d $inode ]
then
    cd $inode 
    status="KO"
    for filename in $(ls -R)
    do
	  if
	     [ -f $filename ]
	  then
	    if [ $filename = "status" ]
	      then
	      status=$(cat /docker/app/server/$inode/$filename)
	      debug=$(cat /docker/app/server/$inode/debug)
	      syslog=$(cat /docker/app/server/$inode/syslog)	
            fi	
          fi
    done	
    if [ $status = "OK" ]
      then
      echo "Stop syslog ($syslog) et debug ($debug) sur $inode"
      echo 0 > /docker/app/server/$inode/debug	
      echo 0 > /docker/app/server/$inode/syslog 
    fi
    cd /docker/app/server/
fi
done
echo "Fin du script";

Le test comme toujours :

[root@localhost ~]# ./stop_debug.bash 
Stop syslog (1) et debug (1) sur 1
Stop syslog (1) et debug (1) sur 2
Fin du script
[root@localhost ~]# ./stop_debug.bash 
Stop syslog (0) et debug (0) sur 1
Stop syslog (0) et debug (0) sur 2
Fin du script

Normalement sur ses 15 jours de test de docker, j’ai pu vous faire partager de l’administration de docker, VirtualBox, Oracle Linux, HAproxy, PostgreSQL, …. Mais aussi de développement de script et de programme en C. Maintenant si j’ai le courage il va falloir faire un article propre. Je pense qu’un bon exemple simple est plus parlant pour justifier le bien fondé de nouvelle technologie.
Il me reste à voir le « docker commit », « docker push », « docker pull », ceci devrait permettre de voir l’avantage du déploiement sur docker. Mais aussi la répartition de charge entre deux serveurs Dockers.

Un petit schéma pour expliquer ce que l’on a mis en place :

  • une crontab (via un script) qui lance/arrête des containers en fonction de la charge. Cette crontab fait aussi la création du fichier de configuration de haxproxy et relance celui-ci.
  • un container haxproxy qui réparti la charge sur tous les containers server8.
  • des containers server8 qui utilisent le superbe protocole « Hello World » dont je devrais avoir des royalties ;). Et les serveurs utilisent un partage de fichier afin de remonter les informations de leur status à l’OS (Oracle Linux).

Capture d’écran 2016-04-29 à 11.46.02

Si vous êtes encore bloqué avec le problème du HAproxy qui ne répond pas, vous avez une première solution qui est de mettre trois HAproxy. Un premier HAproxy qui n’est jamais arrêté qui pointe sur deux autres HAproxy qui lisent la configuration et qui sont relancés à chacun son tour :). Mais la meilleure solution cela semble être la version HAproxy-LUA. La syntaxe doit être :

global
   lua-load mes-conteneurs.lua

listen proxy
   bind 127.0.0.1:80
   tcp-request inspect-delay 1s
   tcp-request content use-service lua.mes-conteneurs

Je suis pas encore un expert de HAproxy mais il doit exister plusieurs solutions à ce problème de coupure.

FX Foto Pro : Conversion de photo RAW en JPG

J’ai fait quelques tests avec une image RAW en CR2 d’un Canon.

Voici un test de FX Foto Pro Mac sur la conversion de RAW en JPG.On a une perte totale de la couleur de l’image … c’est un logiciel à fuir !

Capture d’écran 2016-04-28 à 22.12.16

Capture d’écran 2016-04-28 à 22.11.01

Voici donc le résultat :
testPar contre il existe un logiciel gratuit Fotor qui en plus fonctionne par BASH (donc on peut faire des répertoires) et fonctionne très bien.

Capture d’écran 2016-04-28 à 18.17.53 Capture d’écran 2016-04-28 à 18.18.04

par contre on a un petit carré de publicité mais c’est très léger.

Voici le résultat :
IMG_1852

Et une autre avec l’ajout d’un effet :

IMG_1852

 

Réalité (2015) par Quentin Dupieux

Je pense que certains films ne sont pas adapter au raisonnement trop cartésien (avec les films de Godard j’ai un peu le même problème). Et celui-ci est un bon exemple du film qu’il ne faut pas essayer de comprendre. Dans ce film la seule chose que je retiens c’est le scénario du film « Waves » : « les télés envoient des ondes qui abrutissent les gens dans un premier temps ». On n’est pas très loin de la réalité 😉 , en fait cela ma fait penser à une UNE de Charlie Hebdo.

Unknown

Par moment j’avais l’impression que Dupieux nous parlait de ses angoisses sur les détails ridicules dans un film. Et dans le film le détail ridicule est le cri …on a l’impression qu’il essaye de se comparer à Kubrick, avec son fameux « Kubrick mes couilles ». Cela dit je pense que certaines personnes aimeront ce film qui essaie de nous faire passer sans cesse du rêve à la réalité, et nous faire nous demander si on est dans le rêve ou la réalité. Pour finalement nous y perdre …

Quand ce film est sorti, je ne suis pas allé le voir. J’ai préféré voir Américan Snipper de Clint Eastwood. Finalement je ne regrette pas, le film de Clint Eastwood est une pure merveille.

Je vais mettre des mots clefs sur les films :

  • film pas pour moi.
  • film moyen.
  • film à voir.
  • film incontournable.

Docker : le quatorzième pas.

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger).

On va utiliser le fichier dynamique fait par ./build_haproxy.bash qui se trouve dans /docker/app/haproxy.cfg (merci de regarder l’épisode précédent n°13 afin de mieux comprendre). Pour le lancement de haxproxy la dernière fois que l’on a vu cela c’était dans le n°10 , la commande était alors :

docker run -d --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 -p 80:80 --name mon-haproxy-v15b my-haproxy-v15

Maintenant on n’a plus besoin de lien car les IP sont écrites par les serveurs eux-mêmes. On a seulement à faire un partage de fichier.

[root@localhost ~]# cat /docker/app/haproxy.cfg
global
    maxconn 400 
 
defaults
    log 127.0.0.1 local5 debug
    mode    tcp
    retries 4
    maxconn 200
    timeout connect  5000
    timeout client  50000
    timeout server  50000

frontend http-in
    bind *:80
    default_backend serveur

backend serveur
        mode tcp
        balance roundrobin
server server1 172.17.0.9:80
server server2 172.17.0.10:80
[root@localhost ~]# docker run -d -v /docker/app/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg -p 80:80 --name mon-haproxy-v15c my-haproxy-v15
51b94f30c07e4469cdb21039d67ad94e286baa184c195962dbfb1ad26d81ab5c
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
INTERFACE

172.17.0.10
QUIT
Connection closed by foreign host.
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
INTERFACE

172.17.0.9
QUIT
Connection closed by foreign host.

Conclusion : cela fonctionne ! Le fichier de configuration qui est généré par le script est bien pris en compte par le container haproxy. Pour demander la relecture du fichier de configuration, rien de plus simple :

[root@localhost ~]# docker restart mon-haproxy-v15c
mon-haproxy-v15c

Avec l’énorme inconvénient que toutes les sessions en cours sont perdus. Ensuite je travaillerai sur ce point, car on peut imaginer que ce système ne se lance qu’en cas d’urgence. Il faut faire le script qui va compter les sessions et prendre la decision de lancer un nouveau container et de lancer un container à l’arrêt.

Pour lancer un nouveau container rien de plus facile on cherche une inode disponible et un port disponible. Voici un script :

[root@localhost ~]# cat create_container.bash 
#!/bin/bash
cd /docker/app/server/
i=0
flag="KO"
inodemax=0
inodestop=0
for inode in $(ls -R)
do
if
    [ -d $inode ]
then
    cd $inode 
    inodeval=$(echo $inode);
    status="KO"
    for filename in $(ls -R)
    do
	  if
	     [ -f $filename ]
	  then
	    if [ $filename = "status" ]
	      then
	      status=$(cat /docker/app/server/$inode/$filename)
            fi	
          fi
    done	
    if [ $status = "KO" ]
      then
      echo "Status is KO for $inode"
      flag="OK"	
      inodestop=$inodeval
    fi    
    if [ $inodeval -gt $inodemax ]
      then
      inodemax=$inodeval
    fi
    cd /docker/app/server/
fi
done
if [ $flag = "KO" ]
  then
  echo "On na pas vu de container à l'arret on va donc un faire un nouveau le plus grand étant $inodemax";
  inodemax=`expr $inodemax + 1 `
  echo "Le nouveau sera donc le $inodemax ";
  mkdir /docker/app/server/$inodemax
  port=`expr 8085 + $inodemax `
  docker run -p $port:80 --link postgres2:postgres2 -v /docker/app/server/$inodemax:/app/server/ --name my-server7-$inodemax --log-driver=syslog --log-opt tag="my-server7-$inodemax"  -d my-server7
fi
if [ $flag = "OK" ]
  then
  echo "On a vu un container à l'arret on va donc le lancer : $inodestop";
  docker start my-server7-$inodemax
fi
echo "Fin du script";

Et maintenant le test :

[root@localhost ~]# ./create_container.bash 
On na pas vu de container à l'arret on va donc un faire un nouveau le plus grand étant 4
Le nouveau sera donc le 5 
50dc9fbd7890d24ca0453878134469627116181adc26e56a86661dc879fb7466
Fin du script
[root@localhost ~]# ./create_container.bash 
On na pas vu de container à l'arret on va donc un faire un nouveau le plus grand étant 5
Le nouveau sera donc le 6 
b7edb8b9405d5f6665505e36b5179172201260a1eecf06446abaf9cb6256bc05
Fin du script
[root@localhost ~]# ./create_container.bash 
On na pas vu de container à l'arret on va donc un faire un nouveau le plus grand étant 6
Le nouveau sera donc le 7 
f806c2ed062c0f1bc5a105923b3e2b410d3cfc656bbaa329c8f55c47e4ca736b
Fin du script
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
f806c2ed062c        my-server7          "/sbin/server7"          14 seconds ago       Up 14 seconds       0.0.0.0:8092->80/tcp     my-server7-7
b7edb8b9405d        my-server7          "/sbin/server7"          15 seconds ago       Up 15 seconds       0.0.0.0:8091->80/tcp     my-server7-6
50dc9fbd7890        my-server7          "/sbin/server7"          18 seconds ago       Up 18 seconds       0.0.0.0:8090->80/tcp     my-server7-5
4ec165c67c25        my-server7          "/sbin/server7"          40 seconds ago       Up 40 seconds       0.0.0.0:8089->80/tcp     my-server7-4
bdf7cd9d64a7        my-server7          "/sbin/server7"          About a minute ago   Up About a minute   0.0.0.0:8088->80/tcp     my-server7-3
51b94f30c07e        my-haproxy-v15      "/docker-entrypoint.s"   About an hour ago    Up About an hour    0.0.0.0:80->80/tcp       mon-haproxy-v15c
cf1110c0f435        my-server7          "/sbin/server7"          4 hours ago          Up 4 hours          0.0.0.0:8087->80/tcp     my-server7-2
c6181abdea21        my-server7          "/sbin/server7"          4 hours ago          Up 4 hours          0.0.0.0:8086->80/tcp     my-server7-1
2912a5b6f004        my-server6          "/sbin/server6"          13 hours ago         Up 13 hours         0.0.0.0:8085->80/tcp     my-server6-1
a814b5991a87        my-server5          "/sbin/server5"          14 hours ago         Up 14 hours         0.0.0.0:8084->80/tcp     my-server4-5
eb76431e86e0        my-server5          "/sbin/server5"          17 hours ago         Up 17 hours         0.0.0.0:8083->80/tcp     my-server4-4
1e87ae6b009b        my-server5          "/sbin/server5"          17 hours ago         Up 17 hours         0.0.0.0:8082->80/tcp     my-server4-3
5b9099ae80d0        my-server5          "/sbin/server5"          17 hours ago         Up 17 hours         0.0.0.0:8081->80/tcp     my-server4-2
4fb8f79456af        my-server5          "/sbin/server5"          17 hours ago         Up 17 hours         0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   39 hours ago         Up 39 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker stop my-server7-6
my-server7-6
[root@localhost ~]# ./create_container.bash 
On na pas vu de container à l'arret on va donc un faire un nouveau le plus grand étant 7
Le nouveau sera donc le 8 
d85bf7ea1bf7497312a2c27c9438bc4d8c7e695f85984b7cf1f9880f9098cf69
Fin du script
1460804275
[root@localhost ~]# cat /docker/app/server/6/status
OK
[root@localhost ~]# cat /docker/app/server/6/time
1460804219
[root@localhost ~]# cat /docker/app/server/6/time
1460804219
[root@localhost ~]#

Visiblement le « status » n’est pas à KO quand il est arrêté via la commande docker propre (après le stop du my-server7-6 je n’aurais pas du avoir la création du n°8). Il va donc falloir utiliser le temps afin de voir que tout fonctionne bien.

Mais avant cela je vous propose un instant méditation : Pensez-vous qu’il soit aussi facile avec VM Ware de déployer 3 serveurs ? Et ceci via une ligne de commande ? Pensez-vous qu’il soit aussi facile de prendre en compte ses nouveaux serveurs via un script fait en quelques minutes ? En plus de faire un déploiement cette ligne de commande fait aussi un partage de fichier, pour avoir l’équivalent avec VM Ware il faudrait monter un serveur SAMBA. Il nous reste encore à voir les autres grands avantages à savoir la mise à jour automatique, la répartition de charge entre serveurs dockers. Et l’autre avantage c’est de pouvoir faire un script qui permet par exemple de mettre tous les serveurs en mode débug. Je pense que cela commence à vous plaire, moi aussi 🙂 . Mais aussi on pourrait parler de l’espace disque :

[root@localhost ~]# docker history my-server7
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
b3b4e7faef2f        6 hours ago         /bin/sh -c #(nop) CMD ["/sbin/server7"]         0 B                 
0ca55d5c158d        6 hours ago         /bin/sh -c #(nop) EXPOSE 80/tcp                 0 B                 
7c369e74da08        6 hours ago         /bin/sh -c dnf install postgresql -y            162.6 MB            
d111ddce9aa0        6 hours ago         /bin/sh -c #(nop) COPY file:bffd0481c43858dd3   23.47 kB            
bb6bc55cbbfc        41 hours ago        /bin/sh -c #(nop) MAINTAINER toto toto@cyber-   0 B                 
ddd5c9c1d0f2        6 weeks ago         /bin/sh -c #(nop) ADD file:bcb5e5cddd4c4d1cac   204.7 MB            
           6 weeks ago         /bin/sh -c #(nop) MAINTAINER Patrick Uiterwij   0 B    

On doit être dans les 400 Mo, la même chose avec VM Ware et on est dans les 2 Go…On arrête l’instant méditation ;).

Maintenant je vais proposer une version server8 (server8.c) qui écrit KO ! pour cela je vais utiliser la fonction atexit(). Par contre je vais appeler cette version server7 afin de montrer l’utilité de la version dans le fichier dynamique. J’en profite aussi pour ajouter un nouveau fichier dynamique qui indique le nombre de client traité et un fichier dynamique error permettant d’avoir le code de sortie.

server8 : le source du programme (j’arrête les copies directes dans WordPress car cela commence a être volumineux).

Compilation et test :

[root@localhost ~]# gcc -o server8 server8.c -lpq
[root@localhost ~]# ./server8 
Default interface is : enp0s3 
Local ip is : 192.168.10.159 
POSTGRES2_PORT_5432_TCP_ADDR : (null) 
Stdout is descriptor 1
Stderr is descriptor 2
Stdout is descriptor 1
Stderr is descriptor 2
OK : Table STATISTIQUE 
^CFin du programme
[ END : CTRL-C]

[root@localhost ~]# cat /app/server/status
KO[root@localhost ~]# cat /app/server/error
11

Parfait cela fonctionne ! Maintenant je vais déployer cette superbe version, on s’approche de la version « gold » 😉 . Attention cette fois je fais mettre la version 8 dans le my-server7 .

[root@localhost ~]# cat Dockerfile
FROM fedora
MAINTAINER toto toto@cyber-neurones.org 
COPY ./server8 /sbin/server8
RUN dnf install postgresql -y
# Le port en ecoute 
EXPOSE 80 
# Pour lancer postgres 
CMD ["/sbin/server8"]

[root@localhost ~]# docker build -t my-server7 .
Sending build context to Docker daemon 380.9 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> bb6bc55cbbfc
Step 3 : COPY ./server8 /sbin/server8
 ---> bce16fb36408
Removing intermediate container d7411590d297
Step 4 : RUN dnf install postgresql -y
 ---> Running in ca2051c554ae
....
Complete!
 ---> b4511089849d
Removing intermediate container 06ba37adc88b
Step 5 : EXPOSE 80
 ---> Running in 9a94125adc6b
 ---> a1834ef7e456
Removing intermediate container 9a94125adc6b
Step 6 : CMD /sbin/server8
 ---> Running in 9a1a3c3e7dbe
 ---> 2dbb7ecbdaa1
Removing intermediate container 9a1a3c3e7dbe
Successfully built 2dbb7ecbdaa1

La suite demain 😉
Pour finir le squelette du script qui va être dans la crontab :

[root@localhost ~]# cat test_load.bash 
#!/bin/bash
cd /docker/app/server/
i=0
load=0
max=0
for inode in $(ls -R)
do
if
    [ -d $inode ]
then
    cd $inode 
    status="KO"
    for filename in $(ls -R)
    do
	  if
	     [ -f $filename ]
	  then
	    if [ $filename = "status" ]
	      then
	      status=$(cat /docker/app/server/$inode/$filename)
	      cload=$(cat /docker/app/server/$inode/load)	
	      cmax=$(cat /docker/app/server/$inode/max) 
            fi	
          fi
    done	
    if [ $status = "OK" ]
      then
      echo "Status is OK for $inode: max $cmax load $cload"
      load=`expr $load + $cload`
      max=`expr $max + $cmax`
    fi
    cd /docker/app/server/
fi
done
echo "La charge actuelle est de $load/$max";
pourc=$(( $load * 100 / $max))
if [ $pourc -eq 0 ]
  then
  if [ $max -gt 10 ]
     then
     echo "On peut arreter des serveurs";
     # script a écrire
     # on refait la conf de haproxy et on relance.
  fi
fi
if [ $pourc -gt 70 ]
  then
  echo "On doit faire un nouveau container"
  # create_container.bash
  echo "On refait la configuration de haproxy"
  # build_haproxy.bash
  echo "On recharge haproxy"
  # docker restart mon-haproxy-v15c
fi
echo "Fin du script";
[root@localhost ~]# ./test_load.bash 
Status is OK for 1: max 5 load 0
Status is OK for 2: max 5 load 0
Status is OK for 3: max 5 load 0
Status is OK for 4: max 5 load 0
Status is OK for 5: max 5 load 0
Status is OK for 6: max 5 load 0
Status is OK for 7: max 5 load 0
Status is OK for 8: max 5 load 0
La charge actuelle est de 0/40
On peut arreter des serveurs
Fin du script

Il nous faut donc écrire le script d’arrêt d’un container.