首页 文章

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

提问于
浏览
10

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

我打算使用NFS服务器,以便将单个NFS共享直接挂载到群集中的所有主机上 .

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

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

3 回答

  • 0

    我的AWS EFS解决方案有效:

    • Create EFS(别忘了在安全组中打开NFS端口2049)

    • 安装nfs-common软件包:

    sudo apt-get install -y nfs-common

    • 检查你的efs是否有效:
    mkdir efs-test-point
    sudo chmod go+rw efs-test-point
    
    sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
    
    touch efs-test-point/1.txt
    sudo umount efs-test-point/
    ls -la efs-test-point/
    

    目录必须为空

    sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
    

    ls -la efs-test-point/

    文件1.txt必须存在

    • 配置docker-compose.yml文件:
    services:
      sidekiq:
        volumes:
          - uploads_tmp_efs:/home/application/public/uploads/tmp
      ...
    volumes:
      uploads_tmp_efs:
        driver: local
        driver_opts:
          type: nfs
          o: addr=[YOUR_EFS_DNS],nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2
          device: [YOUR_EFS_DNS]:/
    
  • 20

    是的,您可以直接从撰写文件中引用NFS:

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

    以类似的方式,您可以在每个主机上创建一个nfs卷 .

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

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

    最重要的是你需要使用 version: "3.2" 或更高版本 . 如果不这样做,你会有奇怪和不明显的错误 .

    第二个问题是卷的定义发生变化时会自动更新 not . 这可能会导致你认为你的变化没有得到应用 . 确保你可能在任何地方 docker rm VOLUMENAME ,好像卷存在,它将不会被验证 .

    第三个问题更多的是NFS问题 - 如果NFS文件夹不存在,它将在服务器上 not be created . 这就是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节点上创建此卷( but not destroyed ) .

    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:~#
    

相关问题