Docker数据卷管理
docker分层文件系统:
~性能差
~生命周期与容器相同
docker数据卷:
~mount到主机中,直接绕开docker分层文件系统
~和主机磁盘性能相同,容器删除后依然保留
~使用本地磁盘,不能随着容器迁移。
一、docker提供了两种卷:
实现跨主机连接
1、docker mount:
-v直接指定,docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享。
docker run -d --name vm1 -v /opt/website:/usr/share/nginx/html nginx
#/opt/website宿主机目录,/usr/share/nginx/html容器内路径
echo www.westos.org > index.html #被挂载了发布页面,写进website相当于写在了挂载地
[root@server1 website]# curl 172.17.0.2
www.westos.org
挂载之后,当容器停止运行的时候,宿主机上对数据卷做的内容修改的会同步到容器内的,我们再挂载的时候还可以给数据卷加上权限,假如我们要宿主机只能读取容器的数据卷内容不能修改,我们可以添加只读权限
docker run -it -v /宿主机绝对路径目录:/容器内目录 :ro 镜像名
2、docker managed volume:
bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume不需要指定挂载源,docker自动为容器创建目录。
默认的创建目录在/var/lib/docker/volumes中。
如果挂载时指向容器内已有的目录,原有数据会复制到volume中。
(1).查看现有的管理卷,现在没有任何数据卷
docker volume ls #查看
docker volume prune ##全部清理
(2).使用registry镜像创建一个新的容器
[root@server1 website]# docker history registry:latest
<missing> 2 months ago /bin/sh -c #(nop) VOLUME [/var/lib/registry] 0B #必须要有挂载点
[root@server1 website]# docker run -d --name registry registry:latest
[root@server1 website]# docker volume ls
DRIVER VOLUME NAME
local 1bac14d3b609c57c8154d05f68c92e6d751f3f9958fd64d031be2f5457a0daaf
[root@server1 website]# cd /var/lib/docker/volumes/
[root@server1 volumes]# ls
1bac14d3b609c57c8154d05f68c92e6d751f3f9958fd64d031be2f5457a0daaf metadata.db
我们会发现,docker自动生成的目录名称会很长,不方便书写使用。我们可以在创建容器时自己定义目录名称。
01).首先,需要先创建卷
docker volume create voll ##创建卷voll
02).创建新的容器并将管理卷voll挂载到容器内的指定目录
docker run -d --name registry2 -v voll:/var/lib/registry registry
Docker数据卷管理
如果想实现跨主机的容器之间的数据共享就要使用卷插件,使用了卷插件才可以使用网络文件系统实现数据共享。
》docker plugin是以web service的服务运行在每一台docker host上,通过http协议传输RPC风格的JSON数据完成通信。
》plugin的启动和停止,并不归Docker管理,docker daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件。
》当客户端与Daemon交互时,使用插件创建数据卷时,Daemon会在后端找到数据插件对应的socket文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。
convoy卷插件
convoy卷插件支持三种运行方式:devicemapper、NFS、EBS。我们下面的实验以nfs的运行方式来演示
实验前提:1.准备两台主机server1、server2,并安装好Dokcer服务
1、首先在server1和server2上搭建nfs文件系统
下载软件:https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz
server1:
yum install -y nfs-utils.x86_64 #安装
[root@server1 ~]# systemctl start rpcbind
[root@server1 ~]# mkdir /mnt/nfs
[root@server1 ~]# chmod 777 /mnt/nfs/
[root@server1 ~]# vim /etc/exports #编辑共享目录文件,否则将不会被共享出去
[root@server1 ~]# cat /etc/exports
/mnt/nfs *(rw,no_root_squash)
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# exportfs -rv #刷新
server2:
[root@server2 ~]# yum install -y nfs-utils
[root@server2 ~]# systemctl start rpcbind
[root@server2 ~]# systemctl start nfs
[root@server2 ~]# showmount -e 172.25.1.1
[root@server2 ~]# mount 172.25.1.1:/mnt/nfs/ /mnt/nfs/
[root@server2 ~]# systemctl start nfs-server.service
[root@server2 ~]# mkdir /mnt/nfs
2、配置convoy环境
server1/2:
[root@server1 ~]# tar zxf convoy.tar.gz
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy convoy-pdata_tools SHA1SUMS
[root@server1 convoy]# mv * /usr/local/bin/
[root@server1 ~]# mkdir /etc/docker/plugins
[root@server1 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &> /dev/null &
[1] 20519
#第一次运行上面的convoy daemon命令的时候,会在/mnt/nfs目录下生成一个config文件,这个文件不能删除,否则客户端的convoy命令就用不了
[root@server1 ~]#echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
#将convoy守护进程开启生成的.sock文件放入/etc/docker/plugins目录下的convoy.spec文件中,dcoker就可以识别(其中convoy.spec文件之前是不存在的)
3、创建卷
convoy create voll1
[root@server1 nfs]# ll
total 4
drwx------ 2 root root 92 4月 10 23:57 config
-rw-r--r-- 1 root root 14 4月 11 00:05 file2
drwx------ 2 root root 6 4月 10 23:49 voll
drwx------ 2 root root 6 4月 10 23:51 voll1
drwx------ 2 root root 6 4月 10 23:57 voll2
[root@server2 nfs]# ll
total 4
drwx------ 2 root root 92 4月 10 23:57 config
-rw-r--r-- 1 root root 14 4月 11 00:05 file2
drwx------ 2 root root 6 4月 10 23:49 voll
drwx------ 2 root root 6 4月 10 23:51 voll1
drwx------ 2 root root 6 4月 10 23:57 voll2
[root@server1 nfs]# convoy list
4、操作卷
数据同步且删除卷也存在
[root@server1 nfs]# docker run -d --name vm1 -v voll1:/usr/share/nginx/html nginx
[root@server1 voll1]# echo www.westos.org > index.html
[root@server1 voll1]# curl 172.17.0.2
www.westos.org
[root@server2 voll1]# docker run -d --name vm1 -v voll1:/usr/share/nginx/html nginx
806a62bfaaafa9b5d38948112698755c535654a09d993cbaf7935246729652a2
[root@server2 voll1]# cat index.html
www.westos.org
[root@server2 voll1]# curl 172.17.0.2
www.westos.org
[root@server1 nfs]# convoy snapshot create voll --name voll_pic
docker volume prune #删除没有被使用的数据卷