问题:如何使用 docker compose v3 在容器中直接挂载 NFS 共享/卷

我有一个带有 v3 的 compose 文件,其中有 3 个服务共享/使用相同的卷。在使用 swarm 模式时,我们需要创建额外的容器和卷来跨集群管理我们的服务。

我计划使用 NFS 服务器,以便将单个 NFS 共享直接安装在集群内的所有主机上。

我发现了以下两种方法,但它需要在 docker 主机上执行额外的步骤 -

  • 在主机上使用“fstab”或“mount”命令挂载NFS共享,然后将其用作docker服务的主机卷。

  • 使用 Netshare 插件 -https://github.com/ContainX/docker-volume-netshare

有没有一种标准方法,我可以通过在 docker 主机上只执行很少/不执行步骤(我知道无论如何都需要“nfs-common”包)来使用 docker compose v3 直接使用/挂载 NFS 共享?

解答

在发现这大量未记录后,这是使用堆栈和 docker compose 挂载 NFS 卷的正确方法。

最重要的是您需要使用version: "3.2"或更高版本。如果不这样做,您将遇到奇怪且不明显的错误。

第二个问题是卷不会在其定义更改时自动更新。这可能会导致您陷入一个认为您的更改不正确的兔子洞,而这些更改尚未应用。确保你docker rm VOLUMENAME它可能在任何地方,就好像卷存在一样,它不会被验证。

第三个问题更像是一个 NFS 问题 - 如果 NFS 文件夹不存在,它将不会在服务器上创建。这正是 NFS 的工作方式。在你做任何事情之前,你需要确保它存在。

(除非您确定自己知道自己在做什么,否则不要删除 'soft' 和 'nolock' - 如果您的 NFS 服务器消失,这会阻止 docker 冻结)

这是一个完整的例子:

[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]#

现在,在 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:~#
Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐