docker数据卷:
docker提供了两种卷:
1.bind mount
[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选项指定的路径,如果不存在,挂载时会自动创建
优点: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
注意: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
bind mount与docker managed volume对比
相同点:两者都是 host 文件系统中的某个路径。
不同点:
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
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
[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
server2
创建成功
配置convoy环境并实现convoy卷
1.删除创建的容器
[root@server1 tmp]# docker rm -f `docker ps -aq` -q便是查询
[root@server1 tmp]# docker ps
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
5.在server1中创建一个卷vol1并在/mnt/nfs目录下查看
[root@server1 ~]# cd /mnt/nfs
[root@server1 nfs]# convoy create vol1
[root@server1 nfs]# ls
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 &
[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
3.进入data目录创建文件
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端可以同步看到效果
[root@server1 ~]# convoy snapshot create vol1 --name vol1_pic
[root@server1 ~]# convoy list
[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 具体进程号