若依前后端分离项目容器化

337次阅读
一条评论

若依前后端分离项目容器化

下载代码 复制以下命令到终端执行

git clone https://gitee.com/y_project/RuoYi-Vue.git

先手动本地部署

root@harbor250:~/images#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/jdk-17.0.8/bin:/usr/local/apache-maven-3.9.14/bin:/usr/local/node-v24.14.1-linux-x64/bin:/usr/local/jdk-17.0.8/bin:/usr/local/apache-tomcat-9.0.113//bin

先用 Docker 启动 MySQL + Redis

创建自定义网络

docker network create ruoyi-net

数据库默认配置文件my.cnf

root@harbor250:~/projects/RuoYi-Vue# mkdir mysql/conf -p
​
root@harbor250:~/projects/RuoYi-Vue#tree mysql/
mysql/
└── conf
    └── my.cnf
​
1 directory, 1 file
​
root@harbor250:~/projects/RuoYi-Vue#cat mysql/conf/my.cnf 
[mysqld]
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
user = mysql
secure-file-priv = /var/lib/mysql-files
​
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
​
# 时区
default-time-zone = '+8:00'
​
# 密码插件(若依必须)
default-authentication-plugin = mysql_native_password
​
# 性能
max_connections = 500
max_allowed_packet = 128M
​
# 安全(解决远程连接问题)
skip-name-resolve
skip-host-cache
​
[client]
socket = /var/run/mysqld/mysqld.sock
default-character-set = utf8mb4
​
!includedir /etc/mysql/conf.d/
root@harbor250:~/projects/RuoYi-Vue#ll
total 88
drwxr-xr-x 2 root root  4096 May 12 09:28 bin/
drwxr-xr-x 2 root root  4096 May 12 12:19 doc/
-rw-r--r-- 1 root root  1071 May 12 09:28 LICENSE
drwxr-xr-x 3 root root  4096 May 12 13:25 mysql/
-rw-r--r-- 1 root root  8512 May 12 09:28 pom.xml
-rw-r--r-- 1 root root 11805 May 12 09:28 README.md
drwxr-xr-x 3 root root  4096 May 12 11:30 ruoyi-admin/
drwxr-xr-x 3 root root  4096 May 12 11:30 ruoyi-common/
drwxr-xr-x 3 root root  4096 May 12 11:30 ruoyi-framework/
drwxr-xr-x 3 root root  4096 May 12 11:30 ruoyi-generator/
drwxr-xr-x 3 root root  4096 May 12 11:30 ruoyi-quartz/
drwxr-xr-x 3 root root  4096 May 12 11:30 ruoyi-system/
drwxr-xr-x 7 root root  4096 May 12 10:52 ruoyi-ui/
-rw-r--r-- 1 root root  1635 May 12 09:28 ry.bat
-rw-r--r-- 1 root root  1681 May 12 09:28 ry.sh
drwxr-xr-x 2 root root  4096 May 12 09:28 sql/
root@harbor250:~/projects/RuoYi-Vue#
​
root@harbor250:~/projects/RuoYi-Vue# head sql/ry_20260417.sql
set names utf8mb4; 
加入 字符集

启动 MySQL

docker run -d \
--name ruoyi-mysql \
--network ruoyi-net \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root123456 \
-e MYSQL_DATABASE=ry-vue \
-e MYSQL_USER: luzhiwei
-e MYSQL_PASSWORD: luzhiwei
-v /root/projects/RuoYi-Vue/mysql/data:/var/lib/mysql \
-v /root/projects/RuoYi-Vue/mysql/conf/my.cnf:/etc/my.cnf \
-v /root/projects/RuoYi-Vue/sql:/docker-entrypoint-initdb.d \
--restart always \
mysql:8.0.36-oracle
​
​
docker exec -it mysql-server mysql -uroot -p'root123456' 

启动 Redis

docker run -d \
--name ruoyi-redis \
--network ruoyi-net \
-p 6379:6379 \
--restart always \
redis:7.2.8-alpine3.21
​
​
查看redis的监听端口
docker ps -l
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS     NAMES
b7711cd69de5   redis:7.2.8-alpine3.21   "docker-entrypoint.s…"   4 seconds ago   Up 4 seconds             redis-server
​
ss -ntl | grep 6379
LISTEN 0      511          0.0.0.0:6379       0.0.0.0:*          
LISTEN 0      511             [::]:6379          [::]:*          

构建后端 jar

进入项目根目录

cd /root/projects/RuoYi-Vue

打包(Maven)

mvn clean package -DskipTests
得到 jar:
ruoyi-admin/target/ruoyi-admin.jar
启动若依服务
root@harbor250:~/projects/RuoYi-Vue# java -jar ruoyi-admin/target/ruoyi-admin.jar 

访问测试:

http://10.0.0.250:8080

运行前端

安装依赖并运行服务

cd RuoYi-Vue/ruoyi-ui/

root@harbor250:~/projects/RuoYi-Vue/ruoyi-ui# npm install --registry=https://registry.npmmirror.com root@harbor250:~/projects/RuoYi-Vue/ruoyi-ui# echo $? 0

root@harbor250:~/projects/RuoYi-Vue/ruoyi-ui# npm run dev

访问前端页面:10.0.0.250:81

====================================================================

前后端容器化

准备java配置文件

注意:尽量不修改原有的配置,这里copy一份java 配置文件,单独修改数据库连接地址,修改成容器的服务名称

root@harbor250:~/projects/RuoYi-Vue# mkdir docker
root@harbor250:~/projects/RuoYi-Vue/docker#tree .
.
├── application-druid.yml
├── application.yml
├── Dockerfile-backend
├── Dockerfile-frontend
├── entry.sh
└── nginx.conf
​
0 directories, 6 files
root@harbor250:~/projects/RuoYi-Vue/docker#cat application.yml 
...
# 开发环境配置
server:
  # 服务器的HTTP端口,默认为8080
  port: 8080
  servlet:
    # 应用的访问路径
    context-path: /
 ...
  data:
    # redis 配置
    redis:
      # 地址
      host: ruoyi-redis
      # 端口,默认为6379
      port: 6379
...
root@harbor250:~/projects/RuoYi-Vue/docker#cat application-druid.yml 
# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://ruoyi-mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: root123456

后端容器启动命令

root@harbor250:~/projects/RuoYi-Vue#cat  docker/entry.sh 
#!/bin/bash
​
# Jar 包名称
JAR="ruoyi-admin.jar"
​
# JVM 参数
AppName=$JAR
JVM_OPTS="-Dname=$AppName \
-Duser.timezone=Asia/Shanghai \
-Xms512m \
-Xmx1024m \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m \
-XX:+HeapDumpOnOutOfMemoryError"
​
# 启动命令+指定配置文件
java $JVM_OPTS -jar $JAR --spring.config.location=./

nginx配置文件

root@harbor250:~/projects/RuoYi-Vue/docker#cat nginx.conf 
user  nginx;
worker_processes  auto;
​
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
​
​
events {
    worker_connections  1024;
}
​
​
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
​
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
​
    access_log  /var/log/nginx/access.log  main;
​
    sendfile        on;
    #tcp_nopush     on;
​
    keepalive_timeout  65;
​
    #gzip  on;
​
    server {
        listen       81 default_server;
        server_name  ruoyi.luzhiwei.com;
        charset utf-8;
​
        location / {
            root   /usr/share/nginx/html;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }
​
        location /prod-api/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://ruoyi-backend:8080/;
        }
​
        # springdoc proxy
        location ~ ^/v3/api-docs/(.*) {
            proxy_pass http://ruoyi-backend:8080/v3/api-docs/$1;
        }
​
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
​
    include /etc/nginx/conf.d/*.conf;
}
​

本地hosts文件解析

...
10.0.0.250  harbor250.oldboyedu.com ruoyi.luzhiwei.com
...

编写后端Dockerfile-backend

记录手动操作流程:
1. 代码-->容器
2. maven:3.9-jdk-17镜像
3. 配置加速 传输settings.xml配置文件
4. 进行编译 mvn  clean package  
5. 思考编译后运行环境与编译环境需要隔离。 dockerfile多阶段构建  FROM/FROM ...
6. openjdk镜像17
7. 准备配置文件.yml
8. jar启动脚本
9.  运行jar包
root@harbor250:~/projects/RuoYi-Vue/docker#cat Dockerfile-backend 
# 构建阶段
FROM maven:3.9.14-eclipse-temurin-17-noble AS builder 
​
ENV  CODE=/app/code/ \
     JAR=ruoyi-admin.jar 
​
WORKDIR ${CODE}
COPY . . 
​
# 跳过测试 + 加速构建
RUN mvn clean package -DskipTests -B
​
# 运行阶段(使用更轻量的 jre 镜像)
FROM eclipse-temurin:17-jre-noble
LABEL author="luzhiwei" desc="ruoyi-backend jar"
​
ENV CODE=/app/code/ \
    JAR=ruoyi-admin.jar \
    TZ=Asia/Shanghai
​
WORKDIR ${CODE}
​
# 从构建阶段复制jar
COPY --from=builder ${CODE}/ruoyi-admin/target/${JAR} .
​
# 复制配置 + 启动脚本
COPY docker/application-druid.yml ./
COPY docker/application.yml ./
COPY docker/entry.sh /entry.sh
​
# 授权 + 安装必要工具
RUN chmod +x /entry.sh
​
# 启动
CMD ["/entry.sh"]
​

编写前端Dockerfile-frontend

root@harbor250:~/projects/RuoYi-Vue/docker#cat Dockerfile-frontend 
FROM node:22-alpine AS builder
ENV CODE=/app/code/
WORKDIR ${CODE}
​
COPY ruoyi-ui/ ./
​
RUN set -e ; \
    npm i --registry=https://registry.npmmirror.com ; \
    npm run build:prod
​
FROM nginx:1.27-alpine
LABEL author="luzhiwei" desc="ruoyi-frontend"
ENV TZ=Asia/Shanghai \
    CODE=/app/code/
​
COPY --from=builder ${CODE}/dist/ /usr/share/nginx/html/
COPY docker/nginx.conf /etc/nginx/nginx.conf
​
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
1. 构建后端镜像
root@harbor250:~/projects/RuoYi-Vue# docker build -t ruoyi-backend:v1.0 -f docker/Dockerfile-backend .
2. 构建前端镜像
root@harbor250:~/projects/RuoYi-Vue# docker build -t ruoyi-ui:v1.0 -f docker/Dockerfile-frontend .

临时测试:前提先启动数据库

root@harbor250:~/projects/RuoYi-Vue#cat docker-compose.yml 
version: '3.8'
​
services:
  # MySQL
  ruoyi-mysql:
    image: mysql:8.0.36-oracle
    container_name: mysql-server
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123456
      MYSQL_DATABASE: ry-vue
      MYSQL_USER: luzhiwei
      MYSQL_PASSWORD: luzhiwei
      TZ: Asia/Shanghai
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf/my.cnf:/etc/my.cnf
      - ./sql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    networks:
      - ruoyi-net
​
  # Redis
  ruoyi-redis:
    image: redis:7.2.8-alpine3.21
    container_name: redis-server
    restart: always
    environment:
      TZ: Asia/Shanghai
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    networks:
      - ruoyi-net
​
networks:
  ruoyi-net:
    driver: bridge

启动数据库服务
docker-compose up -d

2. 构建并启动后端
docker build -t ruoyi-backend:v1.0 -f docker/Dockerfile-backend .

docker run -d \
  --name ruoyi-backend \
  --restart always \
  --network ruoyi-net \
  -p 8080:8080 \
  ruoyi-backend:v1.0
  
3. 启动前端 Nginx
docker build -t ruoyi-ui:v1.0 -f docker/Dockerfile-frontend .

docker run -d \
  --name ruoyi-frontend \
  --restart always \
  --network ruoyi-net \
  -p 81:81 \
  ruoyi-ui:v1.0

http://ruoyi.luzhiwei.com:81

使用docker-compose编排

注意:使用docker-compose编排容器时, 容器之间相互访问使用docker-compose编排中的服务名

root@harbor250:~/projects/RuoYi-Vue#cat docker-compose.yml 
version: '3.8'
​
services:
  # MySQL
  ruoyi-mysql:
    image: mysql:8.0.36-oracle
    container_name: mysql-server
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123456
      MYSQL_DATABASE: ry-vue
      MYSQL_USER: luzhiwei
      MYSQL_PASSWORD: luzhiwei
      TZ: Asia/Shanghai
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf/my.cnf:/etc/my.cnf
      - ./sql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    networks:
      - ruoyi-net
​
  # Redis
  ruoyi-redis:
    image: redis:7.2.8-alpine3.21
    container_name: redis-server
    restart: always
    environment:
      TZ: Asia/Shanghai
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    networks:
      - ruoyi-net
​
  # 后端
  ruoyi-backend:
    build:
      context: .
      dockerfile: docker/Dockerfile-backend
    image: ruoyi-backend:v1.0
    container_name: ruoyi-server
    restart: always
    ports:
      - "8080:8080"
    depends_on:
      - ruoyi-mysql
      - ruoyi-redis
    networks:
      - ruoyi-net
​
  # 前端
  ruoyi-ui:
    build:
      context: .
      dockerfile: docker/Dockerfile-frontend
    image: ruoyi-ui:v1.0
    container_name: ruoyi-frontend
    restart: always
    ports:
      - "81:81"
    depends_on:
      - ruoyi-backend
    networks:
      - ruoyi-net
​
networks:
  ruoyi-net:
    driver: bridge
root@harbor250:~/projects/RuoYi-Vue#

一键启动

docker-compose up -d

注意:如果没有手动构建镜像可以执行以下命令

一键构建 + 启动(自动打版本)
docker-compose up -d --build

http://ruoyi.luzhiwei.com:81

加入健康检查

web后端服务只有等数据库完全就绪,才启动,避免web后端服务提前启动连接不上数据库,反复报错反复尝试重启

version: '3.8'
​
services:
  # MySQL 服务
  ruoyi-mysql:
    image: mysql:8.0.36-oracle
    container_name: mysql-server
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123456
      MYSQL_DATABASE: ry-vue
      MYSQL_USER: luzhiwei
      MYSQL_PASSWORD: luzhiwei
      TZ: Asia/Shanghai
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf/my.cnf:/etc/my.cnf
      - ./sql:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    networks:
      - ruoyi-net
    # MySQL 健康检查(自带工具)
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot123456"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 20s
​
  # Redis 服务
  ruoyi-redis:
    image: redis:7.2.8-alpine3.21
    container_name: redis-server
    restart: always
    environment:
      TZ: Asia/Shanghai
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    networks:
      - ruoyi-net
    # Redis 健康检查(自带工具)
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 10s
​
  # 后端服务
  ruoyi-backend:
    build:
      context: .
      dockerfile: docker/Dockerfile-backend
    image: ruoyi-backend:v1.0
    container_name: ruoyi-server
    restart: always
    ports:
      - "8080:8080"
    depends_on:
      ruoyi-mysql:
        condition: service_healthy
      ruoyi-redis:
        condition: service_healthy
    networks:
      - ruoyi-net
    # 后端健康检查:检查Java进程(系统自带工具)
    healthcheck:
      test: ["CMD", "pgrep", "java"]
      interval: 15s
      timeout: 3s
      retries: 10
      start_period: 60s
​
  # 前端服务
  ruoyi-ui:
    build:
      context: .
      dockerfile: docker/Dockerfile-frontend
    image: ruoyi-ui:v1.0
    container_name: ruoyi-frontend
    restart: always
    ports:
      - "81:81"
    depends_on:
      ruoyi-backend:
        condition: service_healthy
    networks:
      - ruoyi-net
    # 前端健康检查:nginx alpine 自带wget
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:81"]
      interval: 10s
      timeout: 5s
      retries: 3
​
# 自定义网络
networks:
  ruoyi-net:
    driver: bridge

=================================================================

纯docker run 部署

各容器之间通过容器名相互访问。前提是使用同一个自定义网络【内置DNS解析】

进入工作目录
cd /root/RuoYi-Vue

1. 创建 Docker 网络(容器互通必须)
docker network create ruoyi-net

2. 启动 MySQL

docker run -d \
  --name ruoyi-mysql \
  --restart always \
  --network ruoyi-net \
  -p 3306:3306 \
  -v $PWD/mysql/data:/var/lib/mysql \
  -v $PWD/mysql/conf/my.cnf:/etc/my.cnf \
  -v $PWD/sql:/docker-entrypoint-initdb.d \
  -e MYSQL_ROOT_PASSWORD=root123456 \
  -e MYSQL_DATABASE=ry-vue \
  -e MYSQL_USER=luzhiwei \
  -e MYSQL_PASSWORD=luzhiwei \
  -e TZ=Asia/Shanghai \
  mysql:8.0.36-oracle

3. 启动 Redis

docker run -d \
  --name ruoyi-redis \
  --restart always \
  --network ruoyi-net \
  -p 6379:6379 \
  -v $PWD/redis/data:/data \
  -e TZ=Asia/Shanghai \
  redis:7.2.8-alpine3.21

4. 构建并启动业务容器

# 启动后端容器
docker build -t ruoyi-backend:v1.0 -f docker/Dockerfile-backend .
docker run -d \
  --name ruoyi-backend \
  --restart always \
  --network ruoyi-net \
  -p 8080:8080 \
  ruoyi-backend:v1.0

# 启动前端容器
docker build -t ruoyi-ui:v1.0 -f docker/Dockerfile-frontend .
docker run -d \
--name ruoyi-frontend \
--restart always \
--network ruoyi-net \
-p 81:81 \
ruoyi-ui:v1.0

5、查看是否全部启动成功

docker ps
正文完
 0
评论(一条评论)
Avatar photo
2026-05-12 16:40:11 回复

还行

 Windows  Chrome  中国北京北京市电信