Docker Compose怎么部署SpringCloud微服务项目?有哪些最佳实践?

文章导读
使用 Docker Compose 部署 SpringCloud 微服务适合多服务协同场景,通过一个 YAML 文件统一管理容器编排、网络和服务依赖,能显著降低手动维护多个容器的复杂度。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

使用 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 地址。

公开资料中没有看到可靠的量化数据表明性能提升比例,但从运维效率角度看,统一编排确实减少了手动操作步骤和出错概率。

Docker Compose怎么部署SpringCloud微服务项目?有哪些最佳实践?

分步处理

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 docker

2. 编写各微服务的 Dockerfile

每个微服务模块需要独立的 Dockerfile,典型配置如下:

Docker Compose怎么部署SpringCloud微服务项目?有哪些最佳实践?
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,定义所有服务和依赖关系:

Docker Compose怎么部署SpringCloud微服务项目?有哪些最佳实践?
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/eureka

5. 构建并启动

# 在项目根目录执行
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 配置