关键在于配置分离、网络隔离与启动时动态注入:通过环境变量控制不同环境的数据库地址等参数,利用Compose服务名实现容器间通信隔离,结合端口映射或反向代理区分Web入口,并按项目拆分目录与镜像确保构建上下文独立。

用 Docker 搭建多环境隔离的开发平台,关键不是堆容器,而是靠配置分离 + 网络隔离 + 启动时动态注入这三招把开发、测试、预发甚至多个项目彼此隔开,互不干扰。
用环境变量控制配置差异
不同环境(dev/test/prod)的数据库地址、API 域名、日志级别等,不该写死在代码里,而应通过环境变量传入容器。Docker 和 Compose 都原生支持:
- 启动单个容器时加
-e DB_HOST=172.20.0.10 -e LOG_LEVEL=debug - 在
docker-compose.yml的服务下写environment:块,或引用.env文件 - 生产环境可改用
env_file:加载加密或权限受限的配置文件
用 Compose 服务名实现网络隔离
Docker Compose 默认为每个 docker-compose.yml 创建独立桥接网络,服务之间只能通过服务名通信——这是天然的隔离层:
- dev 环境的
web服务连的是db-dev容器,test 环境的web连的是db-test,名字不同,完全不碰面 - 避免用
host.docker.internal或172.17.0.1这类共享网关,会绕过服务发现,破坏隔离 - 如需跨 compose 项目通信(极少见),应显式指定共用网络,而不是默认打通
用端口映射 + 虚拟主机区分 Web 入口
前端或 Web 服务要对外暴露,不能全挤在 80/443,得靠组合策略分流:
- 简单场景:每个环境独占端口,比如
-p 8080:80(dev)、-p 8081:80(test) - 真实项目推荐反向代理(如 nginx-proxy 或 traefik),让容器声明
VIRTUAL_HOST=dev.example.com,由代理统一转发 - 本地开发可用 hosts 绑定域名,配合 proxy 实现和线上一致的访问路径,避免硬编码路径出错
按项目拆分目录与镜像,不共用构建上下文
多个 PHP/Node/Java 项目共存时,最怕一个项目改了全局依赖影响另一个。正确做法是:
- 每个项目有自己独立的
Dockerfile和docker-compose.yml,基础镜像按需选(如php:8.2-apache或node:20-alpine) - PHP 扩展、Python 包、Java 依赖都只装在对应项目的镜像里,不复用中间层
- 代码挂载用
volumes:映射到各自./src,禁止跨项目挂载同一目录


















