Docker数据卷

Docker数据卷原理

docker数据卷
  • 数据卷是目录或文件,不是块设备。
  • 容器可以读写volume中的数据。
  • volume数据可以持久化保存。
为什么要用数据卷
  • docker分层文件系统:性能差;生命周期与容器相同
  • docker数据卷:mount到主机中,绕开分层文件系统;和主机磁盘性能相同,容器删除后依然保留;
    仅限本地磁盘,不能随容器迁移。
  • docker提供了两种卷:bind mount,docker managed volume

bind mount

  • 是将主机上的目录或文件mount到容器里。
  • 使用直观高效,易于理解。
  • 使用 -v 选项指定路径,格式 :
  • bind mount 默认权限是读写rw,可以在挂载时指定只读ro。-v选项指定的路径,如果不存在,挂载时会自动创建。

docker managed volume

  • bind mount必须指定host文件系统路径,限制了移植性。
  • docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录。
  • 默认创建的数据卷目录都在 /var/lib/docker/volumes 中。
  • 如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。
bind mount与docker managed volume对比

相同点:两者都是 host 文件系统中的某个路径。
不同点:
在这里插入图片描述
区别举例:

[root@server1 _data]# docker run -d --name vm1 -v /data:/usr/share/nginx/html nginx     #将容器的nginx默认发布目录挂在到任意目录
[root@server1 _data]# docker ps 
[root@server1 _data]# docker inspect vm1
[root@server1 _data]# curl 172.17.0.2    #403forbidden


[root@server1 _data]# docker run -d --name vm2 -v vol1:/usr/share/nginx/html nginx    #指定挂载点/var/lib/docker/volumes/vol1/_data
[root@server1 _data]# docker volume ls
[root@server1 _data]# docker inspect vm2
[root@server1 _data]# curl 172.17.0.3    #可以正常访问。

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

bind mount卷示例
  • 创建容器。
[root@server1 tmp]# mkdir data1
[root@server1 tmp]# mkdir data2
[root@server1 tmp]# docker run -it --name vm1 -v /tmp/data1:/data1 rhel7 bash
[root@server1 tmp]# docker run -it --name vm2 -v /tmp/data2:/data2:ro rhel7 bash   #只读
  • 测试挂载目录权限。
    在这里插入图片描述
    在这里插入图片描述
docker managed volume示例
  • 查看现在所有的容器并清除,清除后发现管理卷仍然存在,这是我们就需要去清理它,不然会占用我们的资源。
[root@server1 tmp]# docker ps -a 
[root@server1 tmp]# docker rm -f vm1 vm2
[root@server1 tmp]# docker ps  -a 
[root@server1 ~]# docker volume ls 
[root@server1 ~]# docker volume prune 
[root@server1 ~]# docker volume ls 
  • 使用registry镜像创建一个新的容器。
[root@server1 tmp]# docker run -d --name registry registry:2 
[root@server1 tmp]# docker volume ls

在这里插入图片描述

  • 查看registry的相关信息。
[root@server1 tmp]# docker inspect registry | grep Source

Source就是volume在host中的目录,是docker自动为容器生成的目录,如果
挂载时指向的已有目录,原有数据会被复制到volume中。
注意,即使删除容器,管理卷也不会删除。

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

  • 我们会发现,docker自动生成的目录名称会很长,不方便书写使用。我们可以在创建容器时自己定义目录名称。
    首先,我们需要先创建卷。
[root@server1 tmp]# docker volume create vol1     #创建卷vol1
vol1
[root@server1 tmp]# docker volume ls
[root@server1 tmp]# docker volume inspect vol1

在这里插入图片描述

  • 接下来,创建新的容器并将管理卷voll挂载到容器内的指定目录。
[root@server1 tmp]# docker run -d --name vm1 -v vol1:/var/lib/registry registry:2 
[root@server1 tmp]# docker inspect vm1

在这里插入图片描述

卷插件

  • docker 卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动,可以查看一链接:https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins
  • docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。https://docs.docker.com/engine/extend/plugins_volume/#volume-plugin-protocol
    在这里插入图片描述
  • Docker Plugin 是以Web Service的服务运行在每一台Docker Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信。
  • Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件。
  • 当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的 socket 文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。

convoy卷插件

实验准备

准备两台主机,并安装好Docker服务

  • 首先删除两台主机上所有的容器,删除之前的数据卷。
[root@server1 tmp]# docker rm -f `docker ps -aq`   -q便是查询
[root@server1 tmp]# docker volume rm vol1 
[root@server1 tmp]# docker ps 
[root@server1 tmp]# docker volume prune 
[root@server1 tmp]# docker volume ls
  • 在server1和server2上搭建nfs文件系统:
    server1:
[root@server1 ~]# yum install nfs-utils.x86_64 -y
[root@server1 ~]# systemctl start rpcbind    #rpcbind服务必须是开启的。这是因为:他是一个RPC服务,主要是在nfs共享时候负责通知客户端,服务器的nfs端口号的。简单理解rpc就是一个中介服务。
[root@server1 ~]# mkdir /mnt/nfs     #创建共享目录
[root@server1 ~]# chmod 777 /mnt/nfs/       #修改共享目录的权限
[root@server1 ~]# vim /etc/exports   #编辑共享目录文件,否则将不会被共享出去,
[root@server1 ~]# cat /etc/exports   
/mnt/nfs	*(rw,no_root_squash)       no_root_squash 当客户端使用哪个用户身份挂载时,沿用客户端的用户身份到服务器端
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# showmount -e
Export list for server1:
/mnt/nfs *

在这里插入图片描述
server2上:

[root@server2 ~]# yum install nfs-utils.x86_64 -y
[root@server2 ~]# systemctl start rpcbind
[root@server2 ~]# showmount -e 172.25.11.1
Export list for 172.25.11.1:
/mnt/nfs *
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# mount 172.25.11.1:/mnt/nfs/ /mnt/nfs/
[root@server2 ~]# df

在这里插入图片描述测试:分别在server1和server2新建或删除文件测试。

[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls
file
[root@server1 nfs]# rm -f file 
[root@server1 nfs]# ls
[root@server1 nfs]# 

[root@server2 ~]# cd /mnt/nfs/
[root@server2 nfs]# touch file
[root@server2 nfs]# ls
file
[root@server2 nfs]# ls
[root@server2 nfs]# 
配置convoy环境
  • docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。
    server1:
[root@server1 ~]# tar zxf convoy.tar.gz 
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy  convoy-pdata_tools  SHA1SUMS
[root@server1 convoy]# mv convoy convoy-pdata_tools /usr/local/bin/
[root@server1 convoy]# cd /usr/local/bin/
[root@server1 bin]# ls
convoy  convoy-pdata_tools
[root@server1 bin]# scp convoy convoy-pdata_tools server2:/usr/local/bin/
[root@server1 bin]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &   #值的注意的是:第一次运行上面的convoy daemon命令的时候,会在/mnt/nfs目录下生成一个config文件夹,这个文件夹不要删除
,不然客户端的convoy命令就会用不了

在这里插入图片描述

[root@server1 bin]# cd /mnt/nfs/
[root@server1 nfs]# ls
config
[root@server1 nfs]# cd /var/run/
[root@server1 run]# ll convoy/convoy.sock 
srwxr-xr-x 1 root root 0 Aug  6 10:36 convoy/convoy.sock
[root@server1 run]# pwd
/var/run
[root@server1 run]# mkdir /etc/docker/plugins
[root@server1 run]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec    #将convoy守护进程开启生成的.sock文件放入/etc/docker/plugins目录下的convoy.spec文件中,
docker就可以识别。(其中convoy.spec文件之前是不存在的)
[root@server1 run]# cat /etc/docker/plugins/convoy.spec
unix:///var/run/convoy/convoy.sock

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

创建卷
  • 创建卷:convoy create vol1
  • 自动生成数据目录:/mnt/nfs/vol1/
[root@server1 nfs]# docker volume ls 
DRIVER              VOLUME NAME
[root@server1 nfs]# convoy create vol1
vol1
[root@server1 nfs]# ll
total 0
drwx------ 2 root root 34 Aug  6 10:44 config
drwx------ 2 root root  6 Aug  6 10:44 vol1
[root@server1 nfs]# convoy list    #列出所有卷

在这里插入图片描述

  • 在server2上配置convoy环境.
[root@server2 run]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
[root@server2 run]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server2 run]# cd /mnt/nfs/
[root@server2 nfs]# ls
config  vol1
[root@server2 nfs]# convoy list

在这里插入图片描述

操作卷
  • 列出所有卷。
[root@server2 nfs]# convoy list
{
	"vol1": {
		"Name": "vol1",
		"Driver": "vfs",
		"MountPoint": "",
		"CreatedTime": "Tue Aug 06 10:44:41 +0800 2019",
		"DriverInfo": {
			"Driver": "vfs",
			"MountPoint": "",
			"Path": "/mnt/nfs/vol1",
			"PrepareForVM": "false",
			"Size": "0",
			"VolumeCreatedAt": "Tue Aug 06 10:44:41 +0800 2019",
			"VolumeName": "vol1"
		},
		"Snapshots": {}
	}
}
  • 使用卷。
[root@server1 bin]# docker run -it --name vm1 -v vol1:/data --volume-driver=convoy ubuntu

在这里插入图片描述

[root@server2 nfs]# docker run -it --name vm1 -v vol1:/data --volume-driver=convoy ubuntu

在这里插入图片描述

  • 由上可知server1和server2上看到的内容一致,即不同主机间实现了共享存储。
创建convoy卷的快照
[root@server1 bin]# convoy snapshot create vol1 --name voll_pic   #--name前面的是卷名,加--name,否则卷名会随即分配。
[root@server1 bin]# convoy list

在这里插入图片描述

总结

convoy卷插件子命令

convoy list		列出卷
convoy delete		删除卷
convoy snapshot create	创建快照
convoy snapshot delete	删除快照
convoy backup create		创建备份
convoy create res1 --backup <url>		还原备份
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值