发现这个过程文档化程度极低,以下是使用 stack 和 docker compose 挂载 NFS 卷的正确方法。
最重要的是您需要使用 version: "3.2"
或更高版本。如果不这样做,您将遇到奇怪且不明显的错误。
第二个问题是,当卷的定义更改时,它们不会自动更新。这可能会让您认为更改不正确,而实际上只是没有应用更改。确保在所有可能的地方使用 docker rm VOLUMENAME
,因为如果卷存在,则不会被验证。
第三个问题更多是 NFS 的问题 - 如果服务器上不存在该文件夹,NFS 文件夹将不会被创建。这就是 NFS 的工作方式。在进行任何操作之前,请确保它存在。
(除非您确定自己知道在做什么,否则请勿删除“soft”和“nolock”- 这会防止 Docker 在 NFS 服务器消失时冻结)
下面是一个完整的示例:
[root@docker docker-mirror]
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]
Creating network rsyslog_default
Creating service rsyslog_rsyslog
[root@docker docker-mirror]
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]
现在,关于swarm-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:~#
此卷将在运行堆栈的任何Swarm节点上创建(但不会被销毁)。
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:~#