Docker容器(九)数据存储

一、数据卷特性

       Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层,如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存,只是已经被读写层中该文件的副本所隐藏,即"写时复制"机制!

镜像'只读层'  -->'run' + 读写层'1层' --> 运行容器'container'

'明确': '容器的删除' --> '不影响镜像本身'

2、数据卷的意义

Volume 的初衷就是'数据持久化' 

-->体现:'容器的声明周期和数据卷的生命周期分离'

-->更具体:'容器删除,但是数据仍然存在'

3、数据卷的类型

docker'提供了两种卷':

      1)bind mount docker -->'宿主机挂载'

      2)managed volume    -->'数据卷'

技巧:删除所有的容器

'docker ps -a -q' -->  '只显示容器id'

docker rm -f `docker ps -a -q`

4、容器中使用数据卷的方法

方式1

特点:bind mount 是将主机上的'目录(d)或文件(f)'mount到容器里,使用'直观高效',易于理解。

使用方式:使用 -v 选项指定路径,格式 '<host path>:<container path>'

由于mount host,会直接'覆盖'容器目录'挂载点' --> '导致出现403错误'

'细节':-v选项指定的路径,如果'容器目录'不存在,挂载时会'自动创建'

###############  '分割线'

bind mount '默认权限是读写rw',可以在挂载时'指定只读ro' --> 此时在'容器内无法删除'

-v /opt/data:/usr/share/nginx/html:ro

方式2

对比:bind mount必须指定host文件系统路径,限制了'移植性'

说明:docker managed volume,'不需要指定mount源'

'细节':source就是volume在host中的目录(宿主机),是docker'自动为容器生成的目录',如果挂载时指向的已有目录,原有数据会被'复制到'volume中

需求:每次'删除容器同时删除volume' <-- '不指定source'

注意:如果人为指定了source,Docker默认认为是重要的数据,所以删除容器的时候会保留数据

5、卷插件剖析

原理图

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

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

明确:卷插件和网络插件密切相关,可能需要特点的网络插件,具体参考官网

参考链接

如果你对Docker官方所提供的卷插件不满足怎么办?开发者可以根据实际需求定制卷插件驱动,Docker提供了API接口

应用1单机构建负载均衡

说明:上面只是一个框架,没有涉及具体的!

核心:3个nginx都挂载到同一个volume,再给一个前端的负载均衡器实现调度

问题引入:上面的只是单机版的,如果节点宕机,数据就会丢失,所以必须做成分布式存储的!

案例:Convoy插件

(1)支持的运行方式

Device Mapper

Virtual File System (VFS) / Network File System (NFS)

Amazon Elastic Block Store (EBS)

(2)实验使用nfs进行

1)环境的搭建

###########docker1############

yum install nfs-utils.x86_64 -y >/dev/null
echo $?
systemctl start rpcbind
mkdir /mnt/nfs
echo '/mnt/nfs        *(rw,no_root_squash)' > /etc/exports
systemctl start nfs
########docker2##########

yum install nfs-utils.x86_64 -y >/dev/null
echo $?
systemctl start rpcbind
showmount -e 172.25.2.1
mkdir /mnt/nfs
mount 172.25.2.1:/mnt/nfs /mnt/nfs

2)convoy卷插件安装

######一下的方式是普通用户的身份,如果是root则不需要加sudo###docker1做的事情####

#(1)软件下载
wget https://github.com/rancher/convoy/releases/download/v0.5.2/convoy.tar.gz
#(2)解压缩
tar xvzf convoy.tar.gz
#(3)运行时所有的指令,加入到PATH路径中
sudo cp convoy/convoy convoy/convoy-pdata_tools /usr/local/bin/
#(4)Docker Engine 会默认查看到插件路径
sudo mkdir -p /etc/docker/plugins/
#(5)由于convoy开启的时候socket位于/var/run/convoy/路径下,所以必须告诉到去哪里找
sudo bash -c 'echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec'
# 细节:文件的后缀名是固定的
convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &

说明:通过 docker volume ls 也可以查看到!

3)创建卷

convoy create vol1 

4)docker2的配置

##docker1把二进制文件移过去##

scp convoy convoy-pdata_tools docker2:/usr/local/bin/

##docker2做的##

convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
cd /var/run/convoy/
mkdir -p /etc/docker/plugins/
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec

# 说明:docker2不需要再创建volume卷了

4)测试

docker1

docker2

要点的说明

(1)ps -ax -->指定了路径

3552 pts/0    Sl     0:00 convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &

convoy插件'不受Docker的daemon管控'

(2)convoy'服务开启'之后会在'挂载目录生成一个config目录',千万不要删除

drwx------ 2 root root 34 Aug  4 23:09 config

(3)创建卷-->查看convoy的'帮助文档'

convoy create vol1

# 自动生成数据目录:/mnt/nfs/vol1/	

核心:掌握容器的'分布式存储'

掌握的技能: 掌握容器卷的'基本操作'、描述容器卷的'基本插件机制'、理解容器卷的'基本工作原理'

补充

Docker容器基础:文件系统

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值