docker数据卷--docker提供的两种卷、convoy卷插件

一、前言

为什么要用数据卷:
docker分层文件系统
1、性能差
2、生命周期与容器相同
docker数据卷
1、mount到主机中,绕开分层文件系统
2、和主机磁盘性能相同,容器删除后依然保留
3、仅限本地磁盘,不能随容器迁移

二、docker提供的两种卷

1.bind mount

bind mount是将主机上的目录或文件mount到容器里。它使用直观高效,易于理解。
使用 -v 选项指定路径,格式 <host path>:<container path>

bind mount 默认权限是读写rw,可以在挂载时指定只读ro。
-v选项指定的路径,如果不存在,挂载时会自动创建。

由于在容器中的目录中删除文件,对应的宿主机的挂载目录中的文件也会被删除,所以我们在挂载的时候赋予该目录只读权限:
在这里插入图片描述
在这里插入图片描述

注意: 当宿主机中的卷对应挂载到容器中时,在容器中对该目录中的文件进行更改或者在宿主机中对该目录中的文件进行更改都会互相影响

2.docker managed volume(管理卷)

bind mount必须指定host文件系统路径,限制了移植性。      %在其它主机中可能没有指定挂载的host路径
docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录。
默认创建的数据卷目录都在宿主机的 /var/lib/docker/volumes 中。
如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。
创建示例:
docker run -d --name web1 -p 80:80 -v /usr/share/nginx/html nginx     

这里我们运行了一个容器,镜像是registry,同时创建docker管理卷:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是上述默认创建的卷路径太复杂,不方便查看,因此我们创建新的卷用来指定挂载路径:

docker volume create registry      %创建卷registry

在这里插入图片描述
在这里插入图片描述

docker  run -d --name registry -v registry:/var/lib/registry registry     %指定registry镜像创建容器时指定宿主机的registry卷挂载到容器内的/var/lib/registry卷

docker inspect registry :
在这里插入图片描述

3.二者对比

相同点:两者都是 host 文件系统中的某个路径
不同点:
在这里插入图片描述

其中,对已有mount point的影响,bind mount的`隐藏并替换为volume`该如何理解?
我们看下面的这个示例:
首先以nginx镜像运行一个demo容器:
docker run -d --name demo nginx
之后:

在这里插入图片描述

看到上述页面说明nginx的默认发布目录:/usr/local/nginx/html下面有一个html文件

docker rm -f demo      %删除正在运行的容器
dockers run -d --name demo -v /data1:/usr/local/nginx/html nginx     %挂载指定目录到容器中的nginx的默认发布目录下
docker info demo       %查看该容器获得到的ip
curl ip      %查看是否还能访问到刚才那个测试页面

在这里插入图片描述
在这里插入图片描述

而对docker managed volume(管理卷)而言,会将原有的数据复制到volume,如下所示:

1、创建一个新的卷webdata
docker volume create webdata

2、删除原来的容器demo,并重新运行一个容器demo,指定挂载卷为webdata
docker rm -f demo
docker run -d --name demo -v webdata:/usr/local/nginx/html nginx

3、查看宿主机中对应的挂载卷中的内容:发现原来Nginx默认发布目录中的文件都被保存

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、convoy卷插件

convoy卷插件实现
支持三种运行方式:devicemapper、NFS、EBS。
以下实验使用nfs方式。

1.搭建nfs服务器

yum install -y nfs-utils      %安装nfs驱动工具
vim /etc/exports:
/nfsdata     *(rw,no_root_squash)      %编辑共享策略,所有内容可读写,如果root用户读写不要映射
systemctl enable --now nfs        %设置开机自启
show mount -e         %查看
mkdir /nfsdata          %创建共享目录
chmod 777 /nfsdata        %给予777权限

在这里插入图片描述
在这里插入图片描述

另外一台主机同样需要安装nfs-utils
yum install -y nfs-utils 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.部署convoy

tar zxf convoy.tar.gz        %解压资源包
mv convoy/convoy convoy/convoy-pdata_tools /usr/local/bin/     %移动二进制程序到指定目录下
mkdir -p /etc/docker/plugins/        %创建docker中的缺省路径,当需要用到卷插件的时候docker引擎会自动检索plugins目录中的sock文件来定位卷插件的连接
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec    %写卷插件的sock文件的路径
convoy daemon --drivers vfs --driver-opts vfs.path=/nfsdata &       %启动卷插件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在另外一台主机上也部署convoy,步骤同上
在这里插入图片描述

3.convoy使用示例

创建卷:
convoy create vol1
自动生成数据目录:/nfsdata/vol1/	

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时已经实现了server1和server2上目录的同步:
在这里插入图片描述

docker run -it --name demo -v vol1:/usr/share/nginx/html --volume-driver convoy nginx    %运行容器并指定卷插件类型

在这里插入图片描述
在卷插件中编辑测试页面,则可以同步到默认发布目录下:
在这里插入图片描述

容器迁移:
当server2上的demo容器关闭之后数据并不会丢失,在server1相应目录下相应挂载目录下仍有保存,在server1上重新启动容器,发现仍可以正常访问之前编写的测试页面

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值