Linux下docker的卷插件—convoy(一)

前面我们已经介绍过 docker卷(Volume)了,再介绍docker的卷插件会不会有点重复。其实是有必要的,因为docker卷存在一点局限,那么就是docker卷默认使用的是local类型的驱动,卷只能是存在于宿主机上,我们可以创建卷,但只是局限于宿主机。

跨主机的volume就需要使用第三方的驱动:https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins

docker官方提供了卷插件的api,在我知道的实现docker卷插件有flocker、convoy这两个插件。开发者可以根据实际需求定制卷插件驱动。

 

一.实验环境(rhel7.3版本)

1.selinux和firewalld状态为disabled

2.各主机信息如下:

主机ip
server1(安装好docker)172.25.83.1
server2(安装好docker)172.25.83.2

 

二.docker的卷插件convoy的实现

 

 

1.配置NFS环境

 

<1>在server1端(nfs服务的服务端):安装nfs服务对应的软件,启动nfs服务,并进行配置

 

(1)安装nfs服务对应的软件

[root@server1 ~]# yum install -y nfs-utils.x86_64 
  • 查看rpcbind服务是否是开启状态


值的注意的是:rpcbind服务必须是开启的。这是因为:他是一个RPC服务,主要是在nfs共享时候负责通知客户端,服务器的nfs端口号的。简单理解rpc就是一个中介服务。


 

(2)启动nfs服务

[root@server1 ~]# systemctl start nfs-server.service

 

(3)配置nfs

 

[root@server1 ~]# mkdir /mnt/nfs   #创建要共享的目录
[root@server1 ~]# chmod 777 /mnt/nfs/   #赋予共享目录/mnt/nfs目录777的权限,这步必须做,因为运行容器时,是以普通用户的身份运行的。如果没有写的权限,会报错。
[root@server1 ~]# vim /etc/exports   #编写共享目录的文件,这个文件是空的,需要自己填写
/mnt/nfs        *(rw,no_root_squash)

 

<2>在server2端(nfs服务的客户端):安装nfs服务对应的软件,启动nfs服务,查看server1(IP为172.25.83.1)的共享文件,进行挂载,并进行写操作的测试

 

(1)安装nfs服务对应的软件

[root@server2 ~]# yum install -y nfs-utils.x86_64

 

(2)启动nfs服务

[root@server2 ~]# systemctl start nfs-server.service

 

(3)查看server1的共享文件

[root@server2 ~]# showmount -e 172.25.83.1
Export list for 172.25.83.1:
/mnt/nfs *

 

(4)进行挂载

[root@server2 ~]# mkdir /mnt/nfs   #创建目录/mnt/nfs,便于挂载。
[root@server2 ~]# mount 172.25.83.1:/mnt/nfs /mnt/nfs   #将172.25.83.1下的/mnt/nfs目录挂载到本地的/mnt/nfs目录下
[root@server2 ~]# df   #查看挂载信息,以确保挂载成功
172.25.83.1:/mnt/nfs   17811456 4598784  13212672  26% /mnt/nfs

 

(5)进行写操作的测试

#客户端(server2)上touch文件
[root@server2 ~]# cd /mnt/nfs/
[root@server2 nfs]# ls
[root@server2 nfs]# touch file   #在挂载点/mnt/nfs目录中创建文件file
[root@server2 nfs]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 26 19:26 file

#在服务端(server1)上进行查看
[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls   #可以看到客户端写入的内容,表示nfs服务搭建成功
file

 

2.配置convoy环境

 

<1>在server1端:下载convoy对应的压缩包(convoy.tar.gz),进行解压,并进行配置

[root@server1 ~]# tar zxf convoy.tar.gz 
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy  convoy-pdata_tools  SHA1SUMS
[root@server1 convoy]# cp convoy* /usr/local/bin/   #将二进制文件复制到PATH路径下
[root@server1 convoy]# mkdir /etc/docker/plugins   #创建docker的卷插件目录
[root@server1 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &> /dev/null &   #后台启动convoy守护进程。此时会在/var/run/convoy目录下生成convoy.sock文件(执行入口)
#值的注意的是:第一次运行上面的convoy daemon命令的时候,会在/mnt/nfs目录下生成一个config文件夹,这个文件夹不要删除,不然客户端的convoy命令就会用不了
[root@server1 convoy]# cd /mnt/nfs/
[root@server1 nfs]# ls
config  file
[root@server1 nfs]# rm -rf file   #其中file文件是上一步测试nfs服务时创建的文件,这里可以删除 
[root@server1 nfs]# ls
config
[root@server1 nfs]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec   #将convoy守护进程开启生成的.sock文件放入/etc/docker/plugins目录下的convoy.spec文件中,docker就可以识别。(其中convoy.spec文件之前是不存在的)
[root@server1 nfs]# cat /etc/docker/plugins/convoy.spec 
unix:///var/run/convoy/convoy.sock

 

<2>在server2端:操作同server1

 

3.操作卷

 

1.创建convoy卷实例

[root@server1 ~]# convoy list   #在创建covoy卷实例之前,先查询看有哪些卷
{}   #表示没有卷
[root@server1 ~]# convoy create vol_xin   #创建卷vol_xin,其中卷vol_xin名字可以随意给
vol_xin
  • 会在/mnt/nfs目录下生成一个同名文件夹vol1_xin,在这个卷同名的文件夹创建文件等,等同于操作卷里面的内容。

 

创建卷快照:

[root@server1 nfs]# convoy snapshot create vol_xin --name vol_xin_pic
vol_xin_pic
--name前面的是卷名
加个--name起个名字,不然会是数字

 

2.查询卷

列出全部convoy卷:

[root@server1 ~]# convoy list
{
	"vol_xin": {
		"Name": "vol_xin",   #之前创建的卷vol_xin
		"Driver": "vfs",
		"MountPoint": "",
		"CreatedTime": "Wed Mar 27 11:18:20 +0800 2019",
		"DriverInfo": {
			"Driver": "vfs",
			"MountPoint": "",
			"Path": "/mnt/nfs/vol_xin",
			"PrepareForVM": "false",
			"Size": "0",
			"VolumeCreatedAt": "Wed Mar 27 11:18:20 +0800 2019",
			"VolumeName": "vol_xin"
		},
		"Snapshots": {
			"vol_xin_pic": {
				"Name": "vol_xin_pic",   #之前生成的快照vol_xin_pic
				"CreatedTime": "Wed Mar 27 11:21:35 +0800 2019",
				"DriverInfo": {
					"Driver": "vfs",
					"FilePath": "/var/lib/rancher/convoy/vfs/snapshots/vol_xin_vol_xin_pic.tar.gz",
					"SnapshotCreatedAt": "Wed Mar 27 11:21:35 +0800 2019",
					"SnapshotName": "vol_xin_pic",
					"VolumeUUID": "vol_xin"
				}
			}
		}
	}
}

 

列出某个convoy卷

[root@server1 ~]# convoy inspect vol_xin
{
	"Name": "vol_xin",
	"Driver": "vfs",
	"MountPoint": "",
	"CreatedTime": "Wed Mar 27 11:18:20 +0800 2019",
	"DriverInfo": {
		"Driver": "vfs",
		"MountPoint": "",
		"Path": "/mnt/nfs/vol_xin",
		"PrepareForVM": "false",
		"Size": "0",
		"VolumeCreatedAt": "Wed Mar 27 11:18:20 +0800 2019",
		"VolumeName": "vol_xin"
	},
	"Snapshots": {
		"vol_xin_pic": {
			"Name": "vol_xin_pic",
			"CreatedTime": "Wed Mar 27 11:21:35 +0800 2019",
			"DriverInfo": {
				"Driver": "vfs",
				"FilePath": "/var/lib/rancher/convoy/vfs/snapshots/vol_xin_vol_xin_pic.tar.gz",
				"SnapshotCreatedAt": "Wed Mar 27 11:21:35 +0800 2019",
				"SnapshotName": "vol_xin_pic",
				"VolumeUUID": "vol_xin"
			}
		}
	}
}

 

3.备份卷

[root@server1 ~]# cconvoy create vol_xin_restore --backup vfs:///mnt/nfs/?backup=backup-a19f2acb25074e89\u0026volume=vol_xin
  • 备份卷之后,会在/mnt/nfs目录下生成相应的目录

 

4.还原卷

[root@server1 ~]# convoy create convoy_vol1_restore --backup vfs:///mnt/nfs/?backup=backup-7583316d737643d8\u0026volume=vol1
  • 还原卷之后,会在/mnt/nfs目录下生成相应的目录

  • 还原卷之后,通过"convoy  list"可以看到生成了相应的卷vol_xin_restore


值的注意的是:备份和还原都是基于快照的。


 

5.使用卷

[root@server1 ~]# docker run -it --name test1 -v vol_xin:/data ubuntu    #使用ubuntu镜像运行容器test1,并将本地的卷vol_xin挂载到容器内的/data目录下
root@ce8bee5b4cc0:/# cd /data/
root@ce8bee5b4cc0:/# ls
root@ce8bee5b4cc0:/data# touch file{1..10}   #在容器内的/data目录下创建文件file{1..10}
root@ce8bee5b4cc0:/data# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9


[root@server1 ~]# cd /mnt/nfs/vol_xin
[root@server1 vol_xin]# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9

[root@server2 ~]# cd /mnt/nfs/vol_xin
[root@server2 vol_xin]# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9

由上可知server1和server2上看到的内容一致,即不同主机间实现了共享存储。

 

6.删除快照和删除卷

删除快照

[root@server1 ~]# convoy snapshot delete vol_xin_pic

 

删除卷

[root@server1 ~]# convoy delete vol_xin_restore
[root@server1 ~]# convoy delete vol_xin
  • 删除之后,此时再次查询卷,看到卷为空


因为server1和server2是共享的,并且server1和server2对/mnt/nfs目录都有读写的权限。所以"3.操作卷"的全部操作,都可以在server2上进行操作,并查看。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值