有时我们希望在容器的文件系统和宿主机的文件系统上搭一个桥,这时就要依靠数据卷技术。Volume技术可以让你把宿主机上的文件挂到容器里。具体地操作方法是:
docker run -v /test
docker run -v /home:/test
第一种方法是新建一个文件夹,挂载到容器的test目录下。第二种方法是把home文件夹挂载到test目录下。
第一种方法新建的文件夹位置在/var/lib/docker/volumes/volumeId/_data
而这个命令背后是如何实现的呢?
实现原理
上文提到过,挂载文件系统操作先指定挂载点,后进行chroot操作。
我们只需要在 rootfs 准备好之后,在执行 chroot 之前,
把 Volume 指定的宿主机目录(比如 /home 目录),
挂载到指定的容器目录(比如 /test 目录)在宿主机上对应的目录(即/var/lib/docker/aufs/mnt/[可读写层 ID]/test)上,
这个Volume的挂载工作就完成了。
更重要的是,由于在挂载文件夹的时候,已经开启了Mount Namespace,所以这个挂载是宿主机不可见的。
这种机制在linux上叫做绑定挂载机制。主要是说这个挂载的文件夹会正确地被容器修改,且不会影响挂载点原有的文件夹。
这个机制背后的原理
inode代表文件,目录是目录项。这种绑定挂载其实就是改变被挂载的目录项的指向。
这样在取消挂载的时候,恢复目录项指针,一切就恢复正常了。
同时,因为改变了test的指向,所以commit不会有影响。