概念
Docker 中的存储卷(Volume)是用于持久化和管理容器数据的独立存储机制,它将容器内的目录或文件与宿主机(或远程存储)的特定位置绑定,实现数据的持久化、共享与解耦。简单来说,存储卷是容器与外部存储之间的 "桥梁",解决了容器数据易失性的核心问题。
特性
-
**数据持久化:**容器本身是临时的(停止 / 删除后数据丢失),而卷存储在容器生命周期之外。即使容器被删除,卷中的数据依然保留在宿主机(或远程存储)中。
-
与容器 解耦 **:**卷的生命周期独立于容器,一个卷可被多个容器挂载、复用,实现数据共享(比如多个容器读写同一配置文件)。
-
**性能优化:**卷直接映射到宿主机文件系统(或高性能存储),读写性能优于容器的可写层(容器层是分层存储,读写效率较低)。
-
**跨平台兼容:**无论是 Linux 还是 Windows 容器,卷机制均保持一致,且支持远程存储(如 NFS、云存储)。
类型
命名卷(Named Volume)
-
定义 :由 Docker 管理的卷,有明确名称,存储路径默认在宿主机的 /var/lib/docker/volumes/<卷名>/_data(Linux)。
-
特点:Docker 自动创建和管理,无需关心宿主机具体路径,安全可靠。
匿名卷(Anonymous Volume)
-
定义:无明确名称的卷,Docker 自动生成随机标识符作为卷名,存储路径与命名卷类似。
-
特点 :适合临时数据存储,容器删除时可通过 --rm 自动清理(但默认不会删除)。
绑定挂载(Bind Mount)
-
定义:将宿主机的任意目录 / 文件直接挂载到容器内,属于 "卷" 的广义范畴(Docker 官方有时单独归类,但功能类似)。
-
特点:可自定义宿主机路径,适合开发环境(如代码热更新),但需手动管理路径权限。
存储卷分类
目前 Docker 提供了三种方式将数据从宿主机挂载到容器中
-
volume docker 管理卷,默认映射到宿主机的/var/lib/docker/volumes 目录 下,只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由 容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷 建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定 那些使用目录,临时存储比较适合;
-
bind mount 绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的 指定一个特定的路径,在容器中也需要指定一个特定的路径,两个已知的路径建立关 联关系
-
tmpfs mount 临时数据卷,映射到于宿主机内存中,一旦容器停止运行,tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

存储卷的用途
-
持久化数据库数据 :如 MySQL 容器将 /var/lib/mysql 挂载到卷,避免容器删除后数据丢失。
-
共享配置文件:多个容器挂载同一卷,共享配置(如 Nginx 配置文件)。
-
宿主机 与容器文件同步:开发时挂载代码目录,容器内实时读取宿主机的代码修改。
-
分离应用与数据:实现 "应用容器化,数据持久化",符合微服务架构的设计原则。
存储卷和容器可写层的区别
|-------|--------------|-------------|
| 特性 | 存储卷 | 容器可写层 |
| 数据持久化 | 容器删除后数据保留 | 容器删除后数据丢失 |
| 存储位置 | 宿主机独立目录(或远程) | 容器分层存储目录 |
| 性能 | 直接读写宿主机存储,高效 | 分层存储,读写性能较低 |
| 共享性 | 支持多容器共享 | 仅当前容器可访问 |
docker管理卷
Docker 管理卷(Volume)是一套用于持久化、共享和管理容器数据的核心机制,通过将容器数据与容器本身解耦,解决了容器 "临时性" 导致的数据丢失问题。Docker 提供了完整的命令集和策略来管理卷的生命周期,确保数据可控、可复用且安全。
挂载的目录默认为 /var/lib/docker/volume ,但是如果有修改,也可以在容器信息里面查到
docker 管理卷有三种创建卷的方式:通过命令方式创建、创建容器时使用 -v 以及使用 --mount 进行指定
命令方式
总共有以下几种:
|-----------------------|---------------|--------------------|
| 命令 | 作用 | 别名 |
| docker volume create | 创建存储卷 | |
| docker volume inspect | 显示存储卷详细信息 | |
| docker volume ls | 列出存储卷 | docker volume list |
| docker volume prune | 清理所有无用数据卷 | |
| docker volume rm | 删除卷,使用中的无法 删除 | |
docker volume create
用于手动创建命名卷的命令,可按需创建独立的存储卷(默认由 Docker 管理存储路径),支持自定义驱动、标签和存储选项,是管理卷生命周期的起点。
# VOLUME_NAME 卷的名称(可以自定义)
# 如果命名就是命名卷,没有命名就是匿名卷
docker volume create [OPTIONS] [VOLUME_NAME]
-
Options
-
--d/--driver : 指定卷驱动(默认 local,支持第三方驱动如 nfs/glusterfs)
-
--label: 为卷添加标签(用于分类管理)
-
--name : 显式指定卷名(替代末尾的 VOLUME_NAME)
-
--o/--opt: 设置驱动特定选项(如 NFS 地址、存储模式)
-
创建匿名卷

创建命名卷

可以看到没有指定使用 --label 时,是没有labels的,如果使用,这里就会出现键值对形式的labels

docker volume ls
用于列出 宿主机 上所有卷的命令,可查看卷的名称、驱动类型等信息,是管理卷的基础操作之一。
docker volume ls [OPTIONS]
-
Options
-
-f/--filter: 按条件筛选卷(如标签、驱动、名称)
-
--format: 自定义输出格式(如表格、JSON)
-
-q/--quiet: 仅输出卷名(便于批量操作)
-

docker volume rm
用于删除一个或多个卷的命令,需确保卷未被容器使用(否则会报错),常用于清理无用卷以释放磁盘空间。
docker volume rm [OPTIONS] VOLUME [VOLUME...]
-
Options
- -f: 强制删除

docker volume inspect
用于查看卷的详细信息的命令,可获取卷的存储路径、驱动类型、标签、挂载情况等核心配置,是排查卷问题、了解卷属性的关键工具。
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
-
Options
- --format: 提取特定信息

docker volume prune
用于一键清理所有未被容器使用的卷 的命令,可快速释放磁盘空间,避免无用卷占用存储资源。需要注意的是: 这个命令只能删除没有被使用的匿名卷,命名卷无法一键清理
docker volume prune [OPTIONS]
-
Options
-
-f/--force : 跳过确认提示,直接删除(无需手动输入 y)
-
--filter: 按条件筛选要删除的卷(如标签、名称)
-

- v
在 Docker 中,-v(或 --volume)是用于挂载卷或绑定目录的简写参数,是容器数据持久化、共享的常用方式。它的核心作用是将宿主机的目录 / 卷与容器内的目录建立映射,实现数据互通。
同时,上述使用命令创建的存储卷是没有进行挂载的,创建之后也要使用 -v 命令完成挂载
docker run -v [宿主机路径/卷名]:[容器内路径]:[options] [镜像名]
-
Options
-
ro: 只读
-
rw: 读写(默认)
-



只读
docker run --name test1 -v volumeTest5:/usr/share/nginx/html:ro nginx:1.29.3
容器不能对文件进行删除

同步测验
容器对应目录的内容

我们先看看宿主机对应路径下是否已经拿到容器绑定的内容

可以看到容器中的文件已经复制到了宿主机,这也是存储卷的一个特点:
宿主机卷目录为空时,会复制容器内容到卷
如果我们修改容器中对应目录的内容,宿主机是否会发生变化呢?当然会

那修改宿主机呢?容器也会被修改

多容器挂载
如果多个容器挂载同一个卷呢?
# 容器1
docker run --name test -v volumeTest2:/usr/share/nginx/html nginx:1.29.3
# 容器2
docker run --name test1 -v volumeTest2:/usr/share/nginx/html nginx:1.29.3



同一命名卷被多个容器挂载时,这些容器会共享卷内的所有数据------ 这是命名卷实现 "多容器数据互通" 的核心方式。
-- mount
用于挂载卷、绑定目录或临时文件系统的显式参数 (相比 -v 更清晰),通过键值对形式定义挂载类型、源路径、目标路径等,可读性更强,尤其适合复杂挂载场景。
docker run --mount type=[类型],src=[源],dst=[目标],[options] [镜像]
-
type:挂载类型(volume/bind/tmpfs);
-
src:挂载源(卷名 / 宿主机路径,tmpfs 无需 src);
-
dst:容器内的目标路径。
-
Options
-
ro: 只读
-
rw: 读写(默认)
-
如果我们没有输入 type 参数,那就默认为 volume 类型,此时src就是卷名

如果src为路径呢?会进行报错

绑定卷
在 Docker 中,"绑定卷"(Bind Mount)是一种挂载方式,直接将宿主机 的目录或文件映射到容器内的指定路径,实现宿主机与容器之间的数据实时同步。它与命名卷的核心区别在于:绑定卷依赖宿主机的具体路径,而命名卷由 Docker 统一管理存储位置。
- v
docker run -v [宿主机绝对路径]:[容器内路径]:[权限] [镜像名]
和管理卷类似,但是宿主机的目录可以自定义
首先先创建一个空目录

进行挂载,我们先看一个没有挂载的容器

现在创建一个有挂载的容器

发现两个容器同一目录下内容不一样,是因为绑定挂载:直接覆盖容器目录内容
无论宿主机目录是否为空,容器内该目录都会被宿主机目录的内容完全覆盖
--mount
docker run --mount type=bind,src=[宿主机绝对路径],dst=[容器内路径],[可选参数] [镜像名]


临时卷
临时卷数据位于内存中,在容器和宿主机之外。
tmpfs 局限性
-
不同于卷和绑定挂载,不能在容器之间共享 tmpfs 挂载。
-
这个功能只有在 Linux 上运行 Docker 时才可用
创建卷
--tmpfs
用于挂载 临时文件系统(tmpfs) 的参数,它将容器内的目录直接映射到宿主机的内存中(部分场景可能使用交换分区),数据仅在容器运行时存在,容器停止或删除后数据会丢失,适合存储无需持久化的临时数据。
docker run --tmpfs [容器内路径]:[可选参数] [镜像名]

当我们查看容器详情,可以看到 Mounts 是空的

但是可以找到一个 Tmpfs 里面有挂载信息

--mount
docker run --mount type=tmpfs,dst=[容器内路径],[可选参数] [镜像名]
临时卷和其他有点不一样:
-
type:挂载类型(volume/bind/tmpfs);
-
dst:容器内的目标路径。
-
tmpfs-size:限制 tmpfs 最大容量
-
tmpfs-mode:设置目录权限(八进制)

使用 --mount 命令创建的挂载,会让容器详情的Mount中存在对应信息
