操作加深理解:
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.也给外部访问容器文件一个便捷的方法
- 不用进入容器内部访问和修改文件了