如何将docker容器的根目录挂载为NFS挂载点
我是新来的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
但又失败了,所以怎么做? 能解决吗?
这里有几个问题:
-
您无法挂载到容器的根目录。 所以
docker run -v /foo:/
将永远不会工作。 -
用你第一次尝试的语法,
-v test:/foo:bar
,Docker会认为这是想创build一个名为“test”的“named”卷。
你应该可以先做NFS挂载,然后执行docker run -v /mnt/nfs/3243:/foo
将nfspath挂载到/foo
。 但是,再次,你不能挂载到/
。
目前正在讨论(自2014年年中以来) 第4213期 。
Jeroen van Bemmel(jbemmel)最近的一个解决方法是:
看起来,NFSfunction依赖于底层的存储驱动程序(aufs,devicemapper等),以及进程之间文件句柄的共享(请参阅博客文章“ docker:
devicemapper
修复”设备或资源繁忙“(EBUSY
) ” )即“不共享”可能会影响NFS挂载。我不再使用'
MOUNTPOINT=/vm/nfs
',因为我不确定这个事件是否发生。
相反,我创build了一个像这样的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
然后像这样创build容器:
script -c "docker create -it --name='ecdn' --volume /vm:/usr/share/nginx/html/vm:ro image/name"