如何将docker容器的根目录挂载为NFS挂载点

Posted

技术标签:

【中文标题】如何将docker容器的根目录挂载为NFS挂载点【英文标题】:How to mount the root directory of docker container as a NFS mount point 【发布时间】:2015-10-16 06:49:18 【问题描述】:

我是 docker 新手,我正在尝试将 docker 容器的根目录挂载为 NFS 挂载点。 例如,我有一个 NFS 挂载点 test:/home/user/3243,我正在尝试:

docker run -it -v "test:/home/user/3243":/ centos7 /bin/bash

当然,它失败了。所以我尝试了这个:

mount -t nfs test:/home/user/3243 /mnt/nfs/3243
docker run -it -v /mnt/nfs/3243:/ centos7 /bin/bash

但又失败了,那怎么办呢?能解决吗?

【问题讨论】:

【参考方案1】:

这里有几个问题:

    您不能挂载到容器的根目录。所以docker run -v /foo:/ 永远不会起作用。

    使用您第一次尝试的语法-v test:/foo:bar,Docker 会将此视为想要创建一个名为“test”的“命名”卷。

您应该能够先进行 NFS 挂载,然后再进行 docker run -v /mnt/nfs/3243:/foo 以将 nfs 路径挂载到 /foo。 但同样,你不能挂载到/

【讨论】:

感谢您的帮助!对了,为什么不能挂载到容器的根目录?有这方面的文件吗? 因为这会覆盖整个容器 fs。 谢谢@cpuguy83!我在How to run docker container on high available storage like NFS,EBS,flock etc 发布我的原始目的,如果可能的话,想听听你的意见~【参考方案2】:

目前在issue 4213 中讨论(自 2014 年年中)。

Jeroen van Bemmel (jbemmel) 最近的一个解决方法是:

NFS 功能似乎取决于底层存储驱动程序(aufs、devicemapper 等),以及进程之间的文件句柄共享(参见博文“docker: devicemapper fix for “device or resource busy” (EBUSY)”),即“unshare”可能有对 NFS 挂载的影响。

我已不再使用“MOUNTPOINT=/vm/nfs”,因为我不确定是否会发出该事件。 相反,我创建了一个像这样的upstart 文件:

cat > /etc/init/ecdn.conf << EOF
description "eCDN container"
author "Jeroen van Bemmel"
# mounted MOUNTPOINT=/vm/nfs doesn't seem to work, at least not the first time
start on started docker and virtual-filesystems
stop on starting rc RUNLEVEL=[016]
respawn
script
exec /usr/bin/docker start -a ecdn
end script

pre-stop script
/usr/bin/docker stop ecdn
# dont /usr/bin/docker rm ecdn
end script

EOF

然后像这样创建容器:

script -c "docker create -it --name='ecdn' --volume /vm:/usr/share/nginx/html/vm:ro image/name"

【讨论】:

感谢您的回答,我有两点很重要:使用 NFS 和挂载在根目录上。我在 NFS 挂载上看到了这个问题,你知道如何挂载到根目录吗?

以上是关于如何将docker容器的根目录挂载为NFS挂载点的主要内容,如果未能解决你的问题,请参考以下文章

将 NFS docker 卷中的单个文件挂载到容器中

k8s文件挂载权限分析

挂载nfs卷时如何解决postgresql docker容器的chown权限问题?

KUBERNETES05_NFS坏境搭建PVPVC挂载目录ConfigMap挂载文件Secret挂载敏感信息

KUBERNETES05_NFS坏境搭建PVPVC挂载目录ConfigMap挂载文件Secret挂载敏感信息

docker给已经启动容器添加挂载目录