docker-存储卷

概念

Docker 中的存储卷(Volume)是用于持久化和管理容器数据的独立存储机制,它将容器内的目录或文件与宿主机(或远程存储)的特定位置绑定,实现数据的持久化、共享与解耦。简单来说,存储卷是容器与外部存储之间的 "桥梁",解决了容器数据易失性的核心问题。

特性

  1. **数据持久化:**容器本身是临时的(停止 / 删除后数据丢失),而卷存储在容器生命周期之外。即使容器被删除,卷中的数据依然保留在宿主机(或远程存储)中。

  2. 与容器 解耦 **:**卷的生命周期独立于容器,一个卷可被多个容器挂载、复用,实现数据共享(比如多个容器读写同一配置文件)。

  3. **性能优化:**卷直接映射到宿主机文件系统(或高性能存储),读写性能优于容器的可写层(容器层是分层存储,读写效率较低)。

  4. **跨平台兼容:**无论是 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 会被移除,数据就会丢失,用于高性能的临时数据存储。

存储卷的用途

  1. 持久化数据库数据 :如 MySQL 容器将 /var/lib/mysql 挂载到卷,避免容器删除后数据丢失。

  2. 共享配置文件:多个容器挂载同一卷,共享配置(如 Nginx 配置文件)。

  3. 宿主机 与容器文件同步:开发时挂载代码目录,容器内实时读取宿主机的代码修改。

  4. 分离应用与数据:实现 "应用容器化,数据持久化",符合微服务架构的设计原则。

存储卷和容器可写层的区别

|-------|--------------|-------------|
| 特性 | 存储卷 | 容器可写层 |
| 数据持久化 | 容器删除后数据保留 | 容器删除后数据丢失 |
| 存储位置 | 宿主机独立目录(或远程) | 容器分层存储目录 |
| 性能 | 直接读写宿主机存储,高效 | 分层存储,读写性能较低 |
| 共享性 | 支持多容器共享 | 仅当前容器可访问 |

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中存在对应信息

相关推荐
大树8811 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠11 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质11 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工13 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn8613 小时前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智13 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_13 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉14 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦15 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_9618752415 小时前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant