如何将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卷时如何解决postgresql docker容器的chown权限问题?
KUBERNETES05_NFS坏境搭建PVPVC挂载目录ConfigMap挂载文件Secret挂载敏感信息