Aller au contenu

🐋 Prise en main de Docker Swarm

dockersarwm

Déploiement d'un conteneur de test Apache2

Déploiement avec Docker service

La commande Docker service est un peu l'équivalent de Docker run.

Dans cet exemple, nous allons définir et lancer le service "apache" avec comme caractéristiques :

  • le nom de l'image "httpd:latest"
  • le conteneur est répliqué 3 fois
  • Un redémarrage du conteneur si celui-ci s'arrête de manière imprévue comme dans le cas d'une erreur
  • Une limitation de la mémoire à 50 Mo.
  • On publie le port 8080 mappé au port exposé 80
Création du service
olivier@ds01:~$ docker service create --name apache \
> --replicas 3 \
> --publish published=8080,target=80 \
> --restart-condition=on-failure \
> --limit-memory 50M \
> httpd:latest
# Sortie
t0ykfwnyshw0tyvrr1xe3vftt
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service t0ykfwnyshw0tyvrr1xe3vftt converged 

Afficher l'état de notre service :

État du service
olivier@ds01:~$ docker service ls
ID             NAME                MODE         REPLICAS   IMAGE                    PORTS
t0ykfwnyshw0   apache              replicated   3/3        httpd:latest             *:8080->80/tcp

Lister les différentes tâches de votre service permettant de vérifier par exemple l'état des tâches et sur quel nœud s'exécutent-elles.

État des tâches
olivier@ds01:~$ docker service ps apache
ID             NAME       IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
d0xc57hh7k3z   apache.1   httpd:latest   ds01      Running         Running 7 minutes ago             
l55osthxhym7   apache.2   httpd:latest   ds03      Running         Running 7 minutes ago             
ud0ma60zf70s   apache.3   httpd:latest   ds04      Running         Running 8 minutes ago             
Note : ici on constate que le manager fait aussi office de worker.

Arrêter le service :

olivier@ds01:~$ docker service rm apache
apache

Déploiement avec Docker stack

La commande Docker stack est en quelque sorte l'équivalent de Docker compose. Tout comme cette dernière, elle se base sur un fichier très proche d'un docker-compose.yml que l'on nommera par convention docker-stack.yml.

La commande stack permet de regrouper un ensemble de services. On peut cependant ne lancer qu'un seul service.

Répertoire NFS

Dans cet exemple j'ai créé un partage NFS monté sur l'ensemble des noeuds afin de founir un stockage persistant et partagé. Nous verrons cela dans un autre chapitre.

Reprenons notre exemple avec Apache. Voici le fichier de configuration du service que j'ai placé dans /mnt/nfsdatas/apache2.

docker-stack.yml
services:
  apache:
    image: httpd:latest
    ports:
    - '8080:80'
    volumes:
    - /mnt/nfsdatas/apache2/website:/usr/local/apache2/htdocs
    deploy:
      replicas: 3
      resources:
        limits:
          memory: 50M
      restart_policy:
        condition: on-failure

J'ai créé un fihier html dans /mnt/nfsdatas/apache2/website :

index.html
<HTML>
 <HEAD>
  <TITLE>Test apache2</TITLE>
 </HEAD>
 <BODY>
  <p>Coucou depuis Apache2 sur <b>Docker Swarm</b></p>
 </BODY>
</HTML>
Lancement du service :
olivier@ds01:/mnt/nfsdatas/apache2$ docker stack deploy -c docker-compose.yml -d apache
Creating network apache_default
Creating service apache_apache

Afficher l'état de notre service :

État du service
olivier@ds01:/mnt/nfsdatas/apache2$ docker stack services apache
ID             NAME            MODE         REPLICAS   IMAGE          PORTS
yrunr8xrbzux   apache_apache   replicated   3/3        httpd:latest   *:8080->80/tcp

Lister les différentes tâches de votre service permettant de vérifier par exemple l'état des tâches et sur quel nœud s'exécutent-elles.

État des tâches
olivier@ds01:/mnt/nfsdatas/apache2$ docker stack ps apache
ID             NAME              IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
qvklqr7u9ozf   apache_apache.1   httpd:latest   ds01      Running         Running 2 minutes ago             
ptraozleopnu   apache_apache.2   httpd:latest   ds03      Running         Running 2 minutes ago             
nuvkkxe7sufq   apache_apache.3   httpd:latest   ds04      Running         Running 2 minutes ago             

Exemple avec Traefik et Whoami
olivier@ds01:~$ docker stack services mastack 
ID             NAME              MODE         REPLICAS   IMAGE                   PORTS
wrudg6v94e6d   mastack_traefik   replicated   1/1        traefik:v3.0.0          *:80->80/tcp, *:443->443/tcp
adkmru5y8g4s   mastack_whoami    replicated   1/1        traefik/whoami:latest   
olivier@ds01:~$ docker stack ps mastack 
ID             NAME                IMAGE                   NODE      DESIRED STATE   CURRENT STATE         ERROR     PORTS
21ucx2kp72is   mastack_traefik.1   traefik:v3.0.0          ds01      Running         Running 9 hours ago             
sh84bf2yezry   mastack_whoami.1    traefik/whoami:latest   ds03      Running         Running 9 hours ago 

Reprenons notre exemple avec Apache et requêtons notre application sur l'ensemble des noeuds :

olivier@ds01:/mnt/nfsdatas/apache2$ for i in 2 3 4 5; do echo "----------------"; \
> echo "Requête vers 10.1.4.${i}"; \
> echo "----------------"; \
> curl http://10.1.4.${i}:8080; done
----------------
Requête vers 10.1.4.2
----------------
...
<p>Coucou depuis Apache2 sur <b>Docker Swarm</b></p>
...
----------------
Requête vers 10.1.4.3
----------------
...
<p>Coucou depuis Apache2 sur <b>Docker Swarm</b></p>
...
----------------
Requête vers 10.1.4.4
----------------
...
<p>Coucou depuis Apache2 sur <b>Docker Swarm</b></p>
...
----------------
Requête vers 10.1.4.5
----------------
...
<p>Coucou depuis Apache2 sur <b>Docker Swarm</b></p>
...
On remarque ici que le noeud ds02 (10.1.4.3) a répondu alors qu'il n'exécute pas la tâche rattachée au service apache. C'est le sujet du point suivant.