在 docker 容器内安装 nfs 共享
Mounting nfs shares inside docker container
有谁知道如何使用 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
保留 all 功能,感谢@earcam 建议改用 --cap-add
]。
在主机上挂载 NFS 共享并将其作为主机卷传递到容器中:
you@host > mount server:/dir /path/to/mount/point
you@host > docker run -v /path/to/mount/point:/path/to/mount/point
使用 Docker 卷插件(如 Netshare 插件)直接将 NFS 共享挂载为容器卷:
you@host > docker run \
--volume-driver=nfs \
-v server/dir:/path/to/mount/point \
centos
对于已接受答案中列出的第二个选项,我不确定您是否真的尝试使用 "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,即运行 as "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
CentOS安装nfs工具包并挂载nfs
[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
从 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
通过向客户端容器添加 --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 容器中正确安装 ..
另外不要忘记在您的 docker 容器中安装必要的 nfs 客户端包。在基于 debian 的容器上:
apt-get install -y nfs-common
有谁知道如何使用 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
保留 all 功能,感谢@earcam 建议改用--cap-add
]。 在主机上挂载 NFS 共享并将其作为主机卷传递到容器中:
you@host > mount server:/dir /path/to/mount/point you@host > docker run -v /path/to/mount/point:/path/to/mount/point
使用 Docker 卷插件(如 Netshare 插件)直接将 NFS 共享挂载为容器卷:
you@host > docker run \ --volume-driver=nfs \ -v server/dir:/path/to/mount/point \ centos
对于已接受答案中列出的第二个选项,我不确定您是否真的尝试使用 "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,即运行 as "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
CentOS安装nfs工具包并挂载nfs
[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
从 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
通过向客户端容器添加 --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 容器中正确安装 ..
另外不要忘记在您的 docker 容器中安装必要的 nfs 客户端包。在基于 debian 的容器上:
apt-get install -y nfs-common