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 数据目录下,备份脚本要单独覆盖这部分路径。