Docker(七)--docker容器的卷管理和卷插件

一.docker卷管理基础

docker数据卷:

  • 数据卷是目录或文件,不是块设备。
  • 容器可以读写volume中的数据。
  • volume数据可以持久化保存。

docker提供了两种卷:

  • bind mount
  • docker managed volume

1.bind mount

1.清理实验环境
Docker(七)--docker容器的卷管理和卷插件_第1张图片2.创建目录挂载到容器里

[root@server1 ~]# mkdir -p /tmp/data
[root@server1 ~]# cd /tmp/data
[root@server1 data]# docker run -d --name web -p 80:80 -v /tmp/data:/usr/share/nginx/html nginx		##-v指定路径
453def39927006337c52ad740efc1c8239c8d7d334fcad344592395f75a767a8
[root@server1 data]# curl localhost
test1
[root@server1 data]# echo test2 >> index.html 
[root@server1 data]# curl localhost
test1
test2
[root@server1 data]# 

3.以只读模式挂载

[root@server1 data]# docker run -it --name vm1 -v /tmp/data/index.html:/data/index.html:ro ubuntu
##默认权限是读写rw,可以指定;-v选项指定的路径,如果不存在,挂载时会自动创建

Docker(七)--docker容器的卷管理和卷插件_第2张图片
2.docker managed volume

优点:bind mount必须指定host文件系统路径,限制了移植性。;docker managed volume 不需要指定mount源。

1.不指定mount源挂载

[root@server1 data]# docker run -d --name vm1 -p 80:80 -v /usr/share/nginx/html nginx
[root@server1 data]# docker inspect vm1

Docker(七)--docker容器的卷管理和卷插件_第3张图片
Docker(七)--docker容器的卷管理和卷插件_第4张图片
注意:source就是volume在host中的目录,是docker自动为容器生成的目录,如果
挂载时指向的已有目录,原有数据会被复制到volume中。

2.进入docker卷挂载的目录下,访问本地发现可以访问

[root@server1 data]# cd /var/lib/docker/volumes/0ddacb13992ecdeeacb6c5fbb00d8b1de4905cb49ca7287030d310abe9217ad6/_data/
[root@server1 _data]# ls
50x.html  index.html
[root@server1 _data]# curl localhost

Docker(七)--docker容器的卷管理和卷插件_第5张图片

bind mount与docker managed volume对比
相同点:两者都是 host 文件系统中的某个路径。
不同点:
Docker(七)--docker容器的卷管理和卷插件_第6张图片

二.卷插件

1.卷插件概念

1.docker 卷默认使用的是local类型的驱动,只能存在宿主机,
跨主机的volume就需要使用第三方的驱动,可以查看一链接:https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins
2.docker官方只提供了卷插件的api,开发者可以根据实际需求
定制卷插件驱动。https://docs.docker.com/engine/extend/plugins_volume/#volume-plugin-protocol

Docker(七)--docker容器的卷管理和卷插件_第7张图片

1 .Docker Plugin 是以Web Service的服务运行在每一台Docker Host上的,
通过HTTP协议传输RPC风格的JSON数据完成通信。
2.Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省
路径下查找Unix Socket文件,自动发现可用的插件。
3.当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后
端找到插件对应的 socket 文件,建立连接并发起相应的API请求,最
终结合Daemon自身的处理完成客户端的请求

2.卷插件的使用

convoy卷插件实现
(1)支持三种运行方式:devicemapper、NFS、EBS。
(2)以下实验使用nfs方式。
(3)下载软件:
https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz
(4)在所有节点提前挂载NFS存储。

搭建nfs文件系统
1.在server1中搭建nfs文件系统

[root@server1 ~]# yum install nfs-utils -y		##下载nfs对应的软件
[root@server1 ~]# systemctl start rpcbind	##启动相关服务,rpcbind服务的作用,告知客户端服务端nfs共享的端口
[root@server1 ~]# mkdir /mnt/nfs
[root@server1 ~]# chmod 777 /mnt/nfs
[root@server1 ~]# vim /etc/exports
[root@server1 ~]# cat /etc/exports
[root@server1 ~]# systemctl start nfs	##查看nfs服务器共享出来的资源
[root@server1 ~]# showmount -e localhost

Docker(七)--docker容器的卷管理和卷插件_第8张图片
Docker(七)--docker容器的卷管理和卷插件_第9张图片
2.server2中搭建nfs文件系统

[root@server2 ~]# yum install nfs-utils -y
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# systemctl start rpcbind
[root@server2 ~]# systemctl start nfs
[root@server2 ~]# showmount -e 172.25.31.1
[root@server2 ~]# mount 172.25.66.1:/mnt/nfs /mnt/nfs
[root@server2 ~]# df

Docker(七)--docker容器的卷管理和卷插件_第10张图片
Docker(七)--docker容器的卷管理和卷插件_第11张图片3.测试nfs环境是否搭建成功

server2
Docker(七)--docker容器的卷管理和卷插件_第12张图片
创建成功
Docker(七)--docker容器的卷管理和卷插件_第13张图片配置convoy环境并实现convoy卷

1.删除创建的容器

[root@server1 tmp]# docker rm -f `docker ps -aq`   -q便是查询
[root@server1 tmp]# docker ps 

Docker(七)--docker容器的卷管理和卷插件_第14张图片2.将压缩包进行解压(可以在官网上下载https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz),并将二进制文件复制到PATH路径下

[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
[root@server1 convoy]# cd /usr/local/bin
[root@server1 bin]# ls
convoy  convoy-pdata_tools  docker-compose  docker-machine
[root@server1 bin]# cd

3.创建docker的卷插件目录并将convoy守护进程开启生成的.sock文件放入/etc/docker/plugins目录下的convoy.spec文件中,docker就可以识别。(其中convoy.spec文件之前是不存在的)

[root@server1 ~]# mkdir /etc/docker/plugins
[root@server1 ~]# cd /etc/docker/plugins/
[root@server1 plugins]# ls
[root@server1 plugins]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server1 plugins]# cat convoy.spec 
unix:///var/run/convoy/convoy.sock

4.第一次运行convoy daemon命令的时候,会在/mnt/nfs目录下生成一个config文件夹,这个文件夹不要删除,不然客户端的convoy命令就会用不了

[root@server1 plugins]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
[root@server1 plugins]# cd /mnt/nfs
[root@server1 nfs]# ls

Docker(七)--docker容器的卷管理和卷插件_第15张图片5.在server1中创建一个卷vol1并在/mnt/nfs目录下查看

[root@server1 ~]# cd /mnt/nfs
[root@server1 nfs]# convoy create vol1
[root@server1 nfs]# ls

Docker(七)--docker容器的卷管理和卷插件_第16张图片6.将server1里的convoy内容scp给server2,并配置convoy环境

[root@server1 ~]# ls
[root@server1 ~]# scp -r convoy server2:
[root@server2 ~]# cd /usr/local/bin/
[root@server2 bin]# ls
convoy  convoy-pdata_tools
[root@server2 bin]# mkdir /etc/docker/plugins
[root@server2 bin]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server2 bin]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &

Docker(七)--docker容器的卷管理和卷插件_第17张图片
Docker(七)--docker容器的卷管理和卷插件_第18张图片7.进入server2的共享目录

[root@server2 bin]# cd /mnt/nfs/
[root@server2 nfs]# ls
config  file  vol1
[root@server2 nfs]# cd vol1/
[root@server2 vol1]# ls
[root@server2 vol1]# 

卷的操作

1.列出卷的信息

[root@server2 vol1]# convoy list
{
	"vol1": {
		"Name": "vol1",
		"Driver": "vfs",
		"MountPoint": "",
		"CreatedTime": "Thu Aug 08 15:19:18 +0800 2019",
		"DriverInfo": {
			"Driver": "vfs",
			"MountPoint": "",
			"Path": "/mnt/nfs/vol1",
			"PrepareForVM": "false",
			"Size": "0",
			"VolumeCreatedAt": "Thu Aug 08 15:19:18 +0800 2019",
			"VolumeName": "vol1"
		},
		"Snapshots": {}
	}
}

2.创建容器挂载到server1的共享目录下

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

Docker(七)--docker容器的卷管理和卷插件_第19张图片3.进入data目录创建文件
Docker(七)--docker容器的卷管理和卷插件_第20张图片
4.在server2的/mnt/nfs/vol1可以查看到

[root@server2 vol1]# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9
[root@server2 vol1]# 

5.server2也创建一个容器并挂载到vol1上

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

6.进入data目录删除文件

root@855d3fdc7df3:/# ls
bin   data  etc   lib    media  opt   root  sbin  sys  usr
boot  dev   home  lib64  mnt    proc  run   srv   tmp  var
root@855d3fdc7df3:/# cd data/
root@855d3fdc7df3:/data# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9
root@855d3fdc7df3:/data# rm -fr file{4..8}
root@855d3fdc7df3:/data# ls
file1  file10  file2  file3  file9

7.server1端可以同步看到效果

Docker(七)--docker容器的卷管理和卷插件_第21张图片
创建卷的快照

[root@server1 ~]# convoy snapshot create vol1 --name vol1_pic
[root@server1 ~]# convoy list

Docker(七)--docker容器的卷管理和卷插件_第22张图片
Docker(七)--docker容器的卷管理和卷插件_第23张图片
删除卷

[root@server1 convoy]# convoy delete vol1
DEBU[3713] Calling: DELETE, /volumes/, request: DELETE, /v1/volumes/  pkg=daemon
DEBU[3713]                                               event=delete object=volume pkg=daemon reason=prepare volume=vol1
DEBU[3713] Cleaning up /mnt/nfs/vol1 for volume vol1     pkg=vfs
DEBU[3713]                                               event=delete object=volume pkg=daemon reason=complete volume=vol1

删除卷快照

[root@server1 convoy]# convoy snapshot delete vol1_pic
DEBU[3644] Calling: DELETE, /snapshots/, request: DELETE, /v1/snapshots/  pkg=daemon
DEBU[3644]                                               event=delete object=snapshot pkg=daemon reason=prepare snapshot=vol1_pic volume=vol1
DEBU[3644]                                               event=delete object=snapshot pkg=daemon reason=complete snapshot=vol1_pic volume=vol1

关闭convoy守护进程

ps -ef | grep convoy
kill -9 具体进程号

你可能感兴趣的:(企业)