Docker 存储卷(Volume)核心概念、类型与操作指南(最新整理)

 更新时间:2025年09月10日 14:32:58   作者:敲上瘾  
Docker 存储卷 是 Docker 容器中用于持久化存储数据的独立文件系统区域,它独立于容器的联合文件系统,其生命周期可以完全独立于创建它的容器,本文给大家介绍Docker 存储卷(Volume)核心概念、类型与操作指南,感兴趣的朋友一起看看吧

一、存储卷概念

数据卷(Volumes)是 Docker 中持久化存储数据的推荐方式,它独立于容器生命周期,可以高效地在容器间共享数据。

什么是存储卷?
  Docker 存储卷 是 Docker 容器中用于持久化存储数据的独立文件系统区域。它独立于容器的联合文件系统,其生命周期可以完全独立于创建它的容器。简单来说,可以把它理解成容器中的一个共享文件夹或外部硬盘,这个文件夹直接映射到主机(或其它远程存储)上的一个真实目录。

为什么要使用存储卷?

  1. 容器销毁或误操作等会导致数据丢失,而存储卷就可以起到一个数据备份的作用。
  2. 宿主机和容器,容器和容器,它们之间文件系统是相互隔离的,要完成数据交互很麻烦,而存储卷起到一个交通枢纽的功能,或者说相当于一个“共享目录”。

二、存储卷分类

Docker 提供了三种方式将数据从宿主机挂载到容器中:
  管理卷(volume docker )。默认映射到宿主机的/var/lib/docker/volumes目录下,只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合;
  绑定数据卷(bind mount)。映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径,在容器中也需要指定一个特定的路径,两个已知的路径建立关联关系。
  临时数据卷(tmpfs mount).映射到于宿主机内存中,一旦容器停止运行,tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

2.1 管理卷

创建卷
方法一:Volume命令操作

命令清单:

  • docker volume create:创建存储卷
  • docker volume inspect:显示存储卷详细信息
  • docker volume ls: 列出存储卷
  • docker volume prune:清理所有无用数据卷
  • docker volume rm:删除卷,使用中的无法删除

示例:

  • 注:docker volume create不加卷名称,生成匿名存储卷
  • 注:docker volume inspect支持查看多个存储卷
  • 注:docker volume rmdocker volume prune-f选项表示强制删除

方法二:-v 或者–mount 指定
docker run创建并启动容器时添加-v--mount 都可以完成管理卷的创建和挂载
-v 选项
功能:完成目录映射
语法:

docker run -v name:directory[:options]

参数:

  • 第一个参数:卷名称
  • 第二个参数:卷映射到容器的目录
  • 第三个参数:选项,如 ro 表示 readonly

示例:

效果:

–mount选项

功能:完成目录映射
语法:

--mount '<key>=<value>,<key>=<value>'

关键参数:

  • type:类型表示 bind, volume, or tmpfs
  • source,src:对于命名卷,这是卷的名称。对于匿名卷,省略此字段
  • destination,dst,target:文件或目录挂载在容器中的路径
  • ro,readonly:只读方式挂载

示例:

docker run -d --name myweb2 --mount 'src=myweb2,dst=/usr/share/nginx/html' nginx:1.24.0

效果和-v选项相同

  • 注意1:添加ro选项限制的是容器里的写权限。
  • 注意2:容器删除卷的数据不会删除,除非用 docker volume rm 删除。因为卷本身就是来保护数据的。
  • 注意3:卷共享。不同容器可以使用同一个卷,解决了容器与容器之间数据交互繁琐的问题。

2.2 绑定数据卷

绑定卷 bind mount-v--mount 都可以完成绑定卷的创建
-v 选项
功能:完成卷映射
语法:

docker run -v name:directory[:options] ………

  • 注意1:-v选项下,如果宿主机没有对应的目录,会自动创建,而–mount则会挂载失败。
  • 注意2:与管理卷不同,容器目录原有数据会被清空,同步成宿主机目录下的数据。
  • 注意3:ro限制的是宿主机的写操作。

–mount选项
功能:完成目录映射
语法:

--mount '<key>=<value>,<key>=<value>'

关键参数:

  • type: 类型表示 bind, volume, or tmpfs
  • source, src: 宿主机目录,这个和管理卷是不一样的
  • destination, dst,target: 文件或目录挂载在容器中的路径
  • ro,readonly: 只读方式挂载

示例:

docker run -d --name=myweb3 --mount 
type=bind,src=/home/qsy/gitDocker/data/test2
,dst=/usr/share/nginx/html nginx:1.24.0

注意:在命令行中不能像这个把指令分行写(必须写在一行),这里只是方便展示。
效果同-v选项。

特性管理卷绑定卷
创建者Docker用户自己
存储位置Docker管理的区域用户指定的任何目录
控制权Docker用户
移植性
典型用途数据库数据、应用程序产生的需要持久化的数据配置文件、源代码、日志文件(在主机和容器间共享)
备份与迁移使用 docker volume 命令操作,相对简单需要操作主机文件系统,复杂度高

2.3 临时数据卷

临时卷 tmpfs:临时卷数据位于内存中,在容器和宿主机之外(仅在容器运行期间存在)。

局限性

  • 不同于管理卷和绑定卷,不能在容器之间共享 tmpfs 挂载
  • 这个功能只有在 Linux 上运行 Docker 时才可用

创建卷
方法一:
–tmpfs选项
功能:完成临时卷映射
语法:

--tmpfs /app
  • 注意1:数据在宿主机内存里,/app是容器目录。如果该目录不存在则会创建。
  • 注意2:该容器的目录会被清空。
  • 注意3:当容器重启后,tmpfs目录会被销毁,或恢复成原来的样子。

示例:

docker run -d --name=myweb4 --tmpfs /test1 nginx:1.24.0

方法二:
--mount选项
功能:完成目录映射
语法:

--mount '<key>=<value>,<key>=<value>'

关键参数:

  • type:类型表示 bind, volume, or tmpfs
  • destination,dst,target:挂载在容器中的路径
  • tmpfs-sizetmpfs 挂载的大小(以字节为单位)。默认无限制。
  • tmpfs-modetmpfs 的八进制文件模式。例如,700 或 0770。默认为 1777 或全局可写。

示例:

docker run -d --name=myweb5 --mount type=tmpfs,dst=/usr/share/nginx/html nginx:1.24.1

三、MySQL灾难恢复

接下来我们演示把数据库容器数据丢失,然后通过存储卷恢复的过程,分为以下几步:

  1. 挂载存储卷
  2. 模拟数据生产
  3. 删除数据库容器
  4. 恢复数据
  5. 登录mysql并查看数据是否恢复

创建mysql容器并挂载:

docker run -d --name 容器的名字 -v 宿主机目录:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=数据库密码 mysql:版本号

模拟数据库存储:

删除mysql容器

恢复数据(数据都在宿主机目录下,再用同样的方式挂载就行)

登录数据库查看数据是否恢复:

四、存储卷的局限性

  1. 数据生命周期与容器分离:这既是一个优点,也是一个缺点。卷的生命周期独立于容器,即使删除了所有使用该卷的容器,卷及其数据仍然存在。它有效的保护了容器的数据,但很容易导致“孤儿卷”或“僵尸卷”堆积,占用大量磁盘空间,如果不手动清理,会造成资源浪费。
  2. 可移植性挑战:卷本身在创建时是“空白”的,其内容通常由容器在运行时填充。你不能像镜像一样,轻松地将一个包含数据的卷从一个环境(如开发机)直接“复制”或“迁移”到另一个环境(如生产服务器)。
  3. 备份和迁移流程复杂:备份一个正在被容器使用的活跃卷存在数据一致性的风险(例如,数据库文件可能在备份过程中被修改)。标准的 Docker 命令没有提供一键式的卷备份功能。
  4. 空间分配不灵活:Docker 卷默认使用宿主机的存储空间,你无法像在虚拟机中那样,轻松地为单个卷设置大小限制。一个失控的容器进程(例如,日志疯狂输出)可能会写满整个卷,进而占满宿主机的磁盘空间,导致宿主机和其他容器都出现问题。
  5. 安全性与访问控制:卷中的数据默认由容器的用户(通常是 root)拥有和写入。如果容器以特权模式运行或被攻破,攻击者可以通过卷对宿主机文件系统造成破坏(尽管比绑定挂载更安全)。

到此这篇关于Docker 存储卷(Volume)核心概念、类型与操作指南(最新整理)的文章就介绍到这了,更多相关Docker 存储卷 Volume内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker-compose多服务使用详解

    Docker-compose多服务使用详解

    文章概述了部署多服务的流程:创建文件夹、上传并解压文件,删除旧容器,修正文件名,添加执行权限后运行脚本,最终启动多个服务
    2025-08-08
  • docker中容器的网络配置常用命令详解

    docker中容器的网络配置常用命令详解

    这篇文章主要介绍了docker中容器的网络配置常用命令详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Docker部署Go项目发布镜像到仓库

    Docker部署Go项目发布镜像到仓库

    这篇文章主要为大家介绍了Docker部署Go项目发布镜像到仓库示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • docker中如何将jar包构建成镜像并执行

    docker中如何将jar包构建成镜像并执行

    这篇文章主要介绍了docker中如何将jar包构建成镜像并执行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 删除docker里建立容器的操作方法

    删除docker里建立容器的操作方法

    在本篇文章里小编给大家分享了一篇关于删除docker里建立容器的操作方法,需要的朋友们可以学习下。
    2020-03-03
  • docker在ubuntu14.04下的安装步骤

    docker在ubuntu14.04下的安装步骤

    这篇文章主要介绍了docker在ubuntu14.04下的安装步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Docker-compose搭建Redis集群(Sentinel)的实现

    Docker-compose搭建Redis集群(Sentinel)的实现

    本文主要介绍了Docker-compose搭建Redis集群(Sentinel)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Docker搭建prometheus(普罗米修斯)的方法步骤

    Docker搭建prometheus(普罗米修斯)的方法步骤

    phometheus:当前一套非常流行的开源监控和报警系统,本文主要介绍了Docker搭建prometheus(普罗米修斯)的方法步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Docker配置从私有仓库拉取镜像方式

    Docker配置从私有仓库拉取镜像方式

    本文详细介绍了如何修改Docker配置文件以使用私有仓库,并解决相关问题,包括配置文件的编辑、DNS设置、证书管理以及系统时间同步
    2025-03-03
  • Rancher+Docker+SpringBoot实现微服务部署、扩容、环境监控

    Rancher+Docker+SpringBoot实现微服务部署、扩容、环境监控

    Rancher 是一套容器管理平台,可以在生产环境中快捷的部署和管理容器,方便的对容器进行cpu内存环境监控、日志监控、扩容缩容,自动重启,这篇文章主要介绍了Rancher+Docker+SpringBoot实现微服务部署、扩容、环境监控,需要的朋友可以参考下
    2022-04-04

最新评论