Как напрямую монтировать NFS share / volume в контейнер с помощью docker compose v3

У меня есть файл compose с v3, где есть 3 службы совместного использования / с использованием того же Тома. При использовании режима swarm нам необходимо создать дополнительные контейнеры и Тома для управления нашими службами в кластере.

Я планирую использовать сервер NFS, чтобы один общий ресурс NFS был установлен непосредственно на всех хостах в кластере.

Я нашел ниже два способа сделать это, но для этого необходимо выполнить дополнительные шаги на хосте docker -

  • подключите общий ресурс NFS с помощью команды" fstab "или" mount " на хосте, а затем используйте его в качестве Тома хоста для служб docker.

  • использовать плагин Netshare -https://github.com/ContainX/docker-volume-netshare

есть ли стандартный способ, которым я могу напрямую использовать / монтировать NFS share с помощью docker compose v3, выполнив только несколько / нет шагов(я понимаю, что пакет "NFS-common" требуется в любом случае) на узел Docker?

2 ответов


обнаружив,что это массово недокументировано, вот правильный способ монтирования Тома NFS с помощью stack и docker compose.

самое главное, что вам нужно использовать version: "3.2" или выше. У вас будут странные и неочевидные ошибки, если вы этого не сделаете.

вторая проблема заключается в том, что Тома не автоматически обновляется при изменении их определения. Это может привести вас в кроличью нору, думая, что ваши изменения не правильно, когда они просто не были применены. Убедитесь, что вы docker rm VOLUMENAME везде, где это возможно, как будто том существует, он не будет проверен.

третья проблема-это больше проблема NFS-папка NFS будет не будет создана на сервере, если он не существует. Именно так работает NFS. Вы должны убедиться, что он существует, прежде чем что-либо делать.

(не удаляйте "soft" и "nolock", если вы не уверены, что знаете, что делаете - это останавливается докер от замораживания, если ваш сервер NFS уходит)

вот пример:

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

теперь, на рой-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:~#

этот том будет создан (но не уничтожена) на любом узле роя, на котором работает стек.

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

Да вы можете напрямую ссылаться на NFS из файла compose:

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