Установка общих ресурсов 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 при создании контейнера.
для этого есть несколько решений:
- запустите контейнер с помощью
--privileged=true
флаг. Это заставляет Docker не отбрасывать возможности, которые должны позволить вам монтировать общий ресурс NFS из контейнера. Это может быть проблемой безопасности; не делайте этого в ненадежных контейнерах. -
установите долю NFS на хозяина и передать его в контейнер в томе:
you@host > mount server:/dir /path/to/mount/point you@host > docker run -v /path/to/mount/point:/path/to/mount/point
-
используйте плагин 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 .
-
запустите контейнер docker с помощью
--privileged=true
флаг.$ docker run -it --privileged=true centos:7 bash [root@f7915ae635aa /]# yum install -y nfs-utils
-
установите пакет инструментов nfs и установите nfs на CentOS.
[root@f7915ae635aa /]# yum install -y nfs-utils [root@f7915ae635aa /]# mount -t nfs example.tw:/target/ /srv -o nolock
-
показать монтирование сервера nfs.
[root@f7915ae635aa /]# showmount example.tw Hosts on example.tw: 10.10.10.1 10.10.10.2