🐋 Prise en main de Docker Swarm
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
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 :
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.
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
Arrêter le service :
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
.
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
:
<HTML>
<HEAD>
<TITLE>Test apache2</TITLE>
</HEAD>
<BODY>
<p>Coucou depuis Apache2 sur <b>Docker Swarm</b></p>
</BODY>
</HTML>
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 :
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.
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
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>
...
apache
. C'est le sujet du point suivant.