Установка общих ресурсов nfs внутри контейнера docker

кто-нибудь знает, как смонтировать долю NFS внутри контейнера docker с базовым изображением 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

4 ответов


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

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

  1. запустите контейнер с помощью --privileged=true флаг. Это заставляет Docker не отбрасывать возможности, которые должны позволить вам монтировать общий ресурс NFS из контейнера. Это может быть проблемой безопасности; не делайте этого в ненадежных контейнерах.
  2. установите долю NFS на хозяина и передать его в контейнер в томе:

    you@host > mount server:/dir /path/to/mount/point
    you@host > docker run -v /path/to/mount/point:/path/to/mount/point
    
  3. используйте плагин Docker volume (например,Netshare плагин) для непосредственного монтирования общего ресурса NFS в качестве объема контейнера:

    you@host > docker run \
      --volume-driver=nfs \
      -v server/dir:/path/to/mount/point \
      centos
    

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

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


для второго варианта, указанного в принятом ответе, я не уверен, что вы действительно пытались использовать "docker run -v" команда для передачи общего ресурса NFS на хосте в контейнер docker в качестве Тома. Я недавно попытался сделать это, ниже приведена информация для общего ресурса 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.

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


я монтирую NFS на контейнер docker, спасибо за @helmbert .

  1. запустите контейнер docker с помощью --privileged=true флаг.

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

    [root@f7915ae635aa /]# yum install -y nfs-utils
    [root@f7915ae635aa /]# mount -t nfs example.tw:/target/ /srv -o nolock
    
  3. показать монтирование сервера nfs.

    [root@f7915ae635aa /]# showmount example.tw
    Hosts on example.tw:
    10.10.10.1
    10.10.10.2