Skip to content
🗂️ 文章分类: 后端  微服务  
🏷️ 文章标签: SpringCloudAlibaba  Docker  
📝 文章创建时间: 2025-11-21
🔥 文章最后更新时间:2025-11-21

[toc]

微服务的容器化部署

SpringCloudAlibaba搭配Docker实现微服务的容器化部署

一般情况下,当我们使用SpringCloudAlibaba开发微服务时,通常会将服务打包成jar包,然后在本地运行。

但是随着云原生技术的发展,我们通常会将微服务部署在容器化环境中,如Docker中,以实现服务的高可用和可扩展性。

因此在测试环境和生产环境中,我们通常会使用Docker容器化部署服务,以实现服务的高可用和可扩展性。

通常使用SpringCloudAlibaba开发微服务项目,代码是以Maven的父子聚合工程的方式进行组织的。

  • 父工程:通常是一个空的Maven工程,用于管理子工程的依赖和插件。
  • 子工程:通常是一个SpringBoot工程,用于实现具体的微服务功能。一个子工程对应一个微服务。

工程代码的目录结构如图所示。 docker_2025-11-21_110717_528.png

容器化部署步骤如下

① 先在父工程目录下执行mvn clean package命令,将所有子工程的代码打包成可执行jar包。

普通的jar包是没有包含项目依赖的,而可执行jar包是包含了项目依赖的,所以在构建Docker镜像时,需要使用可执行jar包。

② 在各个子工程目录下创建dockerfile文件,用于构建Docker镜像。

dockerfile文件的作用是将打包好的jar包上传到Docker镜像中。并定义容器启动时执行的命令。

shuyx-user子工程中的dockerfile文件示例,其他子工程的dockerfile文件示例类似。

dockerfile
# 1 选择基础镜像(相当于选一个带Java环境的操作系统)
# 因为Spring Boot需要Java运行环境,所以选一个包含JRE的镜像
FROM openjdk:8-jre-slim

# 2 通过WORKDIR命令,在容器内创建一个工作目录app
WORKDIR /app

# 3 把本地打包好的jar包复制到容器的/app目录里
COPY target/shuyx-user-1.0-SNAPSHOT.jar /app/app.jar

# 4 暴露容器的端口(和工程配置一致)
EXPOSE 38010

# 5 定义容器启动时执行的命令(可添加JVM参数)(启动Spring Boot应用)
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

注意:不是所有的子工程都是微服务,有些子工程可能只是一个工具类库。这样的子工程通常是没有启动类的,也没有配置文件,所以不需要创建dockerfile文件。

③ 在父工程目录下创建docker-compose.yml文件。

父工程中的docker-compose.yml文件的作用和说明。

  1. 创建各个基础服务容器,如Redis、MySQL等。
  2. 创建各个微服务容器,每个微服务对应一个容器。
  3. 容器与容器之间通信,IP用容器名称代替,端口用容器端口。
  4. 文件中的build参数,用于指定子工程中的dockerfile文件路径。搭配image参数,用于指定创建后的Docker镜像名称。

完整的docker-compose.yml文件示例如下

yml
# services 配置。用于定义每个服务(即容器)的配置信息,包括服务名称、镜像、端口映射、环境变量等。
services:
  # Redis缓存数据库
  redis-service:
    # 指定容器名称(不推荐使用,容器扩容的时候不方便)如果不设置此参数,则由系统按照"项目名称-服务名称-序号"的格式自动生成
    # container_name: redis_container_1
    # 容器使用到的镜像
    image: redis:7.2.3-alpine
    # 设置容器环境变量
    environment:  
      - TZ=Asia/Shanghai            # 设置容器时区与宿主机保持一致
    # 设置容器重启策略(always:总是重启,on-failure:失败时重启,never:从不重启)
    restart: always
    # 设置容器特权模式,用于访问宿主机的设备和网络
    privileged: true
    # 设置容器数据卷映射(宿主机目录:容器目录)
    volumes:
      - /e/DockerVolumes/redis/data:/data
      - /e/DockerVolumes/redis/conf/redis.conf:/etc/redis/redis.conf
    # 设置容器运行后的启动命令
    command: redis-server /etc/redis/redis.conf
    # 设置容器端口映射(宿主机端口:容器端口)
    ports:
      - "36379:6379"
    # 设置容器使用的网络
    networks:
      - shuyx_network

  # MySQL数据库
  mysql-service:
    image: mysql:8.0.20
    # 容器启动命令,设置utf8字符集
    environment:
      - MYSQL_ROOT_PASSWORD=123456                              # 设置 root 用户密码
      - TZ=Asia/Shanghai                                        # 添加时区配置
    volumes:
        - /e/DockerVolumes/mysql/conf.d:/etc/mysql/conf.d
        - /e/DockerVolumes/mysql/data:/var/lib/mysql
        - /e/DockerVolumes/mysql/log:/var/log/mysql
    ports:
      - "33306:3306"
    restart: always
    networks:
      - shuyx_network

  # Nacos服务注册中心
  nacos-service:
    environment:
        - MODE=standalone
        - TZ=Asia/Shanghai                                        # 添加时区配置
    ports:
        - 38848:8848
        - 39848:9848
        - 39849:9849
    volumes:
        - /e/DockerVolumes/nacos/logs:/home/nacos/logs  # 日志持久化
        - /e/DockerVolumes/nacos/data:/home/nacos/data  # 数据持久化
    image: nacos/nacos-server:v2.1.1-slim
    restart: always
    networks:
        - shuyx_network

  # MinIO对象存储
  minio-service:
    ports:
        - 39000:9000
        - 39001:9001
    volumes:
        - /e/DockerVolumes/minio/data:/data
    environment:
        - MINIO_ROOT_USER=minio
        - MINIO_ROOT_PASSWORD=minio123
    image: minio/minio:RELEASE.2024-03-10T02-53-48Z
    command: server /data --console-address ":9001"
    networks:
        - shuyx_network

  # 用户服务
  shuyx-user-service:
    # build 用于指定对应的Dockerfile文件路径。
    build: ./shuyx-user
    # image 用于指定对应的Dockerfile文件产生的容器镜像名称和标签。
    image: shuyx-user-service:v2.0
    ports: ["38081:38081"]
    environment:
      - TZ=Asia/Shanghai              # 添加时区配置
      # 容器与容器之间通信使用的是容器内端口而非宿主机映射端口。注意此处的配置会覆盖服务中的配置文件中的同名配置。
      - SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR=nacos-service:8848
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql-service:3306/shuyx_db?useSSL=true&serverTimezone=GMT%2B8 # serverTimezone=GMT%2B8 东八区时间
      - SPRING_REDIS_HOST=redis-service
      - SPRING_REDIS_PORT=6379
    # 服务依赖关系,其他服务启动完成后才会启动
    depends_on: [nacos-service, mysql-service, redis-service, minio-service]
    networks:
        - shuyx_network

  # 媒体服务
  shuyx-media-service:
    build: ./shuyx-media
    image: shuyx-media-service:v2.0
    ports: [ "38070:38070" ]
    environment:
      - SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR=nacos-service:8848
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql-service:3306/shuyx_db?useSSL=true&serverTimezone=GMT%2B8 # serverTimezone=GMT%2B8 东八区时间
      - SPRING_REDIS_HOST=redis-service
      - SPRING_REDIS_PORT=6379
    depends_on: [ nacos-service, mysql-service, redis-service, minio-service ]
    networks:
      - shuyx_network

  # 网关服务
  shuyx-gateway-service:
    build: ./shuyx-gateway
    image: shuyx-gateway-service:v2.0
    ports: [ "38080:38080" ]
    environment:
      - SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR=nacos-service:8848
    depends_on: [ nacos-service, mysql-service, redis-service, minio-service ]
    networks:
      - shuyx_network

  # 文件服务
  shuyx-file-service:
    build: ./shuyx-file
    image: shuyx-file-service:v2.0
    ports: ["38090:38090"]
    environment:
      - SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR=nacos-service:8848
      - MINIO_URL=http://minio-service:9000
    depends_on: [nacos-service, mysql-service, redis-service, minio-service]
    networks:
        - shuyx_network


# networks配置,用于设置docker网络
networks:
  shuyx_network:    # 创建一个名为shuyx_network的网络

④ 启动docker-compose.yml文件

在父工程目录下执行以下命令启动docker-compose.yml文件。

bash
docker-compose up -d

执行该命令,会读取docker-compose.yml文件,然后根据文件中的配置创建对应镜像文件,然后启动所有服务容器。

如图所示 docker_2025-11-21_151912_971.png

原本的交付方式是jar包,然后将该jar包上传到目标服务器上运行。现在的交付方式是Docker镜像,直接将Docker镜像上传到目标服务器中,然后在目标服务器上使用该镜像来创建容器。

Released under the MIT License.