关键在于服务互通与配置生效:需统一JDK8u382等版本,用alpine-jdk8轻量镜像构建服务,通过自定义Docker Compose网络(非默认bridge)实现eureka-server等服务名解析,并按依赖顺序启动验证。

直接用 Docker 容器部署 Spring Cloud 微服务,关键不是“能不能跑”,而是让注册中心、配置中心、业务服务之间能互相发现、配置生效、网络互通。下面按实战顺序讲清楚核心步骤,不绕弯子。
准备基础环境与统一版本
版本不匹配是 90% 部署失败的根源。别用最新版凑热闹,推荐这套生产验证过的组合:
- JDK:OpenJDK 8u382(alpine-jre8 基础镜像更轻,约 128MB)
- Spring Boot:2.7.15
- Spring Cloud:2021.0.8(对应 Hoxton.SR8 已停更,此版稳定无废弃 API)
- Docker:24.0.x 或 26.0.0(CentOS/Ubuntu 均适配)
- Docker Compose:2.20+(用于多服务一键启停)
安装后运行 docker version 和 docker-compose version 确认可用;国内用户务必配置镜像加速器(如腾讯云 https://mirror.ccs.tencentyun.com),避免拉取 openjdk 或 springio 镜像卡死。
构建可运行的微服务镜像
不建议直接用官方 openjdk:8-jdk 镜像(643MB 太重)。推荐两种轻量方式:
- 用自定义 Alpine + JDK8 镜像作为 baseImage,例如
hlwojiv/alpine-jdk8 - 或改用 Jib 插件(无需写 Dockerfile),在 pom.xml 中加:
<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>3.4.0</version> <configuration> <from><image>hlwojiv/alpine-jdk8</image></from> <to><image>your-registry.com/microservice-eureka:1.0</image></to> </configuration> </plugin>
执行 mvn compile jib:dockerBuild 即可在本地生成镜像,无需 Docker daemon 远程配置。
用 Docker Compose 编排多服务启动
Spring Cloud 各组件有强依赖顺序(Eureka 必须先于 Config Server,Config Server 又需先于业务服务)。一个典型 docker-compose.yml 示例:
version: '3.8'
services:
eureka-server:
image: your-registry.com/microservice-discovery-eureka:1.0
ports: ["8761:8761"]
networks: [springcloud-net]
<p>config-server:
image: your-registry.com/microservice-config-server:1.0
ports: ["8888:8888"]
environment:</p><ul><li>SPRING_CLOUD_CONFIG_SERVER_GIT_URI=<a href="https://www.php.cn/link/055b74a879ba0a14f822fd97e071e899">https://www.php.cn/link/055b74a879ba0a14f822fd97e071e899</a>
depends_on: [eureka-server]
networks: [springcloud-net]</li></ul><p>movie-consumer:
image: your-registry.com/microservice-consumer-movie:1.0
ports: ["8010:8010"]
environment:</p><ul><li>SPRING_PROFILES_ACTIVE=dev</li><li>EUREKA_CLIENT_SERVICEURL_DEFAULTZONE=<a href="https://www.php.cn/link/2188a2fe8f909b85070d055dfe363142">https://www.php.cn/link/2188a2fe8f909b85070d055dfe363142</a>
depends_on: [eureka-server, config-server]
networks: [springcloud-net]</li></ul><p>networks:
springcloud-net:
driver: bridge注意:不要用默认 bridge 网络,必须显式定义自定义网络(如 springcloud-net),否则容器间通过服务名无法解析;所有服务配置里写的是容器名(eureka-server),不是 localhost 或 127.0.0.1。
验证与常见问题处理
启动后执行 docker-compose up -d,再检查:
- 访问
http://localhost:8761看 Eureka 控制台,确认所有服务已注册(状态 UP) - 进 config-server 容器执行
curl http://config-server:8888/movie-dev.yml,验证配置可拉取 - 调用 consumer 接口,如
curl http://localhost:8010/movie/1,观察是否返回数据且无连接超时
高频报错及解法:
-
“Cannot connect to eureka-server”:检查 consumer 的
eureka.client.serviceUrl.defaultZone是否写成https://www.php.cn/link/2188a2fe8f909b85070d055dfe363142(不是 localhost) -
配置没刷新:确保 config-server 的 bootstrap.yml 中
spring.cloud.config.discovery.enabled=true,且 consumer 引入了spring-cloud-starter-bootstrap -
时区/编码异常:在 Dockerfile 中加
ENV TZ=Asia/Shanghai LANG=C.UTF-8


















