Docker Swarm fournit de manière native via son driver local, la possibilité de monter un système de fichiers partagé. En natif, nous allons retrouver NFS, Glusterfs ou SSHFS par exemple. Dans mon cas, ce sera NFS :
Mon cluster Swarm est le suivant :
julien@swarm0:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION uhr91g3ak37vhumtlpic86gwl * swarm0 Ready Drain Leader 24.0.7 qmsjds24sx5ed9ez9q8quas99 swarm1 Ready Active 24.0.7 uxigsaj9j6z0y6hdsyxz162my swarm2 Ready Active 24.0.7
Le volume partagé est construit depuis un serveur NFS en HA géré par mon rôle Ansible DRBD+Heartbeat.
Sur les worker node il est nécessaire de disposer du client nfs, disponible via le package nfs-common sous Debian/Ubuntu.
On peut ensuite passer à son fichier docker compose :
version: "3.2" volumes: www-data: driver: local driver_opts: type: nfs o: "addr=192.168.69.30,rw" device: ":/mnt/nfs" networks: nginx: driver: overlay services: nginx: image: nginx:latest networks: - "nginx" ports: - "8080:80" volumes: - type: volume source: www-data target: /var/www/html volume: nocopy: true deploy: replicas: 2 restart_policy: condition: any
Déployons la stack :
docker stack deploy --compose-file nginx.yml nginx-stack
Vérifions notre volume :
docker volume ls DRIVER VOLUME NAME local nginx-stack_www-data docker volume inspect nginx-stack_www-data [ { "CreatedAt": "2023-12-19T21:30:41Z", "Driver": "local", "Labels": { "com.docker.stack.namespace": "nginx-stack" }, "Mountpoint": "/var/lib/docker/volumes/nginx-stack_www-data/_data", "Name": "nginx-stack_www-data", "Options": { "device": ":/mnt/nfs", "o": "addr=192.168.69.30,rw", "type": "nfs" }, "Scope": "local" } ]