为什么要用数据卷
docker分层文件系统 性能差
生命周期与容器相同
docker数据卷
mount到主机中,绕开分层文件系统
和主机磁盘性能相同,容器删除后依然保留
仅限本地磁盘,不能随容器迁移
docker提供了两种卷:
bind mount docker managed volume
对比:
相同:
两者都是host文件系统中的某个路径
不同:
1.Docker数据卷管理 1.1bind mount将主机上的文件/目录挂载到容器里面
使用 -v 选项指定路径
docker run -it --rm -v /opt/data1:/data1 busyboxplus cd data1 touch 1
可以发现宿主机的opt/data1目录也有1
docker run -it --rm -v /opt/data1:/data1:ro busyboxplus
若在指定目录后面加ro 则之可以可读
docker run -d --name demo1 -v /opt/data2::/usr/share/nginx/html nginx
crul 172.17.0.2
是因为不会将原有数据复制到目录里
我们需要自己创建
[root@server5 _data]# cd /opt/data2/ [root@server5 data2]# touch index.html [root@server5 data2]# echo web2 > index.html [root@server5 data2]# curl 172.17.0.2 web21.2.docker managed volume
bind mount必须指定host文件系统路径,限制了移植性 docker managed volume
不需要指定mount源,docker自动为容器创建数据卷目录 默认创建的数据卷目录都在 /var/lib/docker/volumes 中 (可以通过 docker volume inspect webdata1 来查看)
删掉刚才创造的容器
docker rm -f demo1
创建webdata1卷来做实验
docker volume create webdata1 docker run -d --name demo -v webdata1:/usr/share/nginx/html nginx
可以看到创建的卷会自动生成在 /var/lib/docker/volumes 目录下
测试:
curl 172.17.0.22.卷插件简介
3.convoy卷插件docker 卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动 Docker Plugin 是以Web Service的服务运行在每一台Docker Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信。Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件。当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的 socket 文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。
convoy卷插件实现 支持三种运行方式:devicemapper、NFS、EBS。
本次实验使用nfs方式并且需要两台虚拟机server4 和5
server5:
删除刚才创建的webdata
docker volume rm webdata1
安装并准备挂载目录
yum install nfs-utils -y mkdir /mnt/nfs vim /etc/exports mnt/nfs *(rw,no_root_squash) chmod 777 /mnt/nfs systemctl start nfs showmount -e
server4也同样需要安装nfs-utils
3.1convoy卷插件安装server4和server5都需要部署convoy插件
server5:
tar zxf convoy-v0.5.2.tar.gz cd convoy/ mv convoy* /usr/local/bin/ #将convey的二进制文件移动到/usr/local/bin下便于直接调用 mkdir -p /etc/docker/plugins/ ##此目录下村存放sock的路径 echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec ## 指定sock的路径,使得docke调用的时候可以检索到 convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs & ## 启动插件 打入后台
ps ax 插件已开启
当启动插件之后,我们可以在/var/run/convoy/下看到socket 为docker引擎指定convoy的sock的文件到/etc/docker/plugins/convoy.spec
server4做同样启动插件的所有步骤
3.2.创建卷server5:
docker volume create -d convoy vol1 docker volume ls #查看数据卷
数据都在/mnt/nfs中
可以在两个主机上同时运行容器,会发现数据目录中的数据是同步的。
server5:
docker run -d --name web1 -v vol1:/usr/share/nginx/html nginx curl 172.17.0.2
当我们做故障迁移
将server5上的web镜像删除掉
cd vol1/ echo web1 > index.html docker rm -f web1 ##做故障迁移
将server5的nginx传给4
docker save -o nginx.tar nginx:latest scp nginx.tar server4:
server4:
docker load -i nginx.tar
docker run -d --name web1 -v vol1:/usr/share/nginx/html nginx
curl 172.17.0.2
删除步骤:
kill掉进程,删除套接字指向文件,删除元数据,重启docker。
如果不重启,后续docker命令会很慢。
按要求删除进程和套接字文件
kill 4680 rm -f /etc/docker/plugins/convoy.spec convoy delete vol1
删除元数据,重启服务
cd /var/lib/docker/volumes/
rm metadata.db
systemctl restart docker
rpm -qf 可以查看某个文件输入哪个rpm包



