docker(容器)——容器数据卷管理的详解(共享数据)+docker managed volume数据卷

一、什么是Dokcer容器的数据卷?
【数据卷是一个或多个容器中专门指定的目录,它能够绕过联合文件系统。】
卷被设计用作数据持久化、并且是独立于容器的生命周期的。
因此,Docker不会在删除容器时自动删除数据卷卷,也不会主动“垃圾回收”掉容器不再使用的卷。说白了,数据卷的存在就是想让容器的数据持久化存在,而且可以实现容器之间的数据共享;当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的;’但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的;Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的;而且容器之间我们希望能够实现数据共享;通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中;由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。
有三种数据卷类型:

1.宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount)
2.命名的数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。
3.匿名数据卷:磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件

数据卷其实都在(如果没有网络文件系统等情况下)宿主机文件系统里面的,
只是第一种是在宿主机内的特定目录下,而后两种则在docker管理的目录下,这个目录一般是 /var/lib/docker/volumes/
二、数据卷的特点
1)数据卷可以在容器之间共享或重用数据;
2)数据卷中的更改可以直接生效;
3)数据卷中的更改不会包含在镜像的更新中;
4)数据卷的生命周期一直持续到没有容器使用它为止;
三、如何添加数据卷?
添加数据卷的方式有两种:
第一种是直接通过命令行挂载
第二种是通过dockerFile添加
(1)第一种通过命令行挂载的方式,命令如下:

docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名

这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享
如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果

docker ps -a     查看出容器的id
docker inspect  容器id

上面的命令可以查看容器的详细情况,命令返回的是JSON格式的字符串;
运行命令之后我们在返回的JSON字符串中找到Volumes属性;
假如挂载成功的话,Volumes里面显示的绑定结果应该是你在挂载时输入的命令参数 (/宿主机绝对路径目录: /容器内目录 )
如果与之前输入的命令一致的话,证明挂载成功;
PS: Volumes里面显示的绑定结果可能有多个,但是只要找到目标结果就可以;
挂载之后,当容器停止运行的时候,宿主机上对数据卷做的内容修改是会同步到容器内的;
我们再挂载的时候还可以给数据卷加上权限,假如我们要宿主机只能读取容器的数据卷内容不能修改,我们可以添加只读权限;

docker run -it -v /宿主机绝对路径目录 : /容器内目录  :ro 镜像名

至于只写的话我们一般不会用到,要么就是读写,要么就是只读,我们可以通过docker inspect 来查看容器的volumesRW来查看容器内数据卷的读写权限
第二种就是利用dockerFile的形式添加
dockerFile对于docker镜像而言就如同java中某个类的.class文件对应上该类的.java文件

首先在linux服务器根目录上新建docker文件夹并建立DockerFile文件
使用volume命令;
(出于可移植可分享的的考虑,用以上 -v /宿主机绝对路径目录 : /容器内目录 的这种方式不能够直接在dockerFile中直接实现,
因为宿主机目录是依赖于特定的宿主机,并不能保证所有的宿主机都存在这样特定的目录);

编写的dockerFile文件如下

FROM  镜像名
VOLUME ["/生成的目录路径"]  -- privileged=true
CMD echo "success build"
CMD /bin/bash

相当于命令行: docker run -it -v /宿主机目录路径 : /生成的目录路径
然后我们通过命令行docker build执行我们写好的dockerFile文件
(docker build和docker commit两个命令都可以建立docker镜像,docker commit 需要在容器内进行,docker build 不需要)

docker build -f  /docker/DockerFile -t  命名空间/镜像名

执行后输入docker images就可以发现自己通过DockerFile所build的镜像,里面有挂载数据卷
3.1那么宿主机所对应的目录到底是什么呢?
同上,我们可以通过docker inspect来查看当前容器的Volumes,里面会有宿主机的数据卷目录
docker容器数据卷,它的作用相当于生活中的活动硬盘
3.2那么什么是docker数据卷容器?
数据卷容器就相当于把多个活动硬盘再挂载到一个活动硬盘上,实现数据的传递依赖。
官网解析:命名的容器挂载数据卷,其他的容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,我们称为数据卷容器。
四、bindmount:将主机上的目录或文件直接mount到容器里,使用直接,高效
docker数据卷是mount到宿主机中,绕开了分层文件系统,和主机磁盘性能相同,容器 删除后依然保留,但是仅限本地磁盘,不能随容器迁移 。

使用 -v 选项指定路径    -v选项指定的路径,如果不存在,挂载时会自动创建。
[root@server1 ~]# docker run -d --name web1 -p 80:80 -v  /opt/website:/usr/share/nginx/html nginx  容器里面的nginx默认发布目录://usr/share/nginx/html
9ecdca0e273a0599675516beac71c014e42072bf7282c7e3360d43012dee427d
[root@server1 ~]# curl localhost   测试访问失败因为默认发布目录没有资源
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>
[root@server1 ~]# docker exec web1 mount   在容器里面执行挂载,但是不进入容器
并且可以看到/dev/mapper/rhel-root,也就是根目录挂载到容器的/usr/share/nginx/html

在这里插入图片描述
添加一个默认发布页面
在这里插入图片描述
那么之前的Ubuntu就可以这样进入为什么呢?
查看构建历史发现nginx镜像只运行了nginx,没有交互式的shell界面二Ubuntu却有。
在这里插入图片描述
正确进入应用型容器
在这里插入图片描述
此种方式,不存在的目录会自动创建(无论是主机还是容器)。但是会以宿主机为准,绑定挂载到容器上,容器中若存在对应的目录或文件存有数据则会被直接覆盖,
【bind、mount】方式挂载是默认的权限是rw,可以在挂载是指定只读。
来测试以下挂载只读和读写权限。宿主机不受约束,只是挂载权限
在这里插入图片描述
接下来配置yum源

 要给一个bash 方便查看
[root@server1 ~]# docker run -it --name vm2 -v /etc/yum.repos.d/westos.repo:/etc/yum.repos.d/westos.repo rhel7 bash
加上ro表示只读不能对yum源做更改
[root@server1 ~]#  docker run -it --name vm2 -v /etc/yum.repos.d/westos.repo:/etc/yum.repos.d/westos.repo:ro rhel7 bash

在这里插入图片描述
五、docker managed volume数据卷的演示

5.1bind mount必须指定host文件系统路径,移植性差。(若容器在A主机上crash掉,B上面也没有对应的路径那么将无法移植)
5.1docker managed volume 不需要指定mount源。docker自动容器创建,默认数据卷都存放在/var/lib/docke/volumes下
若挂载指向的容器当中存有数据,则元数据会被移植到volumes中

[root@server1 ~]# docker run -d --name web1 -p 80:80 -v /usr/share/nginx/html nginx

在这里插入图片描述

[root@server1 ~]# docker inspect web1  查看详细信息
source就是volume在host中的目录,是docker自动为容器生成的目录,如果挂载时指向的已有目录,原有数据会被复制到volume中。
注意,即使删除容器,管理卷也不会删除。

在这里插入图片描述
在这里插入图片描述

cker自动生成的目录名称会很长,不方便书写使用。我们可以在创建容器时自己定义目录名称
[root@server1 ~]# docker run -d --name web2 -p 80:80 -v website2:/usr/share/nginx/html nginx  手动指定默认发布页面
[root@server1 ~]# curl localhost 访问
[root@server1 ~]# docker inspect web2  查看详细信息

在这里插入图片描述

[root@server1 ~]# docker rm -f web2

在这里插入图片描述

[root@server1 ~]# docker volume ls  再次查看 全部被清空不然会占用我们的资源
DRIVER              VOLUME NAME

另一种使用方法多个容器使用挂载到同一个目录

[root@server1 ~]# docker run -d --name web2 -p 80:80 -v website2:/usr/share/nginx/html nginx   运行容器并指定默认发布页面
96e8801facbbb38aa60da71e5a064a0ceec2f6a4fc515601dd347f8d96487a7c
[root@server1 ~]# docker inspect web2  查看详细信息

在这里插入图片描述
在这里插入图片描述
接下来我们运行一个容器并指定此容器的挂载目录为上面删除容器的默认发布目录

[root@server1 _data]# docker run -d --name web3 -p 80:80 -v website2:/usr/share/nginx/html nginx
ab3e7d6578c7e47575a58995f5044fdb4bb3d0e0fd94ee5f65d4ab91992892ed
[root@server1 _data]# curl localhost
www.westos.org
[root@server1 _data]# docker inspect web3

在这里插入图片描述
创建web3依然可以使用web2的数据
再次创建一个容器去掉端口映射测试

[root@server1 _data]# docker run -d --name web4 -v website2:/usr/share/nginx/html nginx
79086bf91d4fedbdfd4398e0b18184d45e7da726745e1ccf57fa8304929f4784
[root@server1 _data]# docker inspect web4

在这里插入图片描述

[root@server1 _data]# curl 172.17.0.3  访问ip创建web4依然可以使用web2的数据 
www.westos.org
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值