一、数据卷特性
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容器基础:文件系统