理解和认识容器数据卷
一、什么是容器数据卷
如果数据存在容器中,那么我们容器删除了,数据也会随之丢失。所以容器数据的持久化是非重要的!容器数据卷技术就是可以实现Docker容器中的产生的数据,同步到本地,并且容器之间也可以实现数据共享。实现持久化的根本就是挂载!将容器中的数据文件挂载在宿主机的文件系统中!
二、原理图
三、使用数据卷技术
(一)方式一:直接使用-v命令来挂载
1、查看本机的home目录,确保没有ceshi文件夹
[root@test home]# ls
11.txt cc.jpg clean_log62bdb09731be0.jpg clean_log62eb9476ec8d1.jpg jiangxiansheng
1.png clean_log1.php clean_log62eb79942206e.jpg clean_log62eb954e5ce4c.jpg
2、执行挂载命令
docker run -it -v /home/ceshi:/home centos /bin/bash
#-v类似于端口映射,这里就是挂载路径映射,本机的路径映射容器文件的路径
3、测试宿主机上是否新创建了一个ceshi文件
[root@test ~]# cd /
[root@test /]# cd home/
[root@test home]# ls
11.txt cc.jpg clean_log62bdb00bde897.jpg clean_log62eb9471e8f8c.jpg jiangjiang
1.png ceshi clean_log62bdb09731be0.jpg clean_log62eb9476ec8d1.jpg jiangxiansheng
4、测试查看容器的元数据,观察能否找到挂载的信息
docker inspect 容器ID
5、进入到容器的home目录下创建文件,观察能否在主机的/home/ceshi目录下同步得到创建的文件
(1)容器中
[root@test /]# docker exec -it 7bc4548c3a1a /bin/bash
[root@7bc4548c3a1a /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@7bc4548c3a1a /]# cd home/
[root@7bc4548c3a1a home]# ls
[root@7bc4548c3a1a home]# touch gh666.java
(2)宿主机
[root@test ceshi]# ls
gh666.java
注意:类似于Vue中的双向绑定,当我们在宿主机上的目录下创建文件,那么容器中的对应的文件夹下也会同步得到相关的文件!
还有一种情况是容器关闭并且退出了,但是宿主机上的文件发生改变,当我们启动容器,对应映射文件夹下的文件依旧是可以被同步
四、容器数据卷的优势
1、我们以后修改什么配置文件,直接在本地服务器上修改即可,会自动同步到相关的容器中!
2、实现数据的持久化,就算容器被删除了,数据也会在本地可以查到!
匿名挂载和具名挂载
一、匿名挂载
1、匿名挂载命令
docker run -d -P --name 容器名称 -v 容器内路径 容器名
2、测试
[root@test /]# docker run -d -P --name nginx01 -v /etc/nginx nginx
dc381a632ca1a41a92ad5af173823f501a9e5765a3311b4233cc8dfa6a96eb16
通过volume命令来查看卷的情况信息
发现数据卷的名字是随机生成的!
[root@test /]# docker volume ls
DRIVER VOLUME NAME
local f6847d6692e42b42a9a971447cdaa9300d14bdb0ef96434c494eed7df2c71c3e
二、具名挂载
1、具名挂载命令
docker run -d -P --name 容器名称 -v 卷名:容器内路径
2、测试
[root@test /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
08f00cba5ff74b375cb907280a0bea2ef275a19d68cc2f02d8ee9ef9befe9a0c
通过volume命令来查看卷的情况信息
出现了一个有准确名字的卷名
[root@test /]# docker volume ls
DRIVER VOLUME NAME
local f6847d6692e42b42a9a971447cdaa9300d14bdb0ef96434c494eed7df2c71c3e
local juming-nginx
3、查看卷的具体信息,查看默认的宿主机挂载路径
docker volume inspect juming-nginx
所有容器内的卷未指定目录的都默认在这个路径下
我们可任意通过具名挂载方便的找到卷的位置,大多数的情况下都在使用具名挂载!
三、匿名、具名、指定路径挂载区别
四、挂载常见的参数
我们常常会在-v后面加上ro或者rw的命令,分别是只读和可读可写的权限
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx #容器对挂载出来的文件内容设置了权限,为只读,重点是只能在宿主机上修改,不能在容器内修改!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx #挂载出来的文件,可读可写!系统默认的状态
数据卷容器
现在还有一个应用场景,多个MySQL数据库中需要数据进行同步,那么就需要用到数据卷容器了!
容器和容器之间的双向数据共享,也是需要用到数据卷容器技术!
一、使用方法
测试启动三个容器
1、启动上一篇文章中创建的带两个数据卷的gh/centos镜像,作为父容器
查看该容器中的信息,包含了我们之前创建的两个数据卷
2、通过Ctrl+P+Q命令退出但是不关闭容器,启动第二、三个容器,作为子容器
启动二个容器的时候,和常规启动不同,命令如下
docker run -it --name docker02 --volumes-from docker01 gh/centos /bin/bash #--volumes-from
docker01命令就是docker02容器绑定docker01容器,当01容器数据发生了改变,02容器就会实时更新
3、进入正在运行的docker01容器
[root@test ~]# docker attach 14f89aec98bd
4、在docker01的容器中,对数据卷文件进行更新,发现在docker02容器中数据也会实时的更新
[root@test ~]# docker attach 14f89aec98bd
[root@14f89aec98bd /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@14f89aec98bd /]# cd volume01
[root@14f89aec98bd volume01]# ls
[root@14f89aec98bd volume01]# touch java666.java #在docker01中的数据卷文件中更新数据,创建一个新的文件!
[root@14f89aec98bd volume01]# ls
java666.java
[root@14f89aec98bd volume01]# [root@test ~]# docker attach 70bb0c746491 #进入到docker02容器
[root@70bb0c746491 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@70bb0c746491 /]# cd volume01
[root@70bb0c746491 volume01]# ls #查看docker02容器中数据确实更新了!
java666.java
总结:
其实其他的容器通过--volumes-form命令进行绑定,底层就是和被绑定的容器共享一个挂载在本地的文件,当建立了共享关系,那么无论哪个容器内的内容发生了改变,都会同步修改本地的挂载文件,这样就实现了容器间的数据共享。
如果我们想搭建一个集群,不同容器之间的配置文件可以实现共享配置,数据卷容器的生命周期会一直持续到没有人挂载该容器为止!
至此,关于Docker的容器数据卷相关技术点已经介绍完毕,后续还会持续更新,敬请期待~