1.简介
为什么要用数据卷
-
docker分层文件系统
– 性能差
– 生命周期与容器相同 -
docker数据卷
– mount到主机中,绕开分层文件系统
– 和主机磁盘性能相同,容器删除后依然保留
– 仅限本地磁盘,不能随容器迁移 -
docker提供两种卷
– bind mount
– docker managed volume -
docker manage volume
– bind mount必须指定host文件系统路经,限制了移植性
– docker manage volumue不需要指定mount源,docker自动为容器创建数据卷目录
– 默认创建的数据卷目录都在/var/lib/docker/volumes中
– 如果挂载时指向容器内已有的目录,原数据会被复制到volume中
2.挂载方式
2. 1 bind mount
- 是将主机上的目录或文件mount到容器里
- 使用直观高效,易于理解
- 使用-v选项指定路径,格式
<host path>:<container path>
指定挂载,可以冒号前为宿主机,冒号后为容器,每个挂载最后可指定读写权限:
docker run -it --rm -v /data1:/data1 -v /data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/mnt/dvd.repo:ro busybox
容器退出后,能写入的文件可保留在宿主机上
bind mount默认权限是读写,可以在挂载时指定只读ro
- -v选项指定的路径,如果不存在,挂载时会自动创建
- 可以挂载多个文件夹
2.2 docker manager volume
在server4上:
打包:docker save webserver:v1 -o webserver.tar
分享给server5:scp webserver.tar server5:
在server5上加载:docker load -i webserver.tar
在server4上:
docker run -d --name registry registry
在server5上:
为防止速度过慢,在此将server5的加速器也替换成为阿里云镜像加速器,在server4上传过去:
cd /etc/docker/
scp daemon.json server5:/etc/docker/
在server5上reload
systemctl reload docker.device
服务器上下载一个registry:ocker pull registry
注:如果之前在server5上做了桥接实验,需要改变下内核参数:
激活内核forward功能:sysctl -a net.ipv4.ip_forward=0
打开内核forward功能:sysctl -w net.ipv4.ip_forward=1
启动registry:docker run -d --name registry registry
查看该容器的挂载卷位置:docker inspect registry
进入该目录:cd /var/lib/docker/volumes/4442ab2c0008b72357ab5088606ab836648b1d8a07d4646ae5430c3fcf914d27/_data
但是一般该方法自动创建的卷名随机过长,
删除该容器:docker rm -f registry
列出所有挂载卷:docker volume ls
回收未使用卷:docker volume prune
创建registry卷:docker volume create registry
查看该卷:docker volume inspect registry
在创建西容器时指定挂载卷名即可:docker run -d --name registry -v registry:/var/lib/registry registry
查看该容器挂载卷:docker inspect registry
成功,挂载到了创建的卷中。
2.3 对比
bind mount与docker manager volume对比
- 相同点:两者都是host文件系统中的某个路径
- 不同点
- | bind mount | docker managed volume |
---|---|---|
volume位置 | 可以任意指定 | /var/lib/docker/volumes/… |
对已有mount point影响 | 隐藏并替换为volume | 原有数据复制到volume |
是否支持单个文件 | 支持 | 不支持,只能是目录 |
权限控制 | 可设置为只读,默认读写权限 | 无控制,均为读写权限 |
移植性 | 移植性弱,与host path绑定 | 移植性强,无需指定host目录 |
3.卷插件简介
3.1 简介
-
docker卷默认使用的是local类型的驱动,只能存在于宿主机,跨主机的volume就需要使用第三方的驱动
-
docker官方只提供了卷插件的api,开发在可以根据实际需求定制卷插件驱动
-
Docker Plugin是以Web Server的服务运行在每一台Docker Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信-
-
Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件
-
当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的socket文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。
3.2 convoy卷插件
convoy卷插件实现
- 支持三种运行方式:devicemapper,NFS,EBS
- 以下实验使用nfs方式
- 下载convoy.tar.gz
- 在所有节点提前挂载NFS储存
容器调度器:
对server5上的数据,当server4上停止的时候,在server4上实现同步
挂载卷:docker run -d --name demo -v webserver:/usr/share/nginx/html:ro nginx
查看:docker volume inspect webserver
停止demo:docker rm -f demo
server4作服务端:
安装nfs工具包:yum install -y nfs-utils
- 编辑配置文件
vim /etc/exports
/nfsdata *(rw,no_root_squash)
- 开机自启:
systemctl enable --now nfs
mkdir /nfsdata
,chmod 777 /nfsdata/
此时完成目录的nfs共享
在server5上:
安装nfs工具包:yum install -y nfs-utils
查看nfs共享目录: showmount -e 172.25.119.4
新建目录:mkdir /nfsdata
挂载 :mount 172.25.119.4:/nfsdata /nfsdata/
此时实现文件共享
解压:tar zxf convoy.tar.gz
移动:mv convoy* /ysr/local/bin/
新建:mkdir -p /etc/docker/plugins/
启动convoy:convoy daemon --drivers vfs --driver-opts vfs.path=/nfsdata &
放入插件echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
在server4上:
下载解压:tar zxf convoy.tar.gz
,mv convoy /usr/local/bin/
启动convoy:convoy daemon --drivers vfs --driver-opts vfs.path=/nfsdata &
新建目录:mkdir /etc/docker/plugins
放入插件echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
在server4上创建卷:
convoy create vol1
此时在server5上也可以看到新建卷:
运行时需要指定卷的驱动信息:
docker run -d --name demo -v vol1:/usr/share/nginx/html --volume-driver convoy nginx
在/nfsdata/vol1下:
cat index.html
www.westos_lee.org
curl 172.17.0.2
www.westos_lee.org
将server5上的数据迁移到server1上并且保证数据一致:
释放server5上容器:docker rm -f 55e761953032
此时文件数据被保存
在server4上运行:
docker run -d --name demo -v vol1:/usr/share/nginx/html --volume-driver convoy nginx
此时仍然可以解析到:
curl 172.17.0.2
www.westos_lee.org