一个例子带你理解docker数据卷挂载的含义

操作加深理解:

1.我在centos7服务器的根路径上传了一个文件夹demo ,现在要用docker运行起来

[root@mikasa /] ls
bin   demo  dev  home  lib64   media  opt   root  sbin  sys  usr

2.将根路径下的 demo文件夹作为运行容器的映射文件夹(进入容器可以通过容器的根路径下的demo访问到服务器根路径下的demo文件夹)

[root@mikasa /] docker run -d -it -p 3000:3000 -v /demo:/demo --name node 

2.1.查看当前服务器demo文件夹下的文件

[root@mikasa /] cd demo
[root@mikasa demo] ls
app.c  app.cpython-34m.so  build  log.out

3.进入容器

[root@mikasa /] docker exec -it node bash

4.进入容器默认位于容器根路径 进入demo查看文件列表

root@13808c63de80:/ cd demo
root@13808c63de80:/demo ls
app.c  app.cpython-34m.so  build  log.out

5.在服务器的demo文件夹内生成一个文件 a.txt

[root@mikasa demo] touch a.txt

 6.进入容器 再次进入demo查看文件列表 发现a.txt文件存在

root@13808c63de80:/demo ls
a.txt  app.c  app.cpython-34m.so  build  log.out

了解原理加深理解

数据卷使用到的挂载技术, Linux 的绑定挂载(bind mount)机制

绑定挂载(bind mount)机制

允许你将一个目录或者文件,挂载到一个指定的目录上。并且,你在该挂载点上(/test)进行的任何操作,只是发生在被挂载的目录或者文件上(/home),而原挂载点(/test)的内容则会被隐藏起来且不受影响。

绑定挂载实际上是一个 inode 替换的过程。在 Linux 操作系统中,inode 可以理解为存放文件内容的“对象”,而 dentry,也叫目录项,就是访问这个 inode 所使用的“指针。

 上图所示,mount --bind /home /test,会将 /home 挂载到 /test 上。其实相当于将 /test 的 dentry,重定向到了 /home 的 inode。这样当我们修改 /test 目录时,实际修改的是 /home 目录的 inode。这也就是为何,一旦执行 umount 命令,/test 目录原先的内容就会恢复:因为修改真正发生在的,是 /home 目录里。

docker数据卷的意义:

1.对容器数据进行一个持久化

        - 如果不数据进行持久化,容器销毁数据就销毁了

2.可以让多个容器实现数据共享

        - 例如使用 docker compose进行rabbitmq集群的搭建,多个节点需要共同的 erlang-cookie,三个容器可以共同挂在一个文件夹实现共享

3.也给外部访问容器文件一个便捷的方法

        - 不用进入容器内部访问和修改文件了

猜你喜欢

转载自blog.csdn.net/weixin_52156647/article/details/129548102
今日推荐