一、问题
我们已经在本章第四小节学习了如何将宿主机的卷挂载到容器中,那如何和其他容器共享在一个容器中定义的卷?这样做的优点是让Docker负责管理卷,并且遵循单一职责。
二、解决方案
在范例4中我们学会了如何将宿主机的文件挂载到容器中,可以使用docker run命令的-v参数选项指定宿主机中的卷,以及该卷在容器中要挂载的路径。如果省略了宿主机的路径,那么你就创建了一个称为数据容器的容器。
容器启动以后会在内部创建参数中指定的卷,这是一个具备读写权限的文件系统,它不在容器镜像最顶层的只读层之上。Docker会负责管理这个文件系统,但你也可以在宿主机上对其进行修改。如下
$ docker run -it -v /ubuntu ubuntu bashroot@93306861c387:/#touch /ubuntu/orangeroot@93306861c387:/#exit$ docker inspect -f {{.Mounts}} 93306[{volume de30d7f68b906936227659def04f140525b4c68c1879acd4c8a11b512c23332f\/var/lib/docker/volumes/de30d7f68b906936227659def04f140525b4c68c1879acd4c8a11b512c23332f\/_data /ubuntu local true }]$ sudo ls /var/lib/docker/volumes/de30d7f68b906936227····orange
容器启动以后Docker会创建/ubuntu 目录。在容器中,可以对这个目录进行读写操作。推出容器以后可以通过inspect命令来查看这个数据卷被保存到了什么位置。Docker会在/var/lib/docker/volumes/下为这个卷创建对应的文件夹。任何修改都会被同步。
为了将容器中的卷共享给其他容器,我们可以使用 —volumes-from选项。我们重新创建一个数据容器,让后创建另一个容器来挂载数据容器中共享的卷,如下所示。
$ docker run -v /data --name data ubuntu$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES$ docker inspect -f {{.Mounts}} data[{volume c81501e3acc0005ca91ae7120bc15b5cac33c98a7bcff247f111f3e6cd128897/var/lib/docker/volumes/c81501e3acc0005ca91ae71········
有点奇怪,这个容器并没有处于运行状态,但是它的映射关系以及存在,并且被持久化到 /var/lib/docker/volumes/下面。你可以通过docker rm -v data 命令来删除容器和它的卷。如果你没有使用rm -v选项来删除容器和它的卷,那么系统中将会遗留很多没有被遗弃的卷。
即使这个数据容器没有运行,你也可以通过 —volumes-from来挂载其中的卷,如下所示。
$ docker run -it --volumes-from data ubuntu bashroot@cbf63ae969b9:/# touch /data/orangeroot@cbf63ae969b9:/# exitexit$ sudo ls /var/lib/docker/volumes/c81501e3acc0005ca91ae71········orange
三、思考
这些都是基础的卷共享,只能实现单宿主机多容器之间的共享。什么办法能实现集群之间多宿主机多容器之间的共享呢?
答案就是NFS(network filesystem)
