有谁知道如何在带有centos基础图像的docker容器内安装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
对于使用mount
,你需要CAP_SYS_ADMIN
功能,在创建容器时由Docker删除。
有几种解决方案:
--cap-add sys_admin
标志启动容器。这会导致Docker保留CAP_SYS_ADMIN
功能,这应该允许您从容器中安装NFS共享。这可能是一个安全问题;不要在不受信任的容器中执行此操作。 [此答案的先前版本建议使用--privileged=true
保留所有功能,感谢@earcam建议使用--cap-add
代替]。you@host > mount server:/dir /path/to/mount/point
you@host > docker run -v /path/to/mount/point:/path/to/mount/point
you@host > docker run \
--volume-driver=nfs \
-v server/dir:/path/to/mount/point \
centos
从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
对于接受的答案中列出的第二个选项,我不确定您是否确实尝试使用"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”映射到“nobody”,从而导致错误消息:reference
我将nfs挂载在docker容器上,感谢@helmbert。
--privileged=true
标志运行docker容器。
$ docker run -it --privileged=true centos:7 bash
[root@f7915ae635aa /]# yum install -y nfs-utils
[root@f7915ae635aa /]# yum install -y nfs-utils
[root@f7915ae635aa /]# mount -t nfs example.tw:/target/ /srv -o nolock
[root@f7915ae635aa /]# showmount example.tw
Hosts on example.tw:
10.10.10.1
10.10.10.2