文章目录
什么是Docker数据卷
数据卷是一个或多个容器中专门指定的目录,它能够绕过联合文件系统。
卷被设计用作数据持久化、并且是独立于容器的生命周期的。
因此,Docker不会在删除容器时自动删除数据卷卷,也不会主动“垃圾回收”掉容器不再使用的卷。
数据卷的存在就是想让的容器的数据持久化存在,而且可以实现容器之间的数据共享。
通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。
数据卷的类型:
①宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount)
②命名的数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。
③匿名数据卷:磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件
数据卷其实都在(如果没有网络文件系统等情况下)宿主机文件系统里面的,只是第一种是在宿主机内的特定目录下,而后两种则在docker管理的目录下,这个目录一般是 /var/lib/docker/volumes/
数据卷的特点
(1)数据卷可以在容器之间共享或重用数据
(2)数据卷中的更改可以直接生效
(3)数据卷中的更改不会包含在镜像的更新中
(4)数据卷的生命周期一直持续到没有容器使用它为止
为什么要用数据卷
Docker数据卷管理
bind-mount形式
1.
2.
3.
2.
指定了ro时,发现不能写文件
docker管理卷
1.
2.
3.
2.
bind-mount和managed volume的对比
bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源。
卷插件管理
基本概念
如果想实现跨主机的容器之间的数据共享就要使用卷插件
使用了卷插件才可以使用网络文件系统实现数据共享
docker 卷默认使用的是local类型的驱动,只能存在宿主机
跨主机的volume就需要使用第三方的驱动,可以查看链接发现卷驱动。
docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。
Docker Plugin 是以Web Service的服务运行在每一台Docker Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信
Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件
当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的 socket 文件
建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求
convoy卷插件
convoy卷插件支持三种运行方式:devicemapper、NFS、EBS
。下面的实验以nfs的运行方式来演示
实验目的:在ser2和ser 1 底层用nfs来实现数据共享,
但是docker并不会直接访问 nfs可以使用卷插件convoy来
指引docker引擎访问底层实现的nfs, nfs上有数据卷
1.(1)首先在ser2和ser1上搭建nfs文件系统(ser2主节点)
ser2
root@ser2 ~]# yum install -y nfs-utils 安装
[root@ser2 ~]# systemctl start rpcbind
[root@ser2 ~]# mkdir /nfs 创建共享目录
[root@ser2 ~]# chmod 777 /nfs 修改共享目录权限
[root@ser2 ~]# vim /etc/exports 编辑共享目录文件,否则将不会被共享出去
[root@ser2 ~]# cat /etc/exports
/nfs *(rw,no_root_squash)
[root@ser2 ~]# systemctl start nfs
ser1:
[root@ser1 ~]# yum install -y nfs-utils
[root@ser1 ~]# systemctl start nfs-server.service
[root@ser1 ~]# showmount -e ser2
Export list for 172.25.2.3:
/nfs *
[root@ser1 ~]# mkdir /nfs
[root@ser1 ~]#
[root@ser1 ~]# mount 172.25.2.3:/nfs/ /nfs/
rpcbind服务必须是开启的。
这是因为:他是一个RPC服务,主要是在nfs共享时候负责通知客户端,服务器的nfs端口号的。
简单理解rpc就是一个中介服务。
在从节点上查看到,并且挂载
在ser1中测试时。发现并不能删除
重新在ser1中编辑文件 /etc/exports文件
ser1中测试时可以了
最后再实现资源共享
配置convoy环境
docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。
1.在ser2和ser1中,安装convoy插件
在ser1中
在ser2中,创建convoy的数据目录
在ser1中也做同样的操作
在ser2中启动convoy服务
第一次运行上面的convoy daemon命令的时候,会在/mnt/nfs目录下生成一个config文件夹,这个文件夹不要删除,不然客户端的convoy命令就会用不了
将convoy守护进程开启生成的.sock文件放入/etc/docker/plugins目录下的convoy.spec文件中,docker就可以识别。(其中convoy.spec文件之前是不存在的)
在ser1中也启动服务
创建卷
1.在ser2中创建卷vol1
2.
3.在ser2中运行容器时指定卷为刚才新创建的vol1
4.
在ser1中发现新创建的index.html文件
5.
6.在ser1中也可以运行容器,也可以用到共享的数据卷
7.在ser1中创建数据卷vol2
8.
9.如何删除通过nfs创建的数据卷,让之后创建的数据卷都是本地的 呢
10.
10.创建本地数据卷,并且在创建时指定数据卷的名称
11.
12.
13.删除多余的卷