Docker-数据卷、bind mount、docker managed volume、convoy卷插件

一.Docker数据卷管理

为什么要使用数据卷?

1.docker分层文件系统
    性能差
    生命周期与容器相同

2.docker数据卷
    mount到主机中,绕开分层文件系统
    和主机磁盘性能相同,容器删除后依然保留
    仅限本地磁盘,不能随容器迁移

docker提供了两种卷:

 bind mount
 docker managed volume

我们分别来介绍两种卷:

请添加图片描述

1.bind mount

是将主机上的文件/目录挂载到容器里面!
使用 -v 选项指定路径

先停掉之前的服务


cd harbor/
docker-compose stop
 docker run -d --name demo -v  /data:/usr/share/nginx/html nginx
echo www.westos.org > /data/index.html
crul 172.17.0.2

请添加图片描述

请添加图片描述
然后在容器里查看是否和/data下面的文件一致!

docker exec -it demo bash
ls
cd /usr/share/nginx/html/
ls

cd /data/
ls

请添加图片描述

请添加图片描述

接着删除刚才创建的容器和文件

docker rm -f demo
rm -f index.html
docker volume prune
docker volume ls

请添加图片描述

请添加图片描述

请添加图片描述

2.docker managed volume

bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录,那个路径名字会比较长。
默认创建的数据卷目录都在 /var/lib/docker/volumes 中。

在这里我们创建webdata卷来做实验

docker volume create webdata
docker run -d --name demo -v webdata:/usr/share/nginx/html nginx

请添加图片描述

我们可以看到创建的卷会自动生成在 /var/lib/docker/volumes 目录下
请添加图片描述
进到webdata里面会发现数据就在这里
请添加图片描述

因为bind mount默认的权限为rw,但是我们也可以指定只读ro

[root@server1 ~]# docker run -it --rm -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro rhel7 bash

yum repolist
cd /etc/yum.repos.d
ls -l
cat dvd.repo
echo westos > dvd.repo ##报错,因为是只读的模式

请添加图片描述

因为是只读,所以写入数据的时候就会报错!
请添加图片描述

二、卷插件简介

docker 卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动

请添加图片描述

三.convoy卷插件

convoy卷插件实现支持三种运行方式:devicemapper、NFS、EBS。

因为虚拟机支持nfs的方式,所以我们来用nfs的方式来实验:
下载软件:

https://github.com/rancher/convoy/releases/download/v0.5.0/
convoy.tar.gz

1.安装NFS

在服务端server1上:

[root@server1 ~]# yum install nfs-utils.x86_64 -y
[root@server1 ~]# mkdir /mnt/nfs
[root@server1 ~]# vim /etc/exports
/nfsdata        *(rw,no_root_squash)
[root@server1 ~]# chmod 777 /mnt/nfs
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# showmount -e

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述
在客户端server2上:

[root@server2 ~]# yum install nfs-utils.x86_64 -y
[root@server2 ~]# mkdir /nfsdata
[root@server2 ~]# mount 172.25.0.1:/mnt/nfs /mnt/nfs/
[root@server2 ~]# df

请添加图片描述

2.convoy卷插件安装

链接: convoy.tar.gz 提取码: yn2i
server1和server2都需要不部署convoy插件

[root@server1 ~]# tar zxf convoy.tar.gz
[root@server1 ~]# cd convoy/
[root@server1 convoy]# mv convoy* /usr/local/bin/
[root@server1 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &             ## 启动插件
[root@server1 convoy]# mkdir -p /etc/docker/plugins/            ##此目录下村存放sock的路径
[root@server1 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec        ## 指定sock的路径,使得docke调用的时候可以检索到
cat convoy.spec 

请添加图片描述

请添加图片描述

请添加图片描述

当启动插件之后,我们可以在/var/run/convoy/下看到数据!
请添加图片描述

3.创建卷:

[root@server1 ~]# convoy create vol1
[root@server1 ~]# convoy list

请添加图片描述
在server2上:和刚才的server1步骤一致!

[root@server2 ~]# tar zxf convoy.tar.gz
[root@server2 ~]# cd convoy/
[root@server2 convoy]# mv convoy* /usr/local/bin/
[root@server2 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &             ## 启动插件
[root@server2 convoy]# mkdir -p /etc/docker/plugins/            
[root@server2 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec       

[root@server2 convoy]#docker volume ls

请添加图片描述

4.使用卷

可以在两个主机上同时运行容器,会发现数据目录中的数据是同步的。

[root@server1 ~]# docker run -d --name demo -v vol1:/usr/share/nginx/html nginx
[root@server1 vol1]# curl 172.17.0.2
www.westos.org

请添加图片描述
请添加图片描述

当我们做故障迁移:将server1上的demo镜像删除掉!

[root@server1 vol1]# docker rm -f demo                ##做故障迁移
[root@server2 vol1]# docker run -d --name demo -v vol1:/usr/share/nginx/html  nginx
[root@server2 vol1]# curl 172.17.0.2
www.westos.org
[root@server2 vol1]#docker volume ls

请添加图片描述

请添加图片描述

请添加图片描述

5.完成后删除卷

删除刚才使用的卷

docker delete vol1

请添加图片描述

但是docker delete vol1这种方式删除卷之后有个问题
我们再次查看存在的卷:
docker volume ls的时候会很卡,非常曼但是不会报错!

请添加图片描述

那么怎么办呢?
我们需要将convoy进程杀死:

ps ax
kill ****

请添加图片描述

cd /etc/dicker/plugins
rm -f *

请添加图片描述

cd /var/lib/volumes
rm -f metdata.db

请添加图片描述

重启docker 服务
请添加图片描述

发现恢复了,速度又变快了!!
请添加图片描述

在server1上和server2上一样的方式删除卷只不过最好把docker-compose停掉

cd 
cd harbor/
docker-compose stop
docker-compose rm
docker delete vol1
docker volume prune
ps ax
kill ****

cd /etc/dicker/plugins
rm -f *

cd /var/lib/volumes
rm -f metdata.db

请添加图片描述

请添加图片描述

请添加图片描述

最后实现清空容器进程,清空数据卷即可!
请添加图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dudududu--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值