容器使用的是分层文件系统,性能较差,生命周期和容器相同,并且不方便变更。当我们改变数据时,需要进入容器内部去更改。这样就会非常不方便。下面来学习Docker数据卷管理:
Docker数据卷特点:
1.mount到主机中,绕开分层文件系统
2.和主机磁盘性能相同,容器删除后仍然保留
3.仅限本地磁盘,不能随容器迁移
两种方式:
bind mount
docker managed volume
bind mount:
将宿主机上的目录或文件mount到容器中,使用-v指定路径。
示例:
docker run -d --name web -v /opt/web:/usr/local/nginx/htnl nginx
#冒号前为宿主机目录或文件,冒号后为容器内部目录或目录。
#即将宿主机的/opt/web/这个目录挂载到容器内部/usr/local/nginx/html中,在该目录写东西,相当于在容器内对应目录写东西
#默认挂载权限为读写,可以-o设置为只读
#-v指定的路径不存在的话,在挂载时会自动创建
bind mount必须指定host文件系统路径,限制了移植性。就像mount命令必须有从哪【from】挂载到哪【to】
且bind mount方式挂载的是系统容器而不是应用的话,是不会产生数据卷的
docker managed volume:
不需要指定mount源,docker自动为容器创建数据卷目录。
默认创建的数据卷都在/var/lib/docker/volumes中
如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。
使用docker insepct 容器名
查看容器信息
两种方式的区别:
卷插件:
Docker Plugin 是以Web Service的服务运行在每一台Docker
Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信。
Plugin的启动和停止,并不归Docker管理,Docker
Daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件。
当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的 socket文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。
convoy 卷插件
convoy卷插件实现
支持三种运行方式:devicemapper、NFS、EBS。
以下实验使用nfs方式。
下载软件:
https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz
在所有节点提前挂载NFS存储。
主服务器:
yum install -y nfs-utils
systemctl start rpcbind
mkdir /mnt/nfs
vim /etc/exports
systemctl start nfs
showmount -e
次服务器:
yum install -y nfs-utils
systemctl start rpcbind
mkdir /mnt/nfs
systemctl start nfs
showmount -e 172.25.12.1
这样nfs就搭建完成了。挂载以后就可以实现文件共享。
下面完成convoy的配置和启动docker指定数据卷即可。
在server1:
将convoy中的二进制文件添加到环境变量,然后在/etc/docker/下创建plugins目录【会在其中导入.sock文件】,后台指定nfs挂载目录,创建数据卷,运行容器并指定使用的数据卷。
测试:
在server1上的docker容器中创建文件,在server2共享出去被挂载的目录中能看到建立的文件。
如果是要用于两个容器为负载均衡的话,即容器是相同功能,彼此存储都会共享,只需要在server2也配置convoy,并运行容器,指定相同的数据卷即存储位置即可。因为nfs将目录共享了。
大大的小小阳