docker compose 一键拉起多层分布式系统需合理组织依赖、网络、配置与启动顺序。典型四层包括api网关、认证/配置中心、业务微服务和基础设施,通过自定义网络、healthcheck、动态路由及服务发现实现协同工作。

用 Docker Compose 一键拉起含微服务网关的多层分布式系统,核心在于合理组织服务依赖、网络互通、配置分离和启动顺序控制。它不是简单堆叠容器,而是通过 docker-compose.yml 描述一个协同工作的服务拓扑。
明确分层结构与关键组件角色
典型的四层结构包括:
- API 网关层(如 Spring Cloud Gateway、Kong 或 Traefik):统一入口,负责路由、鉴权、限流
- 认证/配置中心层(如 Keycloak、Nacos、Apollo):支撑网关和业务服务的动态配置与用户管理
- 业务微服务层(如 user-service、order-service):各自独立部署,注册到服务发现组件
- 基础设施层(如 PostgreSQL、Redis、RabbitMQ):提供数据与消息能力
编写可协作的 docker-compose.yml
关键点不是“写全”,而是“连通”和“就绪”:
- 所有服务共用自定义 bridge 网络(如
micro-net),避免默认网络隔离问题 - 用
depends_on+healthcheck控制启动依赖(例如网关必须等 Nacos 健康后才启动) - 网关配置通过
volumes挂载 YAML 或通过环境变量注入路由规则,不硬编码在镜像里 - 微服务使用
environment指定注册中心地址(如EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://nacos:8848)
处理服务发现与动态路由的衔接
网关要能自动识别新上线的微服务,需满足:
- 若用 Nacos:微服务以
spring-cloud-starter-alibaba-nacos-discovery注册;网关集成nacos-discovery并开启spring.cloud.gateway.discovery.locator.enabled=true - 若用 Eureka:确保网关和微服务都指向同一 Eureka Server 容器(如
eureka-server:8761/eureka) - Traefik 可直接监听 Docker socket,通过标签(
traefik.http.routers.user.rule=PathPrefix(`/user`))动态生成路由,无需中心注册
一次拉起后的验证要点
运行 docker-compose up -d 后别急着调接口,先确认:
- 所有容器状态为
Up,且docker-compose ps中无反复重启项 - 进网关容器执行
curl http://nacos:8848/nacos/v1/ns/instance/list?serviceName=user-service,看是否返回实例 - 访问网关暴露端口(如
http://localhost:8080/user/info),观察日志中是否出现下游服务响应 - 检查 Redis、PostgreSQL 是否被正确挂载数据卷,避免每次重启丢失元数据
不复杂但容易忽略:网关配置热更新支持、微服务健康检查路径暴露、跨服务调用时的超时与重试设置,这些决定了系统上线后的稳定性。











