首页/云/云与容器速查/Compose 数据卷声明与使用
容器与 Docker106 条

Compose 数据卷声明与使用

顶层 volumes 声明具名卷,服务里以 卷名:容器路径 引用;绑定挂载直接写宿主路径。具名卷由引擎管理,跨容器生命周期保留数据。

云与容器速查云更新于 2026-10-13

Compose 里的卷怎么用

Compose 的卷有三种写法:顶层 volumes 声明具名卷、服务里用「卷名:容器路径」引用;直接写宿主路径是绑定挂载;只写容器路径则由引擎自动创建匿名卷。具名卷由引擎统一管理,独立于容器生命周期,删容器不删数据;绑定挂载把宿主目录直接映射进去,适合开发时改配置。

基本信息

具名卷顶层 volumes 声明,服务里以 卷名:容器路径 引用
绑定挂载写宿主路径,相对路径以 compose 文件所在目录为基准
只读挂载路径后缀加 :ro,配置文件通常这样挂
外部卷用 external 与 name 复用已有卷,不新建
匿名卷只写容器路径,由引擎自动创建并命名
数据位置具名卷数据在 Docker 数据目录下,不在项目目录里

三种写法对比

写法管理方适用场景
具名卷Docker 引擎数据库数据等需要长期保留的内容
绑定挂载宿主目录开发时挂源码与配置文件
匿名卷引擎自动创建临时数据,删容器后需手动清理
外部卷已有卷多项目共享或迁移过来的数据

示例

示例
services:
  db:
    image: mysql:8.0
    volumes:
      - db-data:/var/lib/mysql                   # 具名卷:数据长期保留
      - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro # 绑定挂载并设为只读
volumes:
  db-data:

典型使用场景

  • 数据库数据目录用具名卷,容器重建数据不丢
  • 开发环境把源码与配置以绑定挂载挂进去,改完即时生效
  • 多环境共享同一份数据,用外部卷复用已有卷
  • 配置文件只读挂载,避免容器内被误改
具名卷的实际名称带项目前缀:换项目名相当于换一套卷,迁移数据时不要找错目录。
绑定挂载的相对路径以 compose 文件所在目录为基准,不是当前 shell 目录,在别的目录执行命令容易挂到意外位置。
备份只打包项目目录会漏掉具名卷里的数据:卷在 Docker 数据目录下,备份脚本要单独覆盖这部分路径。

易错点

  • 以为数据目录在项目里:具名卷数据在 Docker 数据目录,备份容易漏
  • 绑定挂载相对路径理解错:相对的是 compose 文件目录而非当前目录
  • 用绑定挂载放数据库数据:宿主权限与容器用户不匹配导致启动失败
  • 清理容器时把匿名卷一起删掉:临时数据没备份就没了
  • 项目名改了却继续找旧卷:实际读到的是一套空目录

数据来源与参考

  • Docker Docs:Compose volumes

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌