最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Docker Compose 如何实现多环境的配置分离管理
时间:2026-08-24 08:16:49 编辑:袖梨 来源:一聚教程网
Docker Compose多环境配置核心是文件分层与变量分级:通过compose.yaml(基础)+ compose.dev.yaml/compose.prod.yaml等(环境覆盖)组合叠加,配合.env文件、--env-file及service.environment四级变量优先级机制,实现零代码修改的动态配置生成。
Docker Compose 实现多环境配置分离,核心是“文件分层 + 变量分级”,不靠改代码,也不靠手动替换,而是通过组合不同配置文件和环境变量来动态生成最终配置。
用多个 YAML 文件做分层覆盖
把配置拆成基础层和环境层,启动时按需叠加:
- compose.yaml(或 docker-compose.yml):只放所有环境共用的部分,比如服务名、镜像、基础端口、网络定义、卷声明
- compose.dev.yaml:开发专用,例如挂载本地源码、开启调试端口、使用轻量数据库镜像、禁用日志压缩
- compose.prod.yaml:生产专用,比如设置 restart: always、限制内存/CPU、启用 HTTPS 端口、连接外部 RDS、关闭调试功能
- compose.test.yaml:测试专用,可预置测试数据库初始化脚本、缩短健康检查间隔、启用覆盖率收集
运行命令示例:
开发环境:
docker compose -f compose.yaml -f compose.dev.yaml up -d
生产环境:
docker compose -f compose.yaml -f compose.prod.yaml up -d
用 .env 文件管理环境变量
变量按作用范围和优先级分四层,后加载的同名变量会覆盖前面的:
-
系统环境变量(宿主机全局,如
export DATABASE_URL=...)——优先级最低 -
.env(项目根目录,自动加载)——适合默认值,比如
APP_NAME=myapp -
--env-file(命令行指定)——灵活切换,如
--env-file .env.prod - service.environment(YAML 中直接写)——最高优先级,仅影响单个服务,适合临时调试
推荐做法:把通用变量放 .env.common,再为每个环境建 .env.dev、.env.prod,启动时显式加载:
docker compose --env-file .env.common --env-file .env.prod up -d
在 YAML 中用变量插值复用配置
避免重复写死值,让同一份 compose.yaml 适配不同环境:
- 用
${VAR_NAME}引用变量,支持默认值写法:${LOG_LEVEL:-info} - 数据库地址可统一写成:
DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME} - 镜像标签也可变量化:
image: myapp:${IMAGE_TAG:-latest},本地开发用dev,CI 流水线传v1.2.0
变量来源可以是 .env、--env-file 或 shell 导出,Compose 自动解析。
配合自定义网络与命名卷实现环境隔离
光配参数不够,还要防止环境间互相干扰:
- 每个环境用独立网络:
networks: [app-net-${ENV_NAME:-dev}],避免容器名冲突或跨环境通信 - 数据库数据卷也带环境后缀:
volumes: [pgdata-${ENV_NAME:-dev}:/var/lib/postgresql/data] - 开发环境用
bind mount挂载代码,生产环境用copy进镜像,两者互不耦合