文章目录
一、前言
为什么要用数据卷:
docker分层文件系统
1、性能差
2、生命周期与容器相同
docker数据卷
1、mount到主机中,绕开分层文件系统
2、和主机磁盘性能相同,容器删除后依然保留
3、仅限本地磁盘,不能随容器迁移
二、docker提供的两种卷
1.bind mount
bind mount是将主机上的目录或文件mount到容器里。它使用直观高效,易于理解。
使用 -v 选项指定路径,格式 <host path>:<container path>
bind mount 默认权限是读写rw,可以在挂载时指定只读ro。
-v选项指定的路径,如果不存在,挂载时会自动创建。
由于在容器中的目录中删除文件,对应的宿主机的挂载目录中的文件也会被删除,所以我们在挂载的时候赋予该目录只读权限:
注意:
当宿主机中的卷对应挂载到容器中时,在容器中对该目录中的文件进行更改或者在宿主机中对该目录中的文件进行更改都会互相影响
2.docker managed volume(管理卷)
bind mount必须指定host文件系统路径,限制了移植性。 %在其它主机中可能没有指定挂载的host路径
docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录。
默认创建的数据卷目录都在宿主机的 /var/lib/docker/volumes 中。
如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。
创建示例:
docker run -d --name web1 -p 80:80 -v /usr/share/nginx/html nginx
这里我们运行了一个容器,镜像是registry,同时创建docker管理卷:
但是上述默认创建的卷路径太复杂,不方便查看,因此我们创建新的卷用来指定挂载路径:
docker volume create registry %创建卷registry
docker run -d --name registry -v registry:/var/lib/registry registry %指定registry镜像创建容器时指定宿主机的registry卷挂载到容器内的/var/lib/registry卷
docker inspect registry :
3.二者对比
相同点:两者都是 host 文件系统中的某个路径
不同点:
其中,对已有mount point的影响,bind mount的`隐藏并替换为volume`该如何理解?
我们看下面的这个示例:
首先以nginx镜像运行一个demo容器:
docker run -d --name demo nginx
之后:
看到上述页面说明nginx的默认发布目录:
/usr/local/nginx/html
下面有一个html文件
docker rm -f demo %删除正在运行的容器
dockers run -d --name demo -v /data1:/usr/local/nginx/html nginx %挂载指定目录到容器中的nginx的默认发布目录下
docker info demo %查看该容器获得到的ip
curl ip %查看是否还能访问到刚才那个测试页面
而对
docker managed volume(管理卷)
而言,会将原有的数据复制到volume
,如下所示:
1、创建一个新的卷webdata
docker volume create webdata
2、删除原来的容器demo,并重新运行一个容器demo,指定挂载卷为webdata
docker rm -f demo
docker run -d --name demo -v webdata:/usr/local/nginx/html nginx
3、查看宿主机中对应的挂载卷中的内容:发现原来Nginx默认发布目录中的文件都被保存
三、convoy卷插件
convoy卷插件实现
支持三种运行方式:devicemapper、NFS、EBS。
以下实验使用nfs方式。
1.搭建nfs服务器
yum install -y nfs-utils %安装nfs驱动工具
vim /etc/exports:
/nfsdata *(rw,no_root_squash) %编辑共享策略,所有内容可读写,如果root用户读写不要映射
systemctl enable --now nfs %设置开机自启
show mount -e %查看
mkdir /nfsdata %创建共享目录
chmod 777 /nfsdata %给予777权限
另外一台主机同样需要安装nfs-utils
yum install -y nfs-utils
2.部署convoy
tar zxf convoy.tar.gz %解压资源包
mv convoy/convoy convoy/convoy-pdata_tools /usr/local/bin/ %移动二进制程序到指定目录下
mkdir -p /etc/docker/plugins/ %创建docker中的缺省路径,当需要用到卷插件的时候docker引擎会自动检索plugins目录中的sock文件来定位卷插件的连接
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec %写卷插件的sock文件的路径
convoy daemon --drivers vfs --driver-opts vfs.path=/nfsdata & %启动卷插件
在另外一台主机上也部署convoy,步骤同上
3.convoy使用示例
创建卷:
convoy create vol1
自动生成数据目录:/nfsdata/vol1/
此时已经实现了server1和server2上目录的同步:
docker run -it --name demo -v vol1:/usr/share/nginx/html --volume-driver convoy nginx %运行容器并指定卷插件类型
在卷插件中编辑测试页面,则可以同步到默认发布目录下:
容器迁移:
当server2上的demo容器关闭之后数据并不会丢失
,在server1相应目录下相应挂载目录下仍有保存,在server1上重新启动容器,发现仍可以正常访问之前编写的测试页面