Монтаж nfs акций внутри контейнера докеров

Кто-нибудь знает, как монтировать коллекцию nfs внутри контейнера докеров с базовым изображением centos? Я пробовал эту команду:

mount server:/dir /mount/point

и получил следующую ошибку:

mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount.nfs: an incorrect mount option was specified

когда я пытаюсь использовать его с опцией -o nolock, ошибка:

mount.nfs: Operation not permitted

Ответы

Ответ 1

Для использования mount вам понадобится возможность CAP_SYS_ADMIN, которая исключается Docker при создании контейнера.

Для этого есть несколько решений:

  1. Запустите контейнер с флагом --cap-add sys_admin. Это приводит к тому, что Docker сохраняет возможность CAP_SYS_ADMIN, которая должна позволить вам смонтировать общий ресурс NFS из контейнера. Это может быть проблемой безопасности; не делайте этого в ненадежных контейнерах. [Предыдущая версия этого ответа предлагала использовать --privileged=true для сохранения всех возможностей, спасибо @earcam за предложение использовать вместо него --cap-add].
  2. Смонтируйте общий ресурс NFS на хосте и передайте его в контейнер как том хоста:

    [email protected] > mount server:/dir /path/to/mount/point
    [email protected] > docker run -v /path/to/mount/point:/path/to/mount/point
    
  3. Используйте подключаемый модуль тома Docker (например, Netshare), чтобы напрямую подключить общий ресурс NFS в качестве тома контейнера:

    [email protected] > docker run \
      --volume-driver=nfs \
      -v server/dir:/path/to/mount/point \
      centos
    

Ответ 2

Начиная с Docker 17.06, вы можете подключать общие ресурсы NFS к контейнеру непосредственно при его запуске, без необходимости дополнительных возможностей.

export NFS_VOL_NAME=mynfs NFS_LOCAL_MNT=/mnt/mynfs NFS_SERVER=my.nfs.server.com NFS_SHARE=/my/server/path NFS_OPTS=vers=4,soft

docker run --mount \
  "src=$NFS_VOL_NAME,dst=$NFS_LOCAL_MNT,volume-opt=device=:$NFS_SHARE,\"volume-opt=o=addr=$NFS_SERVER,$NFS_OPTS\",type=volume,volume-driver=local,volume-opt=type=nfs" \
  busybox ls $NFS_LOCAL_MNT

Кроме того, вы можете создать том перед контейнером:

docker volume create --driver local \
  --opt type=nfs --opt o=addr=$NFS_SERVER,$NFS_OPTS \
  --opt device=:$NFS_SHARE $NFS_VOL_NAME

docker run --rm -v $NFS_VOL_NAME:$NFS_LOCAL_MNT busybox ls $NFS_LOCAL_MNT

Получил подсказку с https://github.com/moby/moby/issues/28809

Ответ 3

Для второго варианта, указанного в принятом ответе, я не уверен, что вы действительно пытались использовать команду "docker run -v" для передачи общего ресурса NFS на хосте в контейнер докеров в качестве тома. Я недавно пытался это сделать, ниже приведена информация для общего ресурса nfs на хосте:

nfs-server:/path_to_mount on /path_dest type nfs

а затем:

docker run -it -v /path_dest:/path_in_docker docker_name bash

Но демон docker всегда сообщает ниже об ошибке:

docker: Error response from daemon: stat /path_dest: permission denied.

После многих поисков я обнаружил, что ошибка на самом деле происходит от демона докеров, который работает как "root" . Когда docker запускает контейнер с томом для монтирования, он попросит демон docker смонтировать его. Проблема в том, что сервер NFS будет обрабатывать "root" по-разному. По умолчанию сервер NFS будет отображать "root" на "никто" , вызывая сообщение об ошибке: ссылка

Ответ 4

Я монтирую nfs на контейнере докеров, спасибо за @helmbert.

  • Запустите контейнер докеров с флагом --privileged=true.

    $ docker run -it --privileged=true centos:7 bash
    [[email protected] /]# yum install -y nfs-utils
    
  • Установите пакет инструментов nfs и смонтируйте nfs на CentOS.

    [[email protected] /]# yum install -y nfs-utils
    [[email protected] /]# mount -t nfs example.tw:/target/ /srv -o nolock
    
  • Показывать монтирование сервера nfs.

    [[email protected] /]# showmount example.tw
    Hosts on example.tw:
    10.10.10.1
    10.10.10.2
    

Ответ 5

Для меня недостаточно было добавить флаг --cap-add sys_admin в клиентский контейнер. Я получаю сообщение об ошибке:

mount.nfs: mount(2): Permission denied
mount.nfs: access denied by server while mounting 1.2.3.4:/exports

После нескольких часов исследований я обнаружил, что похоже, что для правильной установки внутри контейнера док-станции необходимы полные права --privileged.

Также не забудьте установить необходимые клиентские пакеты NFS внутри вашего контейнера Docker. В контейнерах на основе Debian:

apt-get install -y nfs-common