[toc]
各个服务的容器化部署
多个项目的容器化部署
当需要部署多个项目(每个项目包含前后端服务)到Docker中。
核心架构思路:
- 基础层统一化:所有项目共用一套反向代理、日志、监控组件,避免重复配置;
- 标准化目录结构:每个项目的目录结构保持一致,包括前端代码、后端代码、配置文件等,方便管理和维护;
- 容器化部署:每个项目的前端和后端服务分别打包成Docker镜像,后端服务还需要配置数据库连接等环境变量;
- 全局编排:
- 若是个人项目,可以使用Docker Compose对所有项目的容器进行全局编排,包括启动顺序、网络配置、负载均衡等。
- 若是企业项目,则根据项目的不同,单独配置不同的Docker Compose文件,以实现项目之间的隔离和独立部署。
标准化目录结构(核心:分层清晰,兼顾所有场景)
/opt/all-projects/ # 所有项目的根目录
├── base/ # 全局基础层(统一管理,一次配置终身受益)
│ ├── docker-compose.yml # 基础组件编排(Nginx、日志、监控)
│ ├── nginx/conf.d/ # Nginx配置目录(按项目区分配置)
│ └── logs/ # 全局日志目录(可选,集中存储所有项目日志)
|
├── proj1/ # 项目1:企业项目(标准模式)独立Compose + 独立目录
│ ├── docker-compose.yml # 标准模式:前后端分离+独立数据库
│ ├── frontend/ # 前端独立容器
│ ├── backend/ # 后端独立容器
│ └── volumes/ # 独立数据卷(数据库/配置)
|
├── proj2/ # 项目2:个人项目(轻量模式)
│ ├── docker-compose.yml # 轻量模式:前后端合一容器
│ ├── frontend/ # 前端静态页面代码或前端服务包
│ ├── backend/ # 后端服务代码或后端服务包
│ └── volumes/ # 可选,个人项目可以使用独立数据卷存储配置文件等
|
└── scripts/ # 全局脚本(一键启动/更新/备份,适配所有模式)
├── start-all.sh
├── update-project.sh
└── backup-db.sh分层思路
- 统一的Nginx容器:即可以实现所有项目的反向代理,也可以实现负载均衡和静态页面的部署。
- 对于个人项目:前端代码可以直接部署在Nginx容器中,后端服务可以部署在独立的容器中。
- 对于企业项目:企业项目通常会有多个微服务,每个微服务对应一个后端容器。前端服务可以部署在Nginx容器中,也可以部署在独立的Nginx容器中。
- 数据库:
- 个人项目的数据库可以部署在同一个数据库容器中。
- 企业项目的数据库,根据业务的需要可以部署在不同的数据库容器中,如MySQL、PostgreSQL等。
注意事项
- 对于个人项目:多个容器可以共享同一个网络,同一个数据库容器。
- 对于企业项目:前后端分离 + 独立数据库,使用独立网络,数据卷隔离,可直接扩展到多容器。
SpringCloudAlibaba搭配Docker实现微服务的容器化部署
一般情况下,当我们使用SpringCloudAlibaba开发微服务时,通常会将服务打包成jar包,然后在本地运行。
但是随着云原生技术的发展,我们通常会将微服务部署在容器化环境中,如Docker中,以实现服务的高可用和可扩展性。
因此在测试环境和生产环境中,我们通常会使用Docker容器化部署服务,以实现服务的高可用和可扩展性。
通常使用SpringCloudAlibaba开发微服务项目,代码是以Maven的父子聚合工程的方式进行组织的。
- 父工程:通常是一个空的Maven工程,用于管理子工程的依赖和插件。
- 子工程:通常是一个SpringBoot工程,用于实现具体的微服务功能。一个子工程对应一个微服务。
工程代码的目录结构如图所示。 
容器化部署步骤如下
① 先在父工程目录下执行mvn clean package命令,将所有子工程的代码打包成可执行jar包。
普通的jar包是没有包含项目依赖的,而可执行jar包是包含了项目依赖的,所以在构建Docker镜像时,需要使用可执行jar包。
② 在各个子工程目录下创建dockerfile文件,用于构建Docker镜像。
dockerfile文件的作用是将打包好的jar包上传到Docker镜像中。并定义容器启动时执行的命令。
shuyx-user子工程中的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文件的作用和说明。
- 创建各个基础服务容器,如Redis、MySQL等。
- 创建各个微服务容器,每个微服务对应一个容器。
- 容器与容器之间通信,IP用容器名称代替,端口用容器端口。
- 文件中的build参数,用于指定子工程中的dockerfile文件路径。搭配image参数,用于指定创建后的Docker镜像名称。
完整的docker-compose.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文件。
docker-compose up -d执行该命令,会读取docker-compose.yml文件,然后根据文件中的配置创建对应镜像文件,然后启动所有服务容器。
如图所示 
原本的交付方式是jar包,然后将该jar包上传到目标服务器上运行。现在的交付方式是Docker镜像,直接将Docker镜像上传到目标服务器中,然后在目标服务器上使用该镜像来创建容器。
