ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Docker数据卷管理

Docker数据卷管理 目录一.Docker数据卷1.1简单介绍1.2绑定挂载(bind mount)1.2.1简单介绍1.2.2基本用法1.3数据卷Docker Volume1.3.1简单介绍1.3.2基本操作1.4卷插件Volume Plugins1.4.1简单介绍1.4.2convoy卷插件1.4.3项目结合nfs使用数据卷一.Docker数据卷1.1简单介绍1.概述Docker 数据卷Volume是用于将数据从容器持久化到宿主机中的一种机制。存储卷可以在容器之间共享和重用即使容器被删除卷中的数据仍然会保留。设计数据卷的目的就是让数据的持久化完全独立于容器的生命周期。数据卷是经过特殊设计的目录。可以对数据卷里的内容直接进行修改。数据卷的变化不会影响镜像的更新。数据卷会一直存在即使挂载数据卷的容器已经被删除。2.三种存储方式2.1 Volume一般存储在/var/lib/docker/volumes目录下该目录由 Docker Engine进程管理不允许其他进程修改。2.2bind mount:直接挂载到主机任意文件系统的目录或者文件方法最简单。它类似于主机和容器共享存储目录主机中的所有进程都可以修改该目录下的文件不太安全。2.3 tmpfs挂载存储到主机的内存当中不会写入主机的磁盘当中。适合存储临时数据提高容器性能。3.绑定挂载与数据卷的区别bind mountdocker manager volumevolume位置可任意指定/var/log/docker/volume/容器名mount point存在文件隐藏并替换为volume原有数据替换到volume是否支持单个文件挂载支持不支持只支持目录权限控制默认读写权限可选只读均为读写权限移植性移植性弱与host path绑定移植性强数据都存在统一位置4.权限选项可选ro只读容器内无法修改挂载的文件/ 目录rw读写默认容器内可修改1.2绑定挂载(bind mount)1.2.1简单介绍1.概述docker bind mount绑定挂载是 Docker 中一种将宿主机的文件或目录直接挂载到容器内部的机制使容器与宿主机共享指定的文件或目录实现数据的实时同步。2.注意 bind mount会将本机上的文件强制覆盖到容器当中如果容器的挂载点中存在文件会被主机文件替换掉即使主机目录下什么也没有。1.2.2基本用法说明执行docker 命令时使用-v参数将本机的文件或目录映射到容器的内部目录或文件当中-v 本机目录或文件:容器内部目录或文件示例将本机的/opt/website文件挂载到nginx容器的/var/lib/www/html文件中1.挂载空目录出现客户端请求失败问题403mkdir -p /opt/website docker run -d --name web1 -v /opt/website:/var/lib/www/html -p 80:80 nginx curl localhost2.本机下添加index.html文件说明由此可以得出docker 的挂载文件支持实时读取不需要重启生效echo hello /opt/website/index.html curl localhost清理容器docker rm -f web11.3数据卷Docker Volume1.3.1简单介绍1.概述在 Docker 中Managed Volume管理卷是指由 Docker 引擎自动创建、管理和维护的数据卷Volume无需用户指定宿主机的具体路径是 Docker 推荐的持久化数据方式之一。它与 bind mount绑定挂载的核心区别在于管理卷的存储路径完全由 Docker 控制用户无需关心数据在宿主机的具体位置只需通过卷名操作即可。2.核心特性1.Docker 全权管理卷的创建、存储路径默认位于/var/lib/docker/volumes/卷名/_data、权限设置等均由 Docker 引擎自动处理用户无需手动干预。2.数据持久化容器被删除后管理卷不会被自动删除数据依然保留需手动删除卷。3.跨容器共享多个容器可通过卷名挂载同一个管理卷实现数据共享。4.与宿主机隔离用户无需了解宿主机的文件系统结构避免因路径错误导致的挂载问题。5.支持多种驱动除了默认的本地存储驱动还可通过第三方驱动如local-persist、云存储驱动将卷存储到外部存储如 NFS、S 3。3.注意 Docker Volume会自动读取本机上的文件覆盖到容器当中如果容器的挂载点中存在文件且主机的挂载点下什么也没有则会将容器下的文件复制到主机的挂载点上。如果主机的挂载点上存在文件容器挂载点的文件依旧会被主机挂载点上的文件所覆盖。1.3.2基本操作1.创建volume数据卷docker volume create vol1 #创建名为vol1的数据卷 docker volume inspect vol1 #查看数据卷信息2.使用新建的vol1挂载nginx镜像文件访问web1说明新建的vol1下不存在任何文件在主机和容器挂载时容器将自身挂载点的文件复制到了主机的挂载点上。docker run -d -p 80:80 --name web1 -v vol1:/var/lib/www/html curl localhost3.查看主机挂载目录下的文件cd /var/lib/docker/volumes/vol1/_data #进入数据存储目录 ll4.验证挂载点的权限说明我将本机下的/data1目录挂载到容器中权限为rw(默认)将本机下的/data2目录挂载到容器中权限为ro。docker run -it --rm -v /data1:/data1 -v /data2:/data2:ro centos:7容器内部操作ls cd /data1 touch file1 #在/data1目录下创建一个测试文件file1 ls #查看结果 cd /data2 touch file2 #报错提示该目录为只读目录本机查看文件cd /data1 ls #查看结果 cd /data2 ls5.清理数据卷docker volume prune #该动作只会清理没有被使用的数据卷6.数据卷自动挂载说明如果创建时不指定主机的挂载点docker会默认自动创建一个数据卷用来存储容器内部的挂载数据docker run -d --name web1 -v /var/lib/www/html -p 80:80 nginx docker volume ls curl localhost7.存储挂载信息说明将数据卷的挂载信息封装到一个容器中通过调用这个容器即可将挂载配置应用到新容器上。通过这种方法实现快速重复挂载。docker create -v /tmp/data1:/data1:rw -v /tmp/data2:/data2:ro -v /etc/passwd:/mnt/passwd:ro --name datavol busybox #封装挂载信息 docker run -it --rm -volumes datavol centos:7 #调用封装的datavol挂载信息容器创建新容器1.4卷插件Volume Plugins说明docker卷默认使用的是Local类型的区别只能存在宿主机。跨主机的volume需要第三方驱动。官方只提供卷插件的API开发者需要根据需求定制卷驱动插件。官方文档链接https://docs.docker.com/engine/extend/legacy_plugins/#volume-pluginshttp://volume pluginsDocker volume plugins | Docker Docshttps://docs.docker.com/engine/extend/plugins_volume/#volume-plugin-protocol1.4.1简单介绍1.概述Docker Plugin 是以Web Service的服务运行在每一台Docker Host上的通过HTTP协议传输 RPC风格的JSON数据完成通信。容器本身适合无状态服务但数据库、日志、文件存储等需要持久化数据卷插件就是让容器引擎不用关心底层存储细节只调用统一接口。2.作用把创建、挂载、卸载、删除数据卷这些操作封装起来对上提供统一接口对下调用具体存储。当客户端与Daemon交互使用插件创建数据卷时Daemon会在后端找到插件对应的socket文件建立连接并发起相应的API请求最终结合Daemon自身的处理完成客户端的请求。3.工作流程1.​​​​用户创建插件容器2.Docker 调用插件容器插件去存储系统创建卷3.用户启动新容器并挂载插件容器4.Docker 再次调用插件把卷挂载到宿主机某个目录5.Docker 把这个目录 bind mount 到新容器里4.框架图如下1.4.2convoy卷插件1.概述Convoy 是一款由 Rancher 团队开发的 Docker 卷插件Volume Plugin主要用于扩展 Docker 的存储能力支持将外部存储如本地磁盘、NFS、AWS EBS、Ceph等作为 Docker 数据卷Volume使用尤其适合在集群环境中实现数据卷的跨主机共享和持久化。2.核心功能与特性2.1多后端存储支持●支持多种存储类型作为卷的底层存储满足不同场景需求、●本地存储直接使用宿主机磁盘目录类似 Docker 原生数据卷但提供更灵活的管理。●网络存储NFS网络文件系统、GlusterFS、Ceph RBD 等适合跨主机共享数据。●云存储AWS EBS、Google Persistent Disk 等适配云环境部署。2.2跨主卷共享说明在 Docker Swarm 或 Kubernetes 等集群环境中通过 Convoy 管理的卷可以被不同主机上的容器挂载和访问解决了 Docker 原生数据卷local 驱动仅能单机使用的限制。2.3卷快照与恢复说明支持对卷创建快照Snapshot并能通过快照恢复数据方便数据备份和版本管理。创建容器快照convoy snapshot create myvolume-snap1 myvolume #创建快照恢复容器快照convoy snapshot restore myvolume-restored myvolume-snap1 #恢复快照1.4.3项目结合nfs使用数据卷说明将数据卷放到nfs共享目录下多个主机可以通过该目录访问数据卷的信息实现多个主机的信息共享项目描述将docker1上的数据卷共享给docker2IP地址主机名挂载点192.168.7.161docker1服务端/mnt/nfs192.168.7.162docker2客户端/mnt/nfs1.两个主机上配置nfs共享目录1.1两个主机安装nfs软件yum install -y nfs-utils systemctl start nfs systemctl enable nfs #如果想要实现开机挂载需要开启开机自启1.2在docker1上修改 /etc/exports 文件将目录共享给docker2vim /etc/exports #修改文件 exportfs -rv #使文件生效添加以下内容/mnt/nfs *(rw,sync,no_root_squash) #将目录/mnt/nfs暴露给所有外机赋予读写权限同步写入保留客户端的root用户权限/mnt/nfs 共享目录* 共享给所有主机rw 读写权限sync 同步写入写入后返回给主机一个确认信号no_root_squash 客户端root用户进入共享目录保留客户端的root权限1.3docker2挂载docker1的共享目录mount docker1:/mnt/nfs /mnt/nfs2.两个主机安装convoy插件2.1官网下载convoy并解压wget https://github.com/rancher/convoy/releases/download/v0.5.2/convoy.tar.gz tar -xzf convoy.tar.gz2.2将程序文件复制到/usr/local目录下cp convoy convoy-pdata_tools /usr/local/bin2.3启动convoy插件mkdir -p /etc/docker/plugins/ #创建插件目录 echo unix:///var/run/convoy/convoy.sock /etc/docker/plugins/convoy.spec #向 Docker 注册 Convoy 卷插件 convoy daemon --drivers vfs --driver-opts vfs.path/mnt/nfs #后台启动convoy插件3.实现数据卷共享3.1任选一个主机创建数据卷convoy create vl1 #创建vl1数据卷 convoy inspect vl1 #查看vl1信息3.2使用共享数据卷运行容器查看数据是否共享说明将vl1数据卷挂载到/data上vl1中的数据可以被docker1和docker2上的容器同时访问docker1上创建数据docker1docker run -it --name vm1 -v vl1:/data --volume-driverconvoy busyboxdocker2上查看数据docker1docker run -it --name vm1 -v vl1:/data --volume-driverconvoy busybox
返回列表