Docker Compose 本地环境搭建:独立 Compose + 共享网络 + .env 统一管理(架构设计篇)
- [🔗 前言:Docker Compose 本地环境搭建相关文章](#🔗 前言:Docker Compose 本地环境搭建相关文章)
- [🐳 Docker Compose 本地环境搭建:独立 Compose + 共享网络 + .env 统一管理(架构设计篇)](#🐳 Docker Compose 本地环境搭建:独立 Compose + 共享网络 + .env 统一管理(架构设计篇))
-
- 一、背景说明
- 二、整体设计思路
-
- [1️⃣ 服务拆分(按模块独立)](#1️⃣ 服务拆分(按模块独立))
- [2️⃣ 统一环境变量(.env)](#2️⃣ 统一环境变量(.env))
- [3️⃣ 共享网络(关键设计)](#3️⃣ 共享网络(关键设计))
- 三、目录结构设计
- [四、.env 文件设计(核心)](#四、.env 文件设计(核心))
- 五、共享网络创建
- [六、Compose 文件的统一规范(约定)](#六、Compose 文件的统一规范(约定))
-
- [1️⃣ 引入 env 文件](#1️⃣ 引入 env 文件)
- [2️⃣ 使用统一网络](#2️⃣ 使用统一网络)
- [3️⃣ 服务命名规范](#3️⃣ 服务命名规范)
- [4️⃣ 端口、路径统一从 env 获取](#4️⃣ 端口、路径统一从 env 获取)
- 七、启动方式(推荐)
- 八、服务访问方式
- 九、这种架构的优势总结
🔗 前言:Docker Compose 本地环境搭建相关文章
🐳 Docker Compose 本地环境搭建:独立 Compose + 共享网络 + .env 统一管理(架构设计篇)
一、背景说明
在日常开发或测试环境中,我们通常会依赖多个基础服务,例如:
- MySQL
- Redis
- Elasticsearch
- Nacos
- SkyWalking
如果把所有服务全部写在一个 docker-compose.yml 中,会带来几个问题:
- ❌ 文件臃肿,不易维护
- ❌ 服务之间强耦合
- ❌ 无法按需启动/停止
- ❌ 团队协作困难
因此,本篇文章介绍一种更清晰、可扩展的方式:
独立 Compose + 共享网络 + 统一 env 管理
二、整体设计思路
核心思想分为三点:
1️⃣ 服务拆分(按模块独立)
每一个基础服务使用独立的 docker-compose.yml:
- MySQL 单独一个 compose
- Redis 单独一个 compose
- Elasticsearch 单独一个 compose
👉 好处:
- 可以单独启动某个服务
- 方便定位问题
- 配置清晰
2️⃣ 统一环境变量(.env)
所有服务共享一个 .env 文件:
👉 好处:
- 避免重复配置
- 修改一次,全局生效
- 方便统一端口、账号、路径等
3️⃣ 共享网络(关键设计)
所有服务加入同一个 Docker 网络,例如:
bash
dev-network
👉 好处:
- 服务之间可以通过 容器名互相访问
- 避免使用 IP
- 更贴近生产环境
三、目录结构设计
推荐使用如下结构:
bash
infra/
├── .env
├── mysql/
│ └── docker-compose.yml
├── redis/
│ └── docker-compose.yml
├── elasticsearch/
│ └── docker-compose.yml
├── skywalking/
│ └── docker-compose.yml
├── nacos/
│ └── docker-compose.yml
四、.env 文件设计(核心)
.env 是整个架构的核心配置入口。
示例:
env
# =========================
# 通用配置
# =========================
COMPOSE_PROJECT_NAME=infra
DOCKER_NETWORK=dev-network
# =========================
# MySQL
# =========================
MYSQL_ROOT_PASSWORD=123456
MYSQL_PORT=3306
MYSQL_DATA_DIR=./data/mysql
# =========================
# Redis
# =========================
REDIS_PORT=6379
REDIS_PASSWORD=123456
# =========================
# Elasticsearch
# =========================
ES_PORT=9200
ES_JAVA_OPTS=-Xms512m -Xmx512m
# =========================
# Nacos
# =========================
NACOS_PORT=8848
# =========================
# SkyWalking
# =========================
SW_OAP_PORT=11800
SW_UI_PORT=8080
五、共享网络创建
在使用之前,需要手动创建网络(只需一次):
bash
docker network create dev-network
⚠️ 注意:所有 compose 都必须引用这个网络
六、Compose 文件的统一规范(约定)
虽然每个服务的 docker-compose.yml 不同,但建议统一规范:
1️⃣ 引入 env 文件
yaml
env_file:
- ../.env
2️⃣ 使用统一网络
yaml
networks:
default:
external: true
name: ${DOCKER_NETWORK}
3️⃣ 服务命名规范
yaml
services:
mysql:
redis:
elasticsearch:
👉 建议直接使用服务名作为容器 DNS 名
4️⃣ 端口、路径统一从 env 获取
yaml
ports:
- "${MYSQL_PORT}:3306"
七、启动方式(推荐)
每个服务独立启动:
bash
cd mysql
docker compose --env-file ../.env up -d
cd ../redis
docker compose --env-file ../.env up -d
👉 优点:
- 按需启动
- 控制粒度更细
八、服务访问方式
在同一网络下:
| 服务 | 访问方式 |
|---|---|
| MySQL | mysql:3306 |
| Redis | redis:6379 |
| ES | elasticsearch:9200 |
👉 重点:使用服务名访问,而不是 IP
九、这种架构的优势总结
- ✅ 模块解耦
- ✅ 易于扩展(新增服务只需加目录)
- ✅ 配置统一(.env)
- ✅ 更接近生产环境
- ✅ 团队协作友好