前面我们已经介绍过 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的实现
- 支持三种运行方式:devicemapper,NFS,EBS。
- 以下实验使用nfs的方式。
- 下载软件:https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz
- 在所有节点提前挂载NFS存储
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上进行操作,并查看。