11 KiB
# TP Déploiement d'applications sur Swarm
Déployer l'application en tant que services sur le cluster.
Déployer l'application en tant que stack sur le cluster.
1 - Services Swarm
Déployer l'application sous forme de service Swarm.
Gestion des images
-
Pour déployer l'application sur tout le cluster il faut que l' image
web:1
soit accessible depuis tous les noeuds du cluster. Une solution serait d'héberger l'image sur un registry. -
Ici nous allons simplement utiliser
docker save/load
. -
Sur la première VM, archiver l'image
web:1
. -
Transférer l'archive sur la seconde VM.
-
Importer l'image dans docker sur la deuxième VM.
Sur la machine docker-1
:
$ docker save -o web.tar web:1
$ scp web.tar docker@<ip-docker-2>:/home/docker/.
Sur la machine docker-2
:
$ docker load -i web.tar
$ docker image ls
-
Créer un réseau distribué nommé
swarm-formation
de typeoverlay
. -
Vérifier la création du réseau.
Créer le réseau swarm-formation
:
$ docker network create --driver overlay swarm-formation
xdggd0hncm2srhti5cq9pwoc0
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
...
xdggd0hncm2s swarm-formation overlay swarm
...
-
Déployer un volume de données distant de type NFS
-
Installer un serveur NFS sur la première VM.
-
Installer un client NFS sur la seconde VM.
-
Créer un Volume Docker nommé
mariadb-nfs
qui utilise le partage NFS/var/nfs-export
. -
Inspecter le Volume créé.
-
Installer un serveur NFS sur la première machine
$ sudo ~/docker-tp-files/tp-nfs/setup-nfs-server
# apt update
# apt install nfs-kernel-server
# systemctl enable nfs-kernel-server
# mkdir /var/nfs-export
# echo "/var/nfs-export *(rw,sync,no_subtree_check,no_root_squash)" > /etc/exports
# exportfs -a
Installer un client NFS sur la seconde machine
# apt update
# apt install nfs-common
Cloner le dépôt git : https://gitlab.com/ctritten/docker-tp-files.git
Créer un Volume Docker
$ docker volume create \
--driver local \
--opt type=nfs \
--opt o=addr=192.168.56.102,nolock,soft,rw \
--opt device=:/var/nfs-export \
mariadb-nfs
Attention : l'adresse IP doit être celle de la machine master !
-
Lancer MariaDB en tant que service nommé
db
.-
Utiliser le volume
mariadb-nfs
. -
Utiliser le réseau
swarm-formation
. -
Passer les variables de connexion à la base de données en tant que variables d'environnement à l'exécution.
-
Lancer le service MariaDB :
$ docker service create \
--name db \
--env MARIADB_ROOT_PASSWORD=docker \
--env MARIADB_DATABASE=docker \
--env MARIADB_USER=docker \
--env MARIADB_PASSWORD=docker \
--mount source=mariadb-nfs,target=/var/lib/mysql \
--network swarm-formation \
mariadb:10.7.1
Vérifier que tout est OK :
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
v4v78r3e0hfm db replicated 1/1 mariadb:10.7.1
$ docker service ps db
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
wecjdwwu8lql db.1 mariadb:10.7.1 docker-1 Running Running 3 minutes ago
$ docker volume ls
DRIVER VOLUME NAME
local mariadb-nfs
Déployer Apache en tant que service Swarm
-
Nommer le service
web
. -
Utiliser l'image
web:1
. -
Utiliser le réseau nommé
swarm-formation
. -
Publier le service sur le port
80
. -
Passer les variables de connexion à la base de données en tant que variables d'environnement à l'exécution.
Lancer le service Apache :
$ docker service create \
--name web \
--env DB_HOST=db \
--env DB_NAME=docker \
--env DB_USER=docker \
--env DB_PASSWORD=docker \
--network swarm-formation \
--publish 80:80 \
web:1
-
Vérifier que les services sont correctement déployés.
-
Observer le comportement de l'application depuis un navigateur.
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
v4v78r3e0hfm db replicated 1/1 mariadb:10.7.1
lilu659iiha7 web replicated 1/1 web:1 *:8080->80/tcp
$ firefox http://<ip-docker-1>/cgi-bin/index.sh
Voir les conteneurs déployés à l'aide de l'outil Docker Swarm Visualizer
-
Récupérer Docker Swarm Visualizer sur le Docker Hub
(imagedockersamples/visualizer
) -
Lancer Docker Swarm Visualizer
-
Accéder au Docker Swarm Visualizer
Récupérer et lancer Docker Swarm Visualizer
$ docker run -d \
-p 4000:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
dockersamples/visualizer
0905de50e56eb1efb67fdc803201fcc3cac600f2f7e9a1d46375b50419abd629
Accéder au Docker Swarm Visualizer
$ firefox http://ip-docker-1:4000
Mettre à l'échelle le service web
-
Ajouter 2 instances
web
supplémentaires. -
Constater les effets dans le Docker Swarm Visualizer.
-
Ajouter / Retirer d'autres instances.
-
Constater les effets dans le Docker Swarm Visualizer.
Ajouter 2 instances web
supplémentaires
$ docker service scale web=3
web scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
- Supprimer les services, le réseau overlay et le volume de données.
Supprimer les services
$ docker service rm web
web
$ docker service rm db
db
Supprimer le réseau overlay
$ docker network rm swarm-formation
swarm-formation
2 - Stack Swarm
Déployer l'application en tant que stack Swarm.
-
Adapter le
docker-compose.yml
pour une utilisation avec Swarm.-
Ajouter les options pour utiliser le volume NFS.
-
Passer les variables de connexion à la base de données en tant que variables d'environnement dans le fichier docker-compose.
-
version: "3"
services:
web:
image: web:1
depends_on:
- db
ports:
- 8080:80
environment:
- DB_HOST=db
- DB_NAME=docker
- DB_USER=docker
- DB_PASSWORD=docker
db:
image: mariadb:10.7.1
environment:
- MARIADB_ROOT_PASSWORD=docker
- MARIADB_DATABASE=docker
- MARIADB_USER=docker
- MARIADB_PASSWORD=docker
volumes:
- mariadb-data:/var/lib/mysql
volumes:
mariadb-data:
driver_opts:
type: "nfs"
o: "addr=192.168.56.102,nolock,soft,rw"
device: ":/var/nfs-export"
-
Lancer la
stack
dans le cluster. -
Vérifier que tout est OK.
Déployer la stack :
$ docker stack deploy --compose-file docker-compose.yml formation
Creating network formation_default
Creating service formation_db
Creating service formation_web
Vérifier la création de la stack :
$ docker stack ls
NAME SERVICES
formation 2
Vérifier la création des services :
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
x5ywxi4xsytq formation_db replicated 1/1 mariadb:10.7.1
jxhrhfxwpe3f formation_web replicated 1/1 web:1 *:8080->80/tcp
Vérifier les tâches de la stack :
$ docker stack ps formation
ID NAME IMAGE NODE DESIRED S. CURRENT S.
tltlowva27vy formation_db.1 mariadb:10.7.1 docker-1 Running Running 2 m...
wxi9etw1opii formation_web.1 web:1 docker-2 Running Running 2 m...
Vérifier la création du réseau :
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
96ldjt0j2mb0 formation_default overlay swarm
...
Vérifier la création du volume :
$ docker volume ls
DRIVER VOLUME NAME
local formation_mariadb-data
...
-
Mettre à l'échelle l'application. Partie web uniquement.
-
Constater les effets dans le Docker Swarm Visualizer.
-
Observer le système d'équilibrage de charge natif de Swarm en se rendant sur la page web de l'application.
Augmenter le nombre de réplicas du service web :
$ docker service scale formation_web=3
formation_web scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
Vérifier la création des services :
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
x5ywxi4xsytq formation_db replicated 1/1 mariadb:10.7.1
jxhrhfxwpe3f formation_web replicated 1/1 web:1 *:8080->80/tcp
Vérifier les tâches de la stack :
$ docker stack ps formation
ID NAME IMAGE NODE DESIRED S. CURRENT S.
5s5xh7xte1v8 formation_db.1 mariadb:10.7.1 docker-1 Running Running 4 m...
gkyrujiuisbf formation_web.1 web:1 docker-2 Running Running 4 m...
idbv36o0dzgt formation_web.2 web:1 docker-1 Running Running 2 m...
vh4iufo2s5fl formation_web.3 web:1 docker-2 Running Running 2 m...
- Détruire la stack.
Détruire la stack
$ docker stack rm formation
Removing service formation_db
Removing service formation_web
Removing network formation_default