命名卷由docker守护进程统一管理,适合生产环境持久化与跨容器共享;绑定挂载直接映射宿主机路径,便于开发调试但跨环境兼容性差,且需手动维护路径与权限。

使用 Docker Compose 声明式挂载数据卷,核心在于通过 docker-compose.yml 文件统一定义服务、网络和存储,避免手动创建卷、反复绑定路径,让集群编排更可靠、可复用。
明确区分命名卷与主机绑定路径
声明式挂载的关键是选对卷类型:命名卷由 Docker 管理,适合容器间共享或持久化数据库数据;主机路径(./data)适合开发调试,但跨环境易出错。生产环境优先用命名卷。
- 命名卷示例:
volumes: [myapp-db-data:/var/lib/mysql],Docker 自动创建并管理生命周期 - 主机路径示例:
volumes: ["./mysql-data:/var/lib/mysql"],需确保宿主机目录存在且权限正确 - 同一服务中可混合使用,如日志用主机路径便于收集,数据库用命名卷保障一致性
在 services 中直接声明 volumes 字段
无需提前运行 docker volume create,直接在服务配置里写明挂载点,Compose 会自动处理创建与关联。
- 语法格式:
volumes: ["<source>:<target>[:<mode>]"]</mode></target></source>,例如db-data:/var/lib/postgresql/data:rw -
source是卷名或绝对路径,target是容器内路径,mode可选ro或rw(默认rw) - 多个挂载可并列书写,顺序无关,但建议按功能分组(如数据、配置、日志)
通过 top-level volumes 块集中管理卷配置
在文件顶层定义 volumes: 区块,能显式设置驱动、标签、选项,提升可读性和复用性。
- 基础命名卷:
volumes: { db-data: {} },Compose 自动使用 local 驱动 - 指定驱动与参数:
cache-volume: { driver: local, driver_opts: { type: 'tmpfs', device: 'tmpfs', o: 'size=100m' } } - 添加元数据:
labels: { "com.example.description": "PostgreSQL persistent data" },方便后续排查
结合 depends_on 和健康检查保障启动顺序
挂载本身不解决依赖问题。若应用需等数据库就绪再读写卷,仅靠 depends_on 不够,应配合健康检查与重试逻辑。
-
depends_on:只控制启动顺序,不等待容器就绪;搭配healthcheck才真正可靠 - 例如 PostgreSQL 服务中加入:
healthcheck: { test: ["CMD-SHELL", "pg_isready -U postgres"], interval: 30s, timeout: 10s, retries: 5 } - 应用服务用
depends_on: { db: { condition: service_healthy } },确保挂载完成且 DB 可用后再启动
不复杂但容易忽略:卷的生命周期独立于容器,删除服务时默认不删卷。需要清理时用 docker compose down -v 显式移除。











