操作环境
[root@docker-node-1 ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Go version: go1.7.5
Git commit: 092cba3
Built: Wed Feb 8 06:38:28 2017
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Go version: go1.7.5
Git commit: 092cba3
Built: Wed Feb 8 06:38:28 2017
OS/Arch: linux/amd64
Experimental: false
[root@docker-node-1 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
操作步骤
按照官方说法,Convoy支持多种后端存储,例如devicemapper,nfs,ebs等等,这里就以devicemapper以及nfs为例进行配置。
配置NFS为Convoy后端存储
1.配置NFS Server
#yum -y install nfs-utils
配置nfs目录
[root@docker-manager ~]# vi /etc/exports
/convoy-nfs *(rw,no_root_squash,no_all_squash,sync)
启动nfs
[root@docker-manager ~]# systemctl start rpcbind
[root@docker-manager ~]# systemctl start nfs
2.配置NFS Client
#yum -y install nfs-utils
挂载NFS Server
[root@docker-node-1 ~]# mount -t nfs 10.10.200.226:/convoy-nfs /convoy-nfs/
3.配置Convoy
a.下载Convoy
#wget https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz
#tar xvzf convoy.tar.gz
#cp convoy/convoy convoy/convoy-pdata_tools /usr/local/bin/
#mkdir -p /etc/docker/plugins/
#bash -c 'echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec'
c.启动Convoy
[root@docker-node-1 rancher]# convoy daemon --drivers vfs --driver-opts vfs.path=/convoy-nfs
DEBU[0000] Creating config at /var/lib/rancher/convoy pkg=daemon
DEBU[0000] driver=vfs driver_opts=map[vfs.path:/convoy-nfs] event=init pkg=daemon reason=prepare root=/var/lib/rancher/convoy
DEBU[0000] driver=vfs event=init pkg=daemon reason=complete
DEBU[0000] Registering GET, /info pkg=daemon
DEBU[0000] Registering GET, /volumes/list pkg=daemon
DEBU[0000] Registering GET, /volumes/ pkg=daemon
DEBU[0000] Registering GET, /snapshots/ pkg=daemon
DEBU[0000] Registering GET, /backups/list pkg=daemon
DEBU[0000] Registering GET, /backups/inspect pkg=daemon
DEBU[0000] Registering POST, /backups/create pkg=daemon
DEBU[0000] Registering POST, /volumes/create pkg=daemon
DEBU[0000] Registering POST, /volumes/mount pkg=daemon
DEBU[0000] Registering POST, /volumes/umount pkg=daemon
DEBU[0000] Registering POST, /snapshots/create pkg=daemon
DEBU[0000] Registering DELETE, /volumes/ pkg=daemon
DEBU[0000] Registering DELETE, /snapshots/ pkg=daemon
DEBU[0000] Registering DELETE, /backups pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Create pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Remove pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Mount pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Unmount pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Path pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Get pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.List pkg=daemon
DEBU[0000] Registering plugin handler POST, /Plugin.Activate pkg=daemon
d.创建Volume
[root@docker-node-1 ~]# convoy create nfstest
e.查看Volume
[root@docker-node-1 ~]# convoy list
{
"nfstest": {
"Name": "nfstest",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Thu Dec 14 00:40:04 -0500 2017",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/convoy-nfs/nfstest",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Thu Dec 14 00:40:04 -0500 2017",
"VolumeName": "nfstest"
},
"Snapshots": {}
}
}
[root@docker-node-1 ~]# convoy inspect nfstest
{
"Name": "nfstest",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Thu Dec 14 00:40:04 -0500 2017",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/convoy-nfs/nfstest",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Thu Dec 14 00:40:04 -0500 2017",
"VolumeName": "nfstest"
},
"Snapshots": {}
}
也可以通过docker volume查看到
[root@docker-node-1 ~]# docker volume ls
DRIVER VOLUME NAME
block:latest bbtest
block:latest blockbridge-3
local blockbridgesimulator_bb_data
local centos7-1
local centos7-2
block:latest data
block:latest data1
block:latest data2
block:latest data3
local dmtest
convoy nfstest
local test
[root@docker-node-1 ~]# docker volume ls -f driver=convoy
DRIVER VOLUME NAME
convoy nfstest
f.创建Container
通过上面的volume,创建container
[root@docker-node-1 ~]# docker run -ti -v nfstest:/data --volume-driver=convoy --name convoycentos centos
[root@e53d2469c662 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/docker-253:1-1073870859-68690cb6b91e73d7e94e7fa854386256c3006a7845ae9763be1a18df1f9ecb8d 10G 247M 9.8G 3% /
tmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/mapper/centos-root 905G 163G 743G 18% /data
shm 64M 0 64M 0% /dev/shm
tmpfs 7.8G 0 7.8G 0% /sys/firmware
g.创建snapshot
可以在上面的container的data目录下,创建文件nfstest,并写入字符nfstest
[root@e53d2469c662 /]# touch /data/nfstest
[root@e53d2469c662 /]# echo nfstest > /data/nfstest
[root@e53d2469c662 /]# cat /data/nfstest
nfstest
此时,我们针对nfstest volume进行snapshot操作,我们可以查看到nfstest volume inspect信息里面多了snapshot一栏
[root@docker-node-1 ~]# convoy snapshot create nfstest --name nfstestsnap1
nfstestsnap1
[root@docker-node-1 ~]# convoy inspect nfstest
{
"Name": "nfstest",
"Driver": "vfs",
"MountPoint": "/convoy-nfs/nfstest",
"CreatedTime": "Thu Dec 14 00:40:04 -0500 2017",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "/convoy-nfs/nfstest",
"Path": "/convoy-nfs/nfstest",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Thu Dec 14 00:40:04 -0500 2017",
"VolumeName": "nfstest"
},
"Snapshots": {
"nfstestsnap1": {
"Name": "nfstestsnap1",
"CreatedTime": "Thu Dec 14 00:49:27 -0500 2017",
"DriverInfo": {
"Driver": "vfs",
"FilePath": "/var/lib/rancher/convoy/vfs/snapshots/nfstest_nfstestsnap1.tar.gz",
"SnapshotCreatedAt": "Thu Dec 14 00:49:27 -0500 2017",
"SnapshotName": "nfstestsnap1",
"VolumeUUID": "nfstest"
}
}
}
}
h.对snapshot进行备份,还原
对snapshot进行备份
[root@docker-node-1 ~]# convoy backup create nfstestsnap1 --dest vfs:///convoy-nfs/
vfs:///convoy-nfs/?backup=backup-fd83d8d5e82640cf\u0026volume=nfstest
对备份进行还原到新的volume中
[root@docker-node-1 ~]# convoy create backup1 --backup vfs:///convoy-nfs/?backup=backup-fd83d8d5e82640cf\u0026volume=nfstest
backup1
[root@docker-node-1 ~]# convoy list
{
"backup1": {
"Name": "backup1",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Thu Dec 14 00:57:20 -0500 2017",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/convoy-nfs/backup1",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Thu Dec 14 00:57:20 -0500 2017",
"VolumeName": "backup1"
},
"Snapshots": {}
},
"nfstest": {
"Name": "nfstest",
"Driver": "vfs",
"MountPoint": "/convoy-nfs/nfstest",
"CreatedTime": "Thu Dec 14 00:40:04 -0500 2017",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "/convoy-nfs/nfstest",
"Path": "/convoy-nfs/nfstest",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Thu Dec 14 00:40:04 -0500 2017",
"VolumeName": "nfstest"
},
"Snapshots": {
"nfstestsnap1": {
"Name": "nfstestsnap1",
"CreatedTime": "Thu Dec 14 00:49:27 -0500 2017",
"DriverInfo": {
"Driver": "vfs",
"FilePath": "/var/lib/rancher/convoy/vfs/snapshots/nfstest_nfstestsnap1.tar.gz",
"SnapshotCreatedAt": "Thu Dec 14 00:49:27 -0500 2017",
"SnapshotName": "nfstestsnap1",
"VolumeUUID": "nfstest"
}
}
}
}
}
我们可以通过backup volume启动新的container
[root@docker-node-1 ~]# docker run -ti -v backup1:/date1 --volume-driver=convoy centos
[root@c07365b75d20 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/docker-253:1-1073870859-e0fefab5d8e8e68d3481d186b04a409e9ef235393cd6bd80dcab5fe3958bcc33 10G 247M 9.8G 3% /
tmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/mapper/centos-root 905G 163G 743G 18% /date1
shm 64M 0 64M 0% /dev/shm
tmpfs 7.8G 0 7.8G 0% /sys/firmware
[root@c07365b75d20 /]# cat /date1/nfstest
nfstest
我们可以看见在之前container data目录下写入的nfstest文件,也在新container中。
配置DeviceMapper为Convoy后端存储
配置DeviceMapper作为Convoy的后端存储,必须事先准备好两个块设备,一个用来存储data,另一个用来存储metadata#truncate -s 100G data.vol
#truncate -s 1G metadata.vol
#losetup /dev/loop5 data.vol
#losetup /dev/loop6 metadata.vol
启动convoy
[root@docker-node-1 rancher]# convoy daemon --drivers devicemapper --driver-opts dm.datadev=/dev/loop5 --driver-opts dm.metadatadev=/dev/loop6
DEBU[0000] Found existing config. Ignoring command line opts, loading config from /var/lib/rancher/convoy pkg=daemon
DEBU[0000] driver=vfs driver_opts=map[dm.datadev:/dev/loop5 dm.metadatadev:/dev/loop6] event=init pkg=daemon reason=prepare root=/var/lib/rancher/convoy
DEBU[0000] driver=vfs event=init pkg=daemon reason=complete
DEBU[0000] Registering POST, /volumes/create pkg=daemon
DEBU[0000] Registering POST, /volumes/mount pkg=daemon
DEBU[0000] Registering POST, /volumes/umount pkg=daemon
DEBU[0000] Registering POST, /snapshots/create pkg=daemon
DEBU[0000] Registering POST, /backups/create pkg=daemon
DEBU[0000] Registering DELETE, /volumes/ pkg=daemon
DEBU[0000] Registering DELETE, /snapshots/ pkg=daemon
DEBU[0000] Registering DELETE, /backups pkg=daemon
DEBU[0000] Registering GET, /info pkg=daemon
DEBU[0000] Registering GET, /volumes/list pkg=daemon
DEBU[0000] Registering GET, /volumes/ pkg=daemon
DEBU[0000] Registering GET, /snapshots/ pkg=daemon
DEBU[0000] Registering GET, /backups/list pkg=daemon
DEBU[0000] Registering GET, /backups/inspect pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Unmount pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Path pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Get pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.List pkg=daemon
DEBU[0000] Registering plugin handler POST, /Plugin.Activate pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Create pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Remove pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Mount pkg=daemon
之后的操作就与上述NFS作为后端存储的操作类似,就不做说明了。