项目名决定资源前缀
Compose 项目名决定了容器、网络与数据卷的名称前缀,因此同名服务在不同项目名下可以互不干扰。用命令行参数或环境变量区分开发与测试环境,就能在同一台机器上运行多套互不冲突的栈,这是本地多环境隔离中最省事的做法。
基本信息
| 默认值 | compose 文件所在目录名,并做小写化处理 |
|---|---|
| 显式指定 | docker compose -p 项目名 up -d |
| 环境变量 | 用项目名环境变量统一指定,适合写进脚本 |
| 文件内声明 | 顶层 name 字段;命令行参数优先级更高 |
| 命名影响 | 容器名为项目名加服务名加序号,网络与卷同样带前缀 |
| 清理范围 | down 只清理当前项目,其他项目不受影响 |
典型使用场景
- 同一台机器同时运行开发与测试两套环境
- 同一份编排在多个分支或版本上并行验证
- 演示环境与个人实验环境共存互不干扰
- 为不同客户部署相同技术栈但需要互相隔离
- 按项目维度整体回收资源,避免影响其他环境
同机跑两套环境
同机跑两套环境
COMPOSE_PROJECT_NAME=shop-dev docker compose up -d
COMPOSE_PROJECT_NAME=shop-staging docker compose up -d
docker compose -p shop-dev ps # 查指定项目的实例
docker compose -p shop-dev down # 只清理该项目
docker volume ls --filter label=com.docker.compose.project=shop-dev # 查看该项目卷名称影响
| 资源 | 命名规则 | 注意事项 |
|---|---|---|
| 容器 | 项目名加服务名加序号 | 项目名相同会导致同名容器冲突 |
| 网络 | 项目名加网络名 | 默认网络按项目隔离 |
| 卷 | 项目名加卷名 | 数据按项目隔离,切换项目后看不到旧数据 |
| 标签 | 带项目相关标签 | 便于按项目筛选与批量清理 |
| 清理 | down 只影响当前项目 | 旧项目残留需要单独清理 |
down 只清理当前项目:切换项目名部署之后,旧项目残留的容器、网络与卷要单独清理,否则会持续占用端口与磁盘,时间一长自己也说不清哪些还在用。
复制目录起第二套环境是最常见的踩坑方式:目录名相同会导致默认项目名相同,容器名冲突直接失败;若按新目录名生成了新项目名,旧的卷带旧前缀找不到,表现为「数据凭空消失」。