docker工作区的核心是网络隔离、命名空间分离与配置复用,而非单纯建文件夹;需为每个项目创建专属网络(如project-a-net)、绑定docker-compose.yml中的networks、使用服务名通信、分层复用配置、按项目隔离命名卷,三者共同构成“一项目一世界”的运行时边界。

为不同项目划分独立的 Docker 工作区,核心不是“建一堆文件夹”,而是通过网络隔离 + 命名空间分离 + 配置复用,让每个项目在逻辑和运行时完全互不感知。
每个项目独占一套自定义网络
Docker 默认的 bridge 网络是全局共享的,多个项目若没显式指定网络,容器可能意外互通。正确做法是:
- 为每个项目创建专属网络,命名带项目标识:
docker network create project-a-net docker network create project-b-net
- 在对应项目的
docker-compose.yml中强制绑定:networks: default: name: project-a-net这样,project-a 的
db服务只能被同网的web解析到,project-b 根本查不到它,连 DNS 请求都不出本网络。
服务名统一、实例隔离,代码零修改
容器间通信始终用服务名(如 mysql、redis),不要写 IP 或 localhost。Docker 内置 DNS 会自动把服务名解析成当前网络内对应容器的 IP:
- project-a 的
app连redis://redis:6379→ 解析到project-a-net里的 redis 容器 - project-b 的
app连同样地址 → 解析到project-b-net里的另一个 redis 容器
应用代码完全不用改,靠网络边界实现“同名不同实”。
目录结构与配置分层管理
避免为每个项目复制整套 docker-compose.yml。推荐按项目分目录,但复用基础配置:
my-projects/
├── project-a/
│ ├── docker-compose.yml # 指定 network + volumes + 端口映射
│ ├── docker-compose.override.yml # 开发期覆盖(如挂载源码、启用 xdebug)
│ └── src/ # 项目代码
└── project-b/
├── docker-compose.yml
├── docker-compose.override.yml
└── src/
运行时用组合命令:
cd project-a && docker-compose up -d cd project-b && docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d
既保证环境独立,又避免配置重复。
数据卷也按项目隔离
别共用 ./data 这种相对路径。为每个项目声明命名卷或绝对路径:
volumes:
db-data:
driver: local
driver_opts:
type: none
device: /opt/project-a/mysql-data
o: bind
或者直接用命名卷(更推荐):
volumes: - project-a-db:/var/lib/mysql
Docker 会自动为每个卷加前缀,避免跨项目误挂载。
本质上,Docker 工作区不是文件系统概念,而是由 network + volume + container name 共同构成的运行时边界。划清这三者,就真正做到了“一项目一世界”。











