目录
一.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
最后实现清空容器进程,清空数据卷即可!