centos 在Docker容器内挂载nfs共享

cmssoen2  于 2022-11-08  发布在  Docker
关注(0)|答案(5)|浏览(374)

有没有人知道如何在docker容器内挂载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
svdrlsy4

svdrlsy41#

从docker 17.06开始,您可以在运行容器时直接将NFS共享挂载到容器,而无需额外的功能

export NFS_VOL_NAME=mynfs
export NFS_LOCAL_MNT=/mnt/mynfs
export NFS_SERVER=my.nfs.server.com
export NFS_SHARE=/my/server/path
export 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
vmpqdwk3

vmpqdwk32#

要使用mount,您需要CAP_SYS_ADMIN功能,该功能在创建容器时由Docker删除。
对此有几种解决方案:
1.使用--cap-add sys_admin标志启动容器。这将导致Docker保留CAP_SYS_ADMIN功能,这将允许您从容器中挂载NFS共享。这可能是一个安全问题;不要在不受信任的容器中这样做。[这个答案的前一个版本建议使用--privileged=true来保留 * 所有 * 功能,感谢@earcam建议使用--cap-add]。
1.在主机上装载NFS共享,并将其作为主机卷传递到容器中:

you@host > mount server:/dir /path/to/mount/point
you@host > docker run -v /path/to/mount/point:/path/to/mount/point

1.使用Docker宗卷插件(如Netshare插件)将NFS共享直接挂载为容器宗卷:

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

t98cgbkg3#

对于已接受答案中列出的第二个选项,我不确定您是否真的尝试过使用"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守护进程,它以**“root”身份运行。当docker运行一个带有要挂载的卷的容器时,它会请求docker守护进程挂载它。问题是,NFS服务器将以不同的方式处理“root”。默认情况下,NFS服务器将“root”Map到“nobody”**,从而导致错误消息:reference

mwkjh3gx

mwkjh3gx4#

我把nfs挂载到了docker container上,谢谢@helmbert。
1.运行带有--privileged=true标志的Docker容器。

$ docker run -it --privileged=true centos:7 bash
[root@f7915ae635aa /]# yum install -y nfs-utils

1.安装nfs工具包并在CentOS上挂载nfs。

[root@f7915ae635aa /]# yum install -y nfs-utils
[root@f7915ae635aa /]# mount -t nfs example.tw:/target/ /srv -o nolock

1.显示nfs服务器的挂载。

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

pxy2qtax5#

通过添加--cap-add sys_admin标志到客户端容器对我来说是不够的。我得到了错误:

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

经过几个小时的研究,我发现它看起来像完全权限--privileged是需要正确安装在码头容器内。
另外,不要忘记在你的docker容器中安装必要的nfs客户端软件包。

apt-get install -y nfs-common

相关问题