J'ai un fichier de composition avec v3 où il y a 3 services partageant/utilisant le même volume. Lors de l'utilisation du mode swarm, nous devons créer des conteneurs et des volumes supplémentaires pour gérer nos services sur l'ensemble du cluster.
Je prévois d'utiliser un serveur NFS afin qu'un seul partage NFS soit monté directement sur tous les hôtes du cluster.
J'ai trouvé ci-dessous deux façons de le faire, mais des étapes supplémentaires sont nécessaires pour le docker Host -
Montez le partage NFS à l'aide de la commande "fstab" ou "mount" sur l'hôte, puis utilisez-le comme volume hôte pour les services Docker.
Utiliser le plugin Netshare - https://github.com/ContainX/docker-volume-netshare
Existe-t-il un moyen standard d'utiliser directement/monter le partage NFS à l'aide de docker compose v3 en effectuant seulement quelques étapes/aucune étape (je comprends que le package "nfs-common" est requis de toute façon) sur l'hôte docker?
Après avoir découvert qu'il s'agit d'une masse non documentée, voici la bonne façon de monter un volume NFS à l'aide de la pile et de la composition de menu fixe.
La chose la plus importante est que vous devez utiliser version: "3.2"
ou supérieur. Si vous ne le faites pas, vous aurez des erreurs étranges et non évidentes.
Le deuxième problème est que les volumes sont not automatiquement mis à jour lorsque leur définition change. Cela peut vous amener à penser que vos modifications ne sont pas correctes, alors qu'elles ne sont tout simplement pas appliquées. Assurez-vous que vous avez docker rm VOLUMENAME
partout où il pourrait être, car si le volume existe, il ne sera pas validé.
Le troisième problème est davantage un problème NFS - Le dossier NFS ne sera ne sera pas créé sur le serveur s'il n'existe pas. C’est ainsi que fonctionne NFS. Vous devez vous assurer qu'il existe avant de faire quoi que ce soit.
(Ne supprimez pas 'soft' et 'nolock' à moins d'être sûr de savoir ce que vous faites - cela empêche le docker de geler si votre serveur NFS s'en va.)
Voici un exemple complet:
[root@docker docker-mirror]# cat nfs-compose.yml
version: "3.2"
services:
rsyslog:
image: jumanjiman/rsyslog
ports:
- "514:514"
- "514:514/udp"
volumes:
- type: volume
source: example
target: /nfs
volume:
nocopy: true
volumes:
example:
driver_opts:
type: "nfs"
o: "addr=10.40.0.199,nolock,soft,rw"
device: ":/docker/example"
[root@docker docker-mirror]# docker stack deploy --with-registry-auth -c nfs-compose.yml rsyslog
Creating network rsyslog_default
Creating service rsyslog_rsyslog
[root@docker docker-mirror]# docker stack ps rsyslog
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
tb1dod43fe4c rsyslog_rsyslog.1 jumanjiman/rsyslog:latest swarm-4 Running Starting less than a second ago
[root@docker docker-mirror]#
Maintenant, sur essaim-4:
root@swarm-4:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d883e0f14d3f jumanjiman/rsyslog:latest "rsyslogd -n -f /e..." 6 seconds ago Up 5 seconds 514/tcp, 514/udp rsyslog_rsyslog.1.tb1dod43fe4cy3j5vzsy7pgv5
root@swarm-4:~# docker exec -it d883e0f14d3f df -h /nfs
Filesystem Size Used Available Use% Mounted on
:/docker/example 7.2T 5.5T 1.7T 77% /nfs
root@swarm-4:~#
Ce volume sera créé (mais pas détruit) sur n’importe quel nœud en essaim sur lequel la pile est en cours d’exécution.
root@swarm-4:~# docker volume inspect rsyslog_example
[
{
"CreatedAt": "2017-09-29T13:53:59+10:00",
"Driver": "local",
"Labels": {
"com.docker.stack.namespace": "rsyslog"
},
"Mountpoint": "/var/lib/docker/volumes/rsyslog_example/_data",
"Name": "rsyslog_example",
"Options": {
"device": ":/docker/example",
"o": "addr=10.40.0.199,nolock,soft,rw",
"type": "nfs"
},
"Scope": "local"
}
]
root@swarm-4:~#
Oui, vous pouvez directement référencer un NFS à partir du fichier de composition:
volumes:
db-data:
driver: local
driver_opts:
type: nfs
o: addr=$SOMEIP,rw
device: ":$PathOnServer"
Et de manière analogue, vous pouvez créer un volume nfs sur chaque hôte.
docker volume create --driver local --opt type=nfs --opt o=addr=$SomeIP,rw --opt device=:$DevicePath --name nfs-docker
Ma solution pour AWS EFS, qui fonctionne:
Installez le paquet nfs-common:
Sudo apt-get install -y nfs-common
Vérifiez si votre efs fonctionne:
mkdir efs-test-point Sudo chmod go + rw efs-test-point
Sudo mount -t nfs -o nfsvers = 4.1, rsize = 1048576, wsize = 1048576, difficile, temps = 600, retrans = 2, noresvport [YOUR_EFS_DNS]:/efs-test-point
touchez efs-test-point/1.txt Sudo umount efs-test-point / ls -la efs-test-point /
le répertoire doit être vide
Sudo mount -t nfs -o nfsvers = 4.1, rsize = 1048576, wsize = 1048576, difficile, temps = 600, retrans = 2, noresvport [YOUR_EFS_DNS]:/efs-test-point
ls -la efs-test-point/
le fichier 1.txt doit exister
Configurez le fichier docker-compose.yml:
prestations de service: sidekiq: volumes: - uploads_tmp_efs:/home/application/public/uploads/tmp ... volumes: uploads_tmp_efs: pilote: local driver_opts: tapez: nfs o: addr = [YOUR_EFS_DNS], nfsvers = 4.1, taille = 1048576, taille = 1048576, difficile, temps = 600, retransversions = 2 périphérique: [YOUR_EFS_DNS]: /