2016-10-07 9 views
16

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

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 

ответ

21

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

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

  1. Запускать контейнер с --privileged=true флагом. Это приводит к тому, что Docker не отказывается от каких-либо возможностей, что должно позволить вам монтировать общий ресурс NFS из контейнера. Это может быть проблема безопасности; не делайте этого в ненадежных контейнерах.
  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 
    
+0

Для варианта 1: Как обходиться без использования '--privileged = true'? – Zelphir

+0

Способ 2. не работает. У меня есть NFS, смонтированный в локальной системе, и я могу видеть все файлы. Однако, когда я передаю папку монтирования в контейнер в качестве тома, я получаю только пустую папку. Я пытаюсь изменить разрешения, как предложил Цзин Цю, без успеха. – cage

5

для второго варианта, перечисленных в принятом ответе, я не уверен, если вы на самом деле пытались использовать команду "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: Error response from daemon: stat /path_dest: permission denied. 

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

1

монтировании ООПП на Docker контейнере, спасибо за @helmbert.

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

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

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

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

От докер 17.06, вы можете смонтировать акции NFS в контейнер непосредственно при запуске, без необходимости дополнительных возможностей

docker run --mount 'type=volume,src=VOL_NAME,volume-driver=local,dst=/LOCAL-MNT,volume-opt=type=nfs,volume-opt=device=:/NFS-SHARE,"volume-opt=o=addr=NFS-SERVER,vers=4,hard,timeo=600,rsize=1048576,wsize=1048576,retrans=2"' -d -it --name mycontainer ubuntu

Есть намек от https://github.com/moby/moby/issues/28809

+0

Это должен быть ответ №1 от Докера 17.06 и далее. Я долго ждал этой возможности! –

+0

Я отредактировал ответ, чтобы исправить опечатку и выделить параметры, которые люди обычно хотят настроить (локальная точка монтирования в контейнере, имя хоста NFS/IP и удаленный общий путь NFS) – ThiagoAlves