顶层 volumes 是什么
Compose 文件顶层可以声明具名卷,服务通过「卷名:容器路径」引用它。声明处能配置驱动、驱动参数、标签与实际卷名,还能用 external 引用项目之外已存在的卷。具名卷的价值在于数据与容器生命周期解耦:容器删了、重建了,数据仍在卷里;由于有明确名字,备份、迁移与跨项目共享都变得可控。
基本信息
| 声明位置 | 文件顶层 volumes: 卷名: {driver, driver_opts, labels, name, external} |
|---|---|
| 服务引用 | volumes: - 卷名:/容器路径 或 卷名:/容器路径:ro |
| 实际卷名 | 默认带项目名前缀,如 myproj_dbdata |
| 外部卷 | external: true 引用已存在卷,Compose 不创建也不删除 |
| 删除行为 | docker compose down -v 删除项目声明的卷(外部卷除外) |
| 查看方式 | docker volume ls / docker volume inspect 卷名 |
典型使用场景
- 数据库、消息队列等有状态服务的数据落盘
- 把数据目录固定到指定宿主路径:driver_opts 绑定到具体位置
- 多项目共用一个数据卷:声明为 external 后两边接入
- 给卷打标签做分类与批量巡检,例如按环境标记
- 测试环境快速清库:down -v 一次性回收数据
- 迁移时先导出卷内容,再在新环境用同名卷还原
声明与引用
声明与引用
services:
db:
image: postgres:16-alpine
volumes:
- dbdata:/var/lib/postgresql/data # 具名卷引用:数据随卷保留
api:
image: app/api:1.4.2
volumes:
- shared:/srv/shared:ro # 只读接入同一卷
volumes:
dbdata:
driver: local
labels:
env: prod # 标签便于巡检与批量统计
shared:
external: true
name: platform-shared-data # 该项目外已存在的卷运维动作
运维动作
# 查看项目卷与卷详情(Mountpoint 是宿主上的实际目录)
docker volume ls --filter label=env=prod
docker volume inspect myproj_dbdata
# 停服务但保留数据;加 -v 会删除项目声明的卷
docker compose down
docker compose down -v
# 用临时容器备份卷内容到归档(数据库建议先停写或走自身备份机制)
docker run --rm -v myproj_dbdata:/data -v $PWD:/backup alpine \
tar czf /backup/dbdata.tar.gz -C /data .顶层字段怎么读
| 字段 | 作用 | 注意 |
|---|---|---|
| driver | 卷驱动,默认 local | 共享存储才换驱动 |
| driver_opts | 传给驱动的参数 | 可用 device 绑定到指定宿主目录 |
| labels | 附加元数据标签 | 便于巡检与批量操作 |
| name | 指定实际卷名 | 跨项目共享时显式指定 |
| external | 引用已有卷 | 写 true 时不会创建与删除 |
项目名会参与默认卷名拼接:换目录名或换项目名后卷名前缀变化,旧数据看起来像消失了。先用 docker volume ls 确认实际卷名,再决定是改名还是重建引用。
down -v 是破坏性操作:它会删除项目声明的卷,也就是真实数据。生产执行前先确认卷的声明方式与是否 external,并留一份可用备份。