目录
3.2 编写部署文件——项目1(consult-system)
3.3 编写部署文件——项目2(person-system)
4.3 编写部署文件——项目1(consult-system)
4.4 编写部署文件——项目2(person-system)
一、简介
多项目共享环境部署,指的是在同一台服务器或同一个 Docker 主机上,通过 Docker Compose 等工具,将多个前后端项目的公共基础服务(如数据库、缓存、消息队列等)统一部署为共享服务,各项目通过自定义网络等方式共同使用这些服务,从而实现资源复用、简化运维、提升协作效率的一种部署方式。
这里有2个项目(即项目1和项目2),将项目部署在linux上,并且项目之间共用redis和mysql
二、文件目录结构
文件目录结构
文件解释
# 多项目的共同环境
shared-services.yml
# 后端docker编排
consult-compose.yml和person-compose.yml
# 后端jar包
consultingPlatform......jar和personnel.....jar
# 前端build文件
/consult-system/frontend/dist和/person-system/frontend/dist
# 前端docker编排
docker-compose.yml
# nginx配置
nginx.conf
三、前端部署流程(多nginx)
3.1 前端打包
前端利用node命令来打包项目,得到dist文件夹
# 前端通过构建命令,打包项目
npm run build
npm run build:prod # 生产环境
npm run build:dev # 开发环境
3.2 编写部署文件——项目1(consult-system)
dev-ops/consult-system/frontend/docker-compose.yml文件
# docker-compose -f docker-compose.yml up -d
version: "3"
services:
consult-nginx:
image: nginx:alpine
ports:
- 81:81 # 宿主机端口:容器端口
volumes:
- ./dist:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
privileged: true #这个必须,解次nginx的文件调用的权限问题
dev-ops/consult-system/frontend/nginx.conf文件
# 添加必要的上下文块
http {
# 包含默认的 MIME 类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
# 端口,需要与docker-compose一致
listen 81;
server_name localhost;
# 静态文件根目录
root /usr/share/nginx/html;
index index.html;
# 开启 gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 处理前端路由(如 Vue/React 的 history 模式)
location / {
try_files $uri $uri/ /index.html;
}
# 禁止访问 .env 等敏感文件
location ~ /\.(?!well-known).* {
deny all;
}
}
}
# 添加 events 块(可选但推荐)
events {
worker_connections 1024;
}
3.3 编写部署文件——项目2(person-system)
dev-ops/person-system/frontend/docker-compose.yml文件
# docker-compose -f docker-compose.yml up -d
version: "3"
services:
person-nginx:
image: nginx:alpine
ports:
- 82:82 # 宿主机端口:容器端口
volumes:
- ./dist:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
privileged: true #这个必须,解次nginx的文件调用的权限问题
dev-ops/person-system/frontend/nginx.conf文件
# 添加必要的上下文块
http {
# 包含默认的 MIME 类型
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
# 端口,需要与docker-compose一致
listen 82;
server_name localhost;
# 静态文件根目录
root /usr/share/nginx/html;
index index.html;
# 开启 gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 处理前端路由(如 Vue/React 的 history 模式)
location / {
try_files $uri $uri/ /index.html;
}
# 禁止访问 .env 等敏感文件
location ~ /\.(?!well-known).* {
deny all;
}
}
}
# 添加 events 块(可选但推荐)
events {
worker_connections 1024;
}
3.4 前端部署至linux服务器
step1:通过xftp将dev-ops整个文件夹上传至linux根目录
step2:对项目1(consult-system)部署
cd /dev-ops/consult-system/frontend
docker-compose -f docker-compose.yml up -d
# 查看是否启动
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
...
e6753c3329b0 nginx:alpine "/docker-entrypoint.…" 28 minutes ago Up 28 minutes 80/tcp, 0.0.0.0:81->81/tcp frontend-consult-nginx-1
...
step3:对项目2(person-system)部署
cd /dev-ops/person-system/frontend
docker-compose -f docker-compose.yml up -d
# 查看是否启动
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
...
e6753c3329b0 nginx:alpine "/docker-entrypoint.…" 28 minutes ago Up 28 minutes 80/tcp, 0.0.0.0:82->82/tcp frontend-person-nginx-1
...
3.5 访问方式
通过ip+端口的形式进行访问
项目1:http://xxx.xxx.xxx.xxx:81
项目2:http://xxx.xxx.xxx.xxx:82
四、后端部署流程(共用mysql和redis)
4.1 创建共享网络
dev-ops/shared-services.yml
# docker-compose -f shared-services.yml up -d
# -f:指定使用的 Docker Compose 配置文件(默认文件名是 docker-compose.yml)
# up:启动所有服务(包括构建镜像)
# -d:在后台运行容器
version: "3"
networks:
my-network:
driver: bridge
# 添加网络名称确保唯一性
name: shared-network
services:
# 共享的 MySQL(两个项目共用)
mysql:
image: mysql:5.7
# 添加容器名称确保可寻址
container_name: shared-mysql
ports:
- 13306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
networks:
- my-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 10
start_period: 15s
# 共享的 Redis(两个项目共用)
redis:
image: redis:6.2
container_name: shared-redis
restart: always
privileged: true
ports:
- 16379:6379
networks:
- my-network
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
通过xftp将dev-ops整个文件夹上传至linux根目录
构建共享网络
cd /dev-ops/
docker-compose -f shared-services.yml up -d
# 查看自定义网络,列表中有shared-network
docker network ls
# 查看网络信息,container下有mysql和redis
docker network inspect <网络名称/id>
4.2 后端打包
进入后端项目的pom.xml添加构建打包代码,然后在命令行执行 nvm clean package,将会在target文件夹下生成jar包,注意:记得修改主函数,也就是后端启动类
<build>
<!-- 1. 最终生成的JAR文件名 -->
<finalName>${project.artifactId}-${project.version}</finalName>
<!-- 2. 资源文件处理配置 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 启用资源过滤,替换占位符 -->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
<include>**/*.yaml</include>
</includes>
</resource>
<!-- 包含静态资源 -->
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>static/**</include>
<include>templates/**</include>
<include>public/**</include>
</includes>
</resource>
</resources>
<!-- 3. 测试资源处理 -->
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<!-- 4. 插件配置 -->
<plugins>
<!-- 编译器插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version> <!-- 更新到最新版本 -->
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<compilerArgs>
<arg>-parameters</arg> <!-- 保留方法参数名,方便MyBatis使用 -->
</compilerArgs>
</configuration>
</plugin>
<!-- 跳过测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<skipTests>true</skipTests> <!-- 构建时跳过测试 -->
</configuration>
</plugin>
<!-- Spring Boot打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>xxx.xxx.xxx.xxx</mainClass>
<skip>false</skip> <!-- 确保执行打包 -->
<executable>true</executable> <!-- 生成可执行JAR -->
<layers>
<enabled>true</enabled> <!-- 启用分层打包,优化Docker镜像构建 -->
</layers>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal> <!-- 重新打包包含所有依赖 -->
</goals>
</execution>
</executions>
</plugin>
<!-- 资源过滤插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<delimiters>
<delimiter>@</delimiter> <!-- 使用@作为占位符分隔符,避免与Spring冲突 -->
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>
</build>
4.3 编写部署文件——项目1(consult-system)
dev-ops/consult-system/consult-compose.yml文件
# docker-compose -f consult-compose.yml up -d
# -f:指定使用的 Docker Compose 配置文件(默认文件名是 docker-compose.yml)
# up:启动所有服务(包括构建镜像)
# -d:在后台运行容器
version: "3"
networks:
shared-network: # 使用共享网络与共享服务在同一网络下,是shared-services.yml中定义的网络
external: true
services:
consult-system-behind:
image: consult-system-behind:latest
build: . # 在同一级下寻找Dockerfile并构建,默认是寻找Dockerfile
ports: # 暴露端口
- 8877:8877
# 记得jdbc:mysql://{mysql容器名}:3306/person_system?
environment:
- TZ=PRC
- SERVER_PORT=8877
- APP_CONFIG_API_VERSION=v1
- APP_CONFIG_CROSS_ORIGIN=*
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=123456
- SPRING_DATASOURCE_URL=jdbc:mysql://shared-mysql:3306/consult_platform?serverTimezone=UTC&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
- SPRING_HIKARI_POOL_NAME=Retail_HikariCP
- REDIS_SDK_CONFIG_HOST=shared-redis
- REDIS_SDK_CONFIG_PORT=6379
# 使用共享网络
networks:
- shared-network
dev-ops/consult-system/Dockfile文件
FROM openjdk:8-jre-slim
# 作者
MAINTAINER yeqc
# 添加应用
ADD consultingPlatform-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
4.4 编写部署文件——项目2(person-system)
dev-ops/person-system/person-compose.yml文件
# docker-compose -f person-compose.yml up -d
# -f:指定使用的 Docker Compose 配置文件(默认文件名是 docker-compose.yml)
# up:启动所有服务(包括构建镜像)
# -d:在后台运行容器
version: "3"
networks:
shared-network: # 使用共享网络与共享服务在同一网络下,是shared-services.yml中定义的网络
external: true
services:
person-system-behind:
image: person-system-behind:latest
build: . # 在同一级下寻找Dockerfile并构建,默认是寻找Dockerfile
ports: # 暴露端口
- 8082:8082
# 记得jdbc:mysql://{mysql容器名}:3306/person_system?
environment:
- TZ=PRC
- SERVER_PORT=8082
- APP_CONFIG_API_VERSION=v1
- APP_CONFIG_CROSS_ORIGIN=*
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=123456
- SPRING_DATASOURCE_URL=jdbc:mysql://shared-mysql:3306/person_system?serverTimezone=UTC&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
- SPRING_HIKARI_POOL_NAME=Retail_HikariCP
- REDIS_SDK_CONFIG_HOST=shared-redis
- REDIS_SDK_CONFIG_PORT=6379
# 把服务加入共享网络
networks:
- shared-network
dev-ops/person-system/Dockerfile文件
FROM openjdk:8-jre-slim
# 作者
MAINTAINER yeqc
# 添加应用
ADD personnel-management-system-behind-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
4.5 后端部署至linux服务器
step1:通过xftp将dev-ops整个文件夹上传至linux根目录
step2:对项目1(consult-system)部署
cd /dev-ops/consult-system
docker-compose -f consult-compose.yml up -d
# 同理,利用docker ps查看是否存在consult-system-behind:latest
step3:对项目2(person-system)部署
cd /dev-ops/person-system
docker-compose -f consult-compose.yml up -d
# 同理,利用docker ps查看是否存在person-system-behind:latest
五、开放端口
需要在云服务器中开放对应的端口,根据自己设置的端口来开放,我这里的端口如下:
项目1:前端(81)后端(8877)
项目2:前端(82)后端(8082)
六、数据库加载
通过数据库可视化工具,输入自己的云服务器ip、账号、密码、端口(13306),进行登录,执行sql脚本,导入数据
注意:若登录不上,可能是没有开放13306端口,需要在云服务器中开放