如何用Docker在单服务器实现Dev、Staging、Production环境独立运行?
Docker多环境独立运行解决方案
容器被替换的核心原因是:docker-compose默认以当前目录名作为项目名称,不同环境启动时共用同一个项目名,导致服务实例被覆盖。要实现三个环境独立运行,只需给每个环境指定唯一项目名,并正确加载对应环境变量文件即可。
核心解决步骤
1. 为每个环境指定唯一项目名
使用docker-compose的-p参数(或COMPOSE_PROJECT_NAME环境变量),给Dev、Staging、Production分别设置不同的项目标识,比如myapp-dev、myapp-staging、myapp-prod。
2. 加载对应环境的.env文件
通过--env-file参数指定要加载的环境变量文件,替代默认的.env。
完整启动命令示例
- 开发环境(Dev)
docker-compose -p myapp-dev --env-file .env.dev -f docker-compose.yml -f docker-compose.dev.yml up -d --build
- 预发布环境(Staging)
docker-compose -p myapp-staging --env-file .env.staging -f docker-compose.yml -f docker-compose.staging.yml up -d --build
- 生产环境(Production)
docker-compose -p myapp-prod --env-file .env.prod -f docker-compose.yml -f docker-compose.prod.yml up -d --build
后续操作注意事项
- 停止某个环境的服务时,必须带上对应项目名参数:
# 停止开发环境服务 docker-compose -p myapp-dev down - 查看某个环境的运行状态:
# 查看预发布环境容器状态 docker-compose -p myapp-staging ps - 端口映射避免冲突:确保三个环境的端口映射不重复(比如Dev用8080,Staging用8081,Production用80),否则会启动失败。
优化建议
可以把每个环境的启动命令封装成shell脚本,比如:
start-dev.sh
#!/bin/bash docker-compose -p myapp-dev --env-file .env.dev -f docker-compose.yml -f docker-compose.dev.yml up -d --build
start-staging.sh
#!/bin/bash docker-compose -p myapp-staging --env-file .env.staging -f docker-compose.yml -f docker-compose.staging.yml up -d --build
赋予脚本执行权限后,直接运行脚本即可启动对应环境,避免重复输入长命令。
内容的提问来源于stack exchange,提问作者Donny Akhmad Septa Utama
相关产品推荐
相关产品推荐

