在发现大量未记录的文件之后,这是使用堆栈和docker compose挂载NFS卷的正确方法。
最重要的是,您需要使用
version: "3.2"或更高。如果没有的话,将会有奇怪而又不明显的错误。
第二个问题是,卷的定义更改时 不会 自动更新。当您所做的更改尚未应用时,这会使您陷入困境,认为更改是不正确的。确保您
docker rmVOLUMENAME可能在任何地方都可以使用,就像该卷存在一样,它不会被验证。
第三个问题更多是NFS问题- 如果不存在,则不会在服务器 上创建 NFS文件夹。这就是NFS的工作方式。在执行任何操作之前,您需要确保它存在。
(除非确定您知道自己在做什么,否则不要删除’soft’和’nolock’-如果NFS服务器消失,这将使docker停止冻结)
这是一个完整的示例:
[root@docker docker-mirror]# cat nfs-compose.ymlversion: "3.2"services: rsyslog: image: jumanjiman/rsyslog ports: - "514:514" - "514:514/udp" volumes: - type: volume source: example target: /nfs volume: nocopy: truevolumes: 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 rsyslogCreating network rsyslog_defaultCreating service rsyslog_rsyslog[root@docker docker-mirror]# docker stack ps rsyslogID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTStb1dod43fe4c rsyslog_rsyslog.1 jumanjiman/rsyslog:latest swarm-4 Running Starting less than a second ago[root@docker docker-mirror]#
现在,在swarm-4上:
root@swarm-4:~# docker psConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESd883e0f14d3f jumanjiman/rsyslog:latest "rsyslogd -n -f /e..." 6 seconds ago Up 5 seconds 514/tcp, 514/udp rsyslog_rsyslog.1.tb1dod43fe4cy3j5vzsy7pgv5root@swarm-4:~# docker exec -it d883e0f14d3f df -h /nfsFilesystem Size Used Available Use% Mounted on:/docker/example 7.2T 5.5T 1.7T 77% /nfsroot@swarm-4:~#
将在运行堆栈的任何群集节点上创建( 但不会销毁 )该卷。
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:~#


