Docker篇——容器数据卷(挂载),了解具名挂载、匿名挂载以及数据卷容器,一篇文章通关常见数据卷技术点!

理解和认识容器数据卷

一、什么是容器数据卷
如果数据存在容器中,那么我们容器删除了,数据也会随之丢失。所以容器数据的持久化是非重要的!容器数据卷技术就是可以实现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的容器数据卷相关技术点已经介绍完毕,后续还会持续更新,敬请期待~

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Be explorer

若认可笔者文章,手头富裕望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值