SpringBoot + Dubbo + ZooKeeper 的 Docker Compose 部署方案
下面我将详细解释如何使用 Docker Compose 部署基于 SpringBoot、Dubbo 和 ZooKeeper 的微服务系统。
一、整体架构设计

二、项目目录结构
dubbo-project/
├── docker-compose.yml
├── .env # 环境变量文件
├── zookeeper/
│ ├── conf/
│ │ └── zoo.cfg # ZK 配置文件
│ └── data/ # ZK 数据目录
├── service-user/ # 用户服务
│ ├── Dockerfile
│ ├── target/service-user.jar
│ └── config/
│ └── application.yml
├── service-order/ # 订单服务
│ ├── Dockerfile
│ ├── target/service-order.jar
│ └── config/
│ └── application.yml
├── service-gateway/ # API网关
│ ├── Dockerfile
│ ├── target/service-gateway.jar
│ └── config/
│ └── application.yml
└── mysql/
├── init.sql # 数据库初始化脚本
└── conf/
└── my.cnf # MySQL 配置文件
三、核心配置文件详解
1. .env 环境变量文件
# 公共环境变量
DUBBO_REGISTRY_ADDRESS=zookeeper://zk:2181
SPRING_PROFILES_ACTIVE=prod
TZ=Asia/Shanghai
# MySQL 配置
MYSQL_ROOT_PASSWORD=root123
MYSQL_DATABASE=dubbo_db
# 服务端口
GATEWAY_PORT=8080
USER_SERVICE_PORT=20880
ORDER_SERVICE_PORT=20881
2. docker-compose.yml 完整配置
version: '3.8'
networks:
dubbo-net:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
services:
# ZooKeeper 注册中心
zk:
image: zookeeper:3.8
container_name: zookeeper
hostname: zookeeper
ports:
- "2181:2181"
- "2888:2888"
- "3888:3888"
volumes:
- ./zookeeper/data:/data
- ./zookeeper/conf/zoo.cfg:/conf/zoo.cfg
- ./zookeeper/logs:/datalog
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zookeeper:2888:3888;2181
networks:
- dubbo-net
healthcheck:
test: ["CMD", "zkOk.sh"]
interval: 10s
timeout: 5s
retries: 6
# MySQL 数据库
mysql:
image: mysql:8.0
container_name: mysql
hostname: mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
TZ: ${TZ}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
- ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf
networks:
- dubbo-net
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 10
# 用户服务
service-user:
build:
context: ./service-user
container_name: service-user
hostname: service-user
depends_on:
zk:
condition: service_healthy
mysql:
condition: service_healthy
environment:
DUBBO_REGISTRY_ADDRESS: ${DUBBO_REGISTRY_ADDRESS}
DUBBO_PROVIDER_HOST: service-user # 关键配置
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
TZ: ${TZ}
ports:
- "${USER_SERVICE_PORT}:20880"
networks:
- dubbo-net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:20880/health"]
interval: 30s
timeout: 10s
retries: 3
# 订单服务
service-order:
build:
context: ./service-order
container_name: service-order
hostname: service-order
depends_on:
zk:
condition: service_healthy
mysql:
condition: service_healthy
environment:
DUBBO_REGISTRY_ADDRESS: ${DUBBO_REGISTRY_ADDRESS}
DUBBO_PROVIDER_HOST: service-order # 关键配置
SPRING_PROFILES_ACTIVE
