Монтаж 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 при создании контейнера.
Для этого есть несколько решений:
- Запустите контейнер с флагом
--cap-add sys_admin
. Это приводит к тому, что Docker сохраняет возможность CAP_SYS_ADMIN
, которая должна позволить вам смонтировать общий ресурс NFS из контейнера. Это может быть проблемой безопасности; не делайте этого в ненадежных контейнерах. [Предыдущая версия этого ответа предлагала использовать --privileged=true
для сохранения всех возможностей, спасибо @earcam за предложение использовать вместо него --cap-add
].
Смонтируйте общий ресурс NFS на хосте и передайте его в контейнер как том хоста:
[email protected] > mount server:/dir /path/to/mount/point
[email protected] > docker run -v /path/to/mount/point:/path/to/mount/point
Используйте подключаемый модуль тома 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