2016-07-15 30 views
11

Ich habe mehrere Container, die State benötigen - ich werde immer nur die Skala auf 1 setzen, aber ich möchte es so, dass egal, welcher Host sie auf dem Volume starten würde geteilt werden.Docker 1.12 Schwarm-Modus und Container-Volumes

Ich denke, ich brauche eine Netzwerkhalterung, um dies zu erreichen (was in Ordnung ist), aber wie um alles in der Welt konfiguriere ich das Volumen mit Docker Schwarm 1.12?

Ich weiß, ich kann docker Volume create verwenden, und ich denke, ich muss vielleicht einen Treiber angeben, aber ich habe Mühe, ein einziges Beispiel dafür zu finden!

Antwort

12

docker service create --mount ... bietet zwei Optionen für persistente Daten; binden Mounts und benannte Volumes. Bind-Mounts bleiben auf dem erstellten Host bestehen, funktionieren also nicht, da sie nicht gemeinsam genutzt werden können.

Benannte Datenträger können mit docker volume create erstellt oder implizit als Teil von docker service create mit der Option --mount erstellt werden, z.

$ docker volume create -d --driver cio --name cassandradb --opt profile=CASSANDRA 
$ docker service create \ 
--mount source=cassandradb,target=/var/lib/cassandra,volume-driver=cio \ 
--replicas 1 \ 
--name cassandra \ 
cassandra 

docker service create standardmäßig benannten Volumen so wird der Typ in dem Beispiel nicht angegeben. Der Volume-Treiber unterstützt portable Volumes. Andere Volume-Treiber wie RexRay oder Flocker unterstützen auch tragbare Volumes. Hier ist ein Artikel mit Beispielen auf RexRay.

Es gibt auch --mount Optionen für Volume-Labels und Volume-Optionen. Die offizielle Dokumentation ist immer noch nicht auf der Docker-Seite. Sie können jedoch weitere Informationen zu Bindungs-Mounts und benannten Volumes abrufen here.

8

Ich bin mir nicht sicher, dass die Syntax hier abgeschlossen ist, wie die github pull request 24334 zeigt, aber die CLI-Option, die Sie suchen, ist docker service --mount .... Wenn Sie so etwas verwenden, müssen Sie eine Situation erstellen, in der Sie sicherstellen müssen, dass die Daten für die Bereitstellung verfügbar sind. Daher sehen Sie Treiber wie nfs oder gluster. Andernfalls, wenn der Container verschoben werden muss und Sie Daten direkt vom Host bereitgestellt haben, wird dieser ohne das erforderliche Mount neu gestartet.


Edit: die aktuelle --mount Syntax:

docker service create --name nginx \ 
    --mount type=bind,source=`pwd`/static-site,target=/usr/share/nginx/html \ 
    -p 80:80 nginx 

für Host/bind Halterungen oder

docker service create --name nginx \ 
    --mount type=volume,source=web,target=/usr/share/nginx/html \ 
    -p 80:80 nginx 

für eine benannte Volume. Ich habe auch eine blog post zum Thema gepostet, weil ich die gleiche Frage viel höre.

+0

Ich verwende rc4 und habe eine Netzwerkfreigabe unter/mnt/docker/jackett installiert. Sollte das funktionieren? 'docker service create --mount bind, src =/mnt/docker/jacket, dst =/config/.config -p 9117: 9117 --name files_jackett dreamcat4/jacket'. Der Fehler, den ich bekomme, ist für --mount: ungültiges Feld 'bind' muss ein Schlüssel = Wert-Paar sein. –

+3

Es sieht so aus, als sollte die Syntax lauten: 'docker service create --mounttyp = bind, source =/mnt/docker/jackett, target =/config/.config -p 9117: 9117 --name files_jackett dreamcat4/jacketclear'! Vielen Dank –