跳转至

Docker存储卷

约 1778 个字 11 行代码 预计阅读时间 6 分钟

存储卷介绍和作用

存储卷(Volume)是 Docker 提供的持久化数据机制,用于将容器内的数据独立于容器生命周期进行保存与共享,避免容器删除或重建导致数据丢失,同时支持在多个容器之间安全地共享数据,并且相比直接使用容器文件系统,性能更稳定、管理更方便、迁移备份也更容易

需要注意,卷是“容器内某个目录到宿主机存储位置的映射”,不是把整个容器文件系统都搬到宿主机,在创建卷时指定的目录实际上就是将容器的指定目录与宿主机绑定,容器中的这个目录放入的数据就会在宿主机对应的目录中查看到,从而实现数据同步和持久化

存储卷分类

  • volume(Docker管理卷):将指定的容器路径映射到宿主机的/var/lib/docker/volumes目录下(如果修改过Docker的默认路径会有所不同),只需在容器内指定挂载点,实际宿主机目录由Docker daemon自动创建或使用已有目录与卷建立关联,降低了卷与宿主机路径的耦合;缺点是用户无法指定具体宿主机目录,适合临时存储
  • bind(绑定数据卷):用户可以指定容器目录映射到宿主机指定目录,使用最频繁
  • tmpfs(临时数据卷):用户可以指定容器目录映射到宿主机内存中,容器停止后tmpfs会被移除,数据丢失,但是因为是在内存中,不同的进程之间内存是隔离的,安全性比前面两种都高,适合高性能且安全要求较高的数据存储

需要注意,如果是管理卷,当指定的容器目录中有资源时,会将该目录的资源拷贝到宿主机的目录中,但是如果是绑定卷,当绑定的宿主机目录有数据,则容器对应目录以宿主机目录一致,如果没有数据,则容器看到的就是空目录,而不会有任何其他操作,如果是临时卷,不管容器镜像中该路径是否已有文件都会被覆盖

管理卷操作

创建管理卷

使用下面的命令进行管理卷创建:

Bash
1
docker volume create [选项] [卷名]

常见选项:

  • -d, --driver:指定驱动,默认是local
  • --label:指定元数据

需要注意的是,如果不指定卷名,默认创建的是匿名卷

除了使用volume命令创建管理卷外,还可以使用运行/创建容器的命令通过参数来创建管理卷,一共有两种参数,分别为-v--mount,使用方式分别如下:

基本语法为:

Bash
1
docker run/create -v 卷名:容器中待绑定的目录名[:选项]

其中,当卷名为空时,创建的是匿名卷,否则即为命名卷,对于选项来说,针对卷的属性有例如ro表示只可读属性

基本语法为:

Bash
1
docker run --mount key=value...

关键键值:

  • type:卷类型,一共三种:volumebindtmpfs
  • src:卷名称,不写时为匿名卷
  • dst:容器中待绑定的目录名
  • readonly:设置只读属性

例如:

Bash
1
docker run --mount type=volume,src=nginxvol,dst=/testvol,readonly nginx:1.29.4

三种创建方式都可以使用查看容器详情命令查看Mount字段看到卷类型、源路径和目标路径,Source表示宿主机保存数据的路径,Destination表示容器内部路径

查看管理卷详细信息

使用下面的命令查看管理卷详细信息:

Bash
1
docker volume inspect [选项] 卷名...

常见选项:

  • -f:指定输出格式

列出所有管理卷

使用下面的命令列出所有管理卷:

Bash
1
docker volume ls [选项]

常见选项:

  • --format:指定输出格式(如jsontable
  • --filter, -f:过滤显示内容
  • -q:仅显示名称

删除未被使用的管理卷

使用下面的命令删除未被使用的管理卷:

Bash
1
docker volume rm [选项] 卷名...

常见选项:

  • -f:强制删除

需要注意的是,删除必须确保卷是处于未使用状态,哪怕是强制删除

清理未被使用的匿名管理卷

使用下面的命令删除未被使用的管理卷:

Bash
1
docker volume prune [选项]

常见选项:

  • --filter:根据指定条件过滤卷
  • -f, --force:不进行删除提示

绑定卷操作

创建绑定卷

创建绑定卷的方式只有通过命令参数,与管理卷一致,两种命令-v--mount,使用方式与管理卷基本一致,下面仅对不同点进行说明:

  1. 使用-v创建时,容器名称位置替换为宿主机路径;使用--mount时,type修改为bindsrc替换为宿主机路径
  2. 如果使用-v选项时,宿主机目录不存在会自动创建,--mount选项时,宿主机目录不存在会报错

两种创建方式都可以使用查看容器详情命令查看Mount字段看到卷类型、源路径和目标路径,Source表示宿主机保存数据的路径,Destination表示容器内部路径

临时卷操作

创建临时卷

创建临时卷的方式只有通过命令参数,两种命令--tmpfs--mount

基本语法:

Bash
1
docker run/create --tmpfs 容器内目录

基本语法:

Bash
1
docker run --mount key=value...

关键键值:

  • type:卷类型,一共三种:volumebindtmpfs
  • dst:容器中待绑定的目录名
  • tmpfs-size:挂载的目录大小(以字节为单位)。默认无限制
  • tmpfs-mode:八进制文件模式。默认1777

例如:

Bash
1
docker run --mount type=tmpfs,dst=/test,tmpfs-size=1m nginx:1.29.4

需要注意的是,如果是使用--tmpfs创建临时卷,Mount字段是空的,具体值在Tmpfs字段看到,但是使用--mount创建即可看到Mount字段与前面两个卷类似的信息

存储卷在实际研发中带来的问题

  1. 跨主机使用:Docker存储卷默认使用宿主机本地文件系统目录,容器在同一台主机上停止或删除后可重建,但无法在不同主机间调度复用,这属于Docker本身未解决的问题。可以通过自建NFS等共享存储来缓解,但强依赖运维能力。实际工程中,存储与计算逐渐分离,S3、NFS等分布式存储方案越来越普遍
  2. 启动参数难以追溯:容器启动参数很多,下次重启时容易遗忘最初的选项,因此需要用文件化的方式保存启动配置,这也是容器编排工具的作用。单机可以用命令或文件启动单个容器,但若涉及几十上百个容器,就需要专业编排工具(如K8s或云厂商的企业版编排方案)
  3. 复杂场景仍然依赖运维:对有状态、需持久化的集群组件(如MySQL主从),部署、扩缩容与故障恢复高度依赖运维经验。必须清楚集群规模、主从拓扑、库的分布等细节才能排障,这类复杂场景往往仍需人工介入,很难完全被工具替代