Docker Compose 本地环境搭建:独立 Compose + 共享网络 + .env 统一管理(架构设计篇)

Docker Compose 本地环境搭建:独立 Compose + 共享网络 + .env 统一管理(架构设计篇)

  • [🔗 前言:Docker Compose 本地环境搭建相关文章](#🔗 前言:Docker Compose 本地环境搭建相关文章)
  • [🐳 Docker Compose 本地环境搭建:独立 Compose + 共享网络 + .env 统一管理(架构设计篇)](#🐳 Docker Compose 本地环境搭建:独立 Compose + 共享网络 + .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)
  • ✅ 更接近生产环境
  • ✅ 团队协作友好

相关推荐
岳来1 小时前
docker 容器文件 hostconfig.json 和 config.v2.json 的区别
docker·容器·hostconfig.json·config.v2.json
爱喝雪碧的可乐1 小时前
【Redis 毁灭计划】7 大高危操作打崩线上服务!从缓存雪崩到数据库宕机,90% 程序员都踩过的坑
开发语言·网络·redis·php
运维小斌2 小时前
麒麟v10arm使用dnsmasq部署本地DNS服务器
linux·运维·服务器·网络
AI服务老曹2 小时前
深度解析:基于 Docker 与 GB28181 的异构计算 AI 视频管理架构,如何实现 X86/ARM 与 GPU/NPU 的全场景兼容?
运维·docker·容器
Elastic 中国社区官方博客2 小时前
使用 Elastic Observability 和 MCP 的 Agentic 驱动 Kubernetes 调查
数据库·elasticsearch·搜索引擎·云原生·容器·kubernetes·全文检索
阿正的梦工坊2 小时前
DOCKER_DATABASE_URL 逐段解析:部署时候的信息解析
数据库·docker·容器
咖喱o2 小时前
ARP代理(ARP Proxy)
运维·服务器·网络
郝开2 小时前
Docker Compose 本地环境搭建:nacos
运维·docker·容器