docker-存储卷
概念
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中存在对应信息

更多推荐
所有评论(0)