使用 Docker Compose 部署 SpringCloud 微服务适合多服务协同场景,通过一个 YAML 文件统一管理容器编排、网络和服务依赖,能显著降低手动维护多个容器的复杂度。
先说结论:Docker Compose 是部署 SpringCloud 微服务的实用工具,适合中小型项目或测试环境,生产环境建议结合 Kubernetes 做更高可用的编排。
- 适合:多微服务需要统一启动顺序、网络互通、配置管理的场景
- 先准备:Docker 环境、各微服务 Dockerfile、docker-compose.yml 配置文件、依赖服务镜像(如 MySQL、Nacos)
- 验收:所有容器状态正常、服务注册发现可用、接口调用通畅
命令速用版
# 查看 Docker Compose 版本
docker compose version
# 构建并启动所有服务
docker compose up -d `--build`
# 查看容器运行状态
docker compose ps
# 查看服务日志
docker compose logs -f [服务名]
# 停止并清理
docker compose down为什么会这样
SpringCloud 微服务架构通常包含多个独立服务模块,比如注册中心、网关、业务服务等。手动逐个启动容器不仅效率低,还要处理服务间的依赖顺序和网络配置。Docker Compose 通过一个 YAML 文件定义所有服务、网络和卷,一条命令就能完成整体编排,容器之间可以通过服务名直接通信,无需硬编码 IP 地址。
公开资料中没有看到可靠的量化数据表明性能提升比例,但从运维效率角度看,统一编排确实减少了手动操作步骤和出错概率。
分步处理
1. 准备 Docker 环境
确保服务器已安装 Docker 和 Docker Compose。较新版本的 Docker 已默认集成 Compose 插件,使用docker compose version可验证。
# 安装 Docker(CentOS 示例)
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker2. 编写各微服务的 Dockerfile
每个微服务模块需要独立的 Dockerfile,典型配置如下:
FROM openjdk:8-jre WORKDIR /app EXPOSE 8080 ENV TZ=Asia/Shanghai ADD your-service.jar /app/your-service.jar VOLUME /app/logs ENTRYPOINT ["java", "-jar", "/app/your-service.jar"]注意 jar 包和 Dockerfile 需在同一目录下,端口暴露要与 application.yml 中的 server.port 一致。
3. 编写 docker-compose.yml
在项目根目录创建 docker-compose.yml,定义所有服务和依赖关系:
version: '3.8' services: eureka-server: build: ./eureka-service ports: - "10086:10086" environment: SERVER_PORT: 10086 user-service: build: ./user-service ports: - "8081:8081" environment: SERVER_PORT: 8081 EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka-server:10086/eureka depends_on: - eureka-server mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: your_password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:关键点:服务间通过服务名通信(如
eureka-server),使用depends_on声明启动依赖顺序,数据库等持久化服务需配置卷挂载。4. 配置微服务注册中心地址
各微服务的 application.yml 中,注册中心地址应使用 Docker 服务名而非 localhost:
eureka: client: service-url: defaultZone: http://eureka-server:10086/eureka5. 构建并启动
# 在项目根目录执行 docker compose up -d `--build`怎么验证是否生效
- 容器状态:
docker compose ps查看所有容器是否处于 Up 状态 - 服务注册:访问 Eureka 控制台(如 http://你的 IP:10086),确认各微服务已注册
- 日志检查:
docker compose logs [服务名]查看是否有启动报错 - 接口调用:通过网关或直接调用微服务接口,确认服务间通信正常
- 网络连通:进入容器
docker compose exec [服务名] bash,用 curl 测试其他服务名是否可解析
常见坑
- 端口冲突:宿主机端口映射不要重复,多个微服务实例映射不同宿主机端口
- 服务名解析:容器内通信必须用服务名,不能用 localhost 或 127.0.0.1
- 启动顺序:注册中心、配置中心、数据库等基础服务需先启动,业务服务配置
depends_on - 时区问题:容器默认时区可能是 UTC,日志时间会错,需在 Dockerfile 或 compose 中设置
TZ=Asia/Shanghai - 内存限制:多个 Java 容器同时运行内存消耗大,生产环境建议设置
deploy.resources限制 - 数据持久化:MySQL、Redis 等必须配置 volumes,否则容器删除后数据丢失
- 网络隔离:默认所有服务在同一网络,敏感服务可创建独立 network 进行隔离
参考来源
- Docker 最佳实践进阶 (二):Docker Compose 部署 SpringCloud 微服务项目 - 博客文章,介绍了 Docker Compose 简介、安装及多服务部署流程
- 使用 Docker 部署 SpringCloud Alibaba 微服务项目教程 - 阿里云开发者社区,包含 MySQL、Nacos 镜像安装及 docker-compose 编排示例
- Docker Compose 部署 Spring Cloud 微服务系统 - 技术教程,提供了完整的项目模块结构和 docker-compose.yml 配置示例
- DockerCompose - 微服务项目部署全过程 (最佳实践) - 技术文章,涵盖 SpringCloud Alibaba 技术选型和父项目 pom.xml 配置
- SpringCloud-基于 Docker 和 Docker-Compose 的项目部署 - 环境初始化教程,包含 Docker 安装、镜像源配置等前置步骤
- 【JAVA 应用实战-SpringCloud】(四) SpringCloud 微服务模块使用 docker-compose 进行部署 - 部署脚本示例,包含完整的 docker-compose.yml 配置