2017-07-24 3 views
1

Ich habe eine Datei mit v3 kompilieren, wo es 3 Dienste teilen/mit dem gleichen Datenträger. Bei Verwendung des Schwarm-Modus müssen wir zusätzliche Container & Volumes erstellen, um unsere Dienste im gesamten Cluster zu verwalten.So mounten Sie NFS-Freigabe/Volume direkt im Container mit Docker komponieren v3

Ich plane, NFS-Server zu verwenden, so dass einzelne NFS-Freigabe direkt auf allen Hosts innerhalb des Clusters bereitgestellt werden.

Ich habe unten zwei Möglichkeiten, es zu tun gefunden, aber es braucht zusätzliche Schritte auf dem Docker Host ausgeführt werden -

Gibt es eine Standardmethode, wo ich direkt NFS verwenden können/mount-Aktie nur wenige, indem Docker compose v3/keine Stufen (Ich verstehe, dass „nfs-common "Paket ist sowieso erforderlich" auf dem Docker-Host?

Antwort

1

Ja, Sie können direkt einen NFS aus der Compose-Datei verweisen:

volumes: 
    db-data: 
     driver: local 
     driver_opts: 
     type: nfs 
     o: addr=$SOMEIP,rw 
     device: ":$PathOnServer" 

Und in analoger Weise könnten Sie einen NFS-Volume auf jedem Host erstellen.

docker volume create --driver local --opt type=nfs --opt o=addr=$SomeIP,rw --opt device=:$DevicePath --name nfs-docker 
+0

bitte nicht vergessen ‚:‘ in ‚Gerät:‚: $ PathOnServer‘‘ – MaxiReglisse

+0

Danke, dass für den Hinweis auf ich es in der Antwort hinzugefügt mehr klar zu sein. – herm

3

Nach der Entdeckung, dass diese massiv undokumentiert ist, dann ist hier der richtige Weg, um einen NFS-Volume mit Stack und Docker compose zu montieren.

Das Wichtigste ist, dass Sie version: "3.2" oder höher verwenden müssen. Sie werden seltsame und nicht offensichtliche Fehler haben, wenn Sie das nicht tun.

Das zweite Problem ist, dass die Volumes nicht automatisch aktualisiert werden, wenn sich ihre Definition ändert. Dies kann dazu führen, dass Sie ein Kaninchenloch davon abhalten, zu denken, dass Ihre Änderungen nicht korrekt sind, wenn sie einfach nicht angewendet wurden. Stellen Sie sicher, dass Sie docker rm VOLUMENAME überall wo es möglich ist, als ob das Volume vorhanden ist, wird es nicht überprüft werden.

Das dritte Problem ist eher ein NFS-Problem - Der NFS-Ordner wird nicht auf dem Server erstellt, wenn es nicht existiert. So funktioniert NFS. Sie müssen sicherstellen, dass es existiert, bevor Sie etwas tun.

(nicht entfernen ‚soft‘ und ‚nolock‘, wenn Sie sicher sind, wissen Sie, was Sie tun - das hält Docker einfriert, wenn Ihr NFS-Server weggeht)

Hier ist ein komplettes Beispiel:

[[email protected] 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" 



[[email protected] docker-mirror]# docker stack deploy --with-registry-auth -c nfs-compose.yml rsyslog 
Creating network rsyslog_default 
Creating service rsyslog_rsyslog 
[[email protected] 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 
[[email protected] docker-mirror]# 

nun auf Schwarm-4:

[email protected]:~# 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 
[email protected]:~# docker exec -it d883e0f14d3f df -h /nfs 
Filesystem    Size  Used Available Use% Mounted on 
:/docker/example   7.2T  5.5T  1.7T 77% /nfs 
[email protected]:~# 

Dieses Volumen wird erstellt (aber nicht zerstört) auf jedem Schwarm Knoten, der die s Der Kurs läuft weiter.

[email protected]:~# 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" 
    } 
] 
[email protected]:~# 
+1

Ich benutze NFS mit komponieren v3.1. An welche Art von Themen denken Sie? Was ist mit möglichen Daten-Korruption wegen der Verwendung von Soft-und Nolock? Sollten diese nicht in deiner Antwort angesprochen werden? – herm

+0

@herm vielleicht Xrobau sprechen über mehrere Replikate im Gespräch mit dem gleichen NFS-Server. – Galigator

+0

"weich" lässt IO unterbrochen werden. 'Nolock' lässt Flock() Anrufe immer gelingen. Wenn Sie sich bei mehreren Benutzern auf NFS auf flock() verlassen, verlangsamen Sie Ihr Disk IO * erheblich * und sollten Ihre Anwendung neu gestalten. – xrobau

Verwandte Themen