惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
量子位
博客园_首页
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Forbes - Security
Forbes - Security
IT之家
IT之家
N
News and Events Feed by Topic
S
Security Affairs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Webroot Blog
Webroot Blog
Recorded Future
Recorded Future
L
LangChain Blog
Y
Y Combinator Blog
AI
AI
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Know Your Adversary
Know Your Adversary
AWS News Blog
AWS News Blog
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google Online Security Blog
Google Online Security Blog
V2EX - 技术
V2EX - 技术
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
PCI Perspectives
PCI Perspectives
I
Intezer
T
Tenable Blog
G
Google Developers Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
云风的 BLOG
云风的 BLOG
C
CXSECURITY Database RSS Feed - CXSecurity.com
有赞技术团队
有赞技术团队
O
OpenAI News
P
Proofpoint News Feed
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Last Week in AI
Last Week in AI
S
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
Blog — PlanetScale
Blog — PlanetScale

博客园 - 尹正杰

aiops平台环境部署 TKE集群LoadBalancer映射案例 k8s集群为每个节点分配不通的ippool实战 ansible剧本实现一键升级K8S集群的NVIDIA GPU驱动 vmagent采集etcd数据并写入victoriametrics集群 VictoriaMetrics集群部署实战 Squid正向代理实战 kubespray生产故障案例之kubelet启动参数案例 filebeat指定名称空间采集pod数据 Calico自定义Ipool实战 ansible剧本实现kibana的部署和卸载 ansible剧本应用案例集合2 ansible剧本实现磁盘格式化 Ansible急速入门实战篇 ansible快速入门篇 k8s集群管理 kubesray实战 kubespray实战案例 kubespray管理k8s的worker集群扩缩容 kubespray快速部署k8s集群实战 Kubeasz使用吐槽博客专题 Kubeasz基于ezctl实现etcd集群的管理实战 Kubeasz基于ezctl实现k8s集群一键升级 Calico启用纯BGP模式+RR实战案例 Calico 底层原理及IPIP(依赖BGP协议))和vxlan(不依赖BGP)工作模式切换 kubeasz基于ezctl实现k8s集群的扩容和缩容 kubeasz快速部署K8S集群实战 Ubuntu 24.04.04 LTS版本系统优化 Ubuntu Server 24.04.04 LTS部署指南 windows极速部署Openclaw实战篇 K8S的StatefulSet控制器应用案例之MySQL主从同步实战 k8s底层基于不同运行时集成harbor企业级私有仓库实战 二进制K8S集群附加组件部署及CNI网络插件切换实战 二进制部署K8S 1.35.0+最新版实战案例 etcd高可用集群部署及K8S周期性备份数据实战 k8s集群基于Flannel网络插件部署凡人修仙传 k8s集群基于Calico网络插件部署凡人修仙传 ElasticSEearch 9.X环境部署 K8S Vertical Pod Autoscaler(VPA)实战案例 Prometheus监控自定义程序指标
基于Docker实现《若依》服务业务容器化实战篇
尹正杰 · 2025-11-26 · via 博客园 - 尹正杰

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.手动部署若依前后端分离版本

1.若依项目介绍

若依可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。

若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。

RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告、代码生成等。在线定时任务配置,支持集群,支持多数据源,支持分布式事务等。

参考链接:
	https://doc.ruoyi.vip/ruoyi-vue/

2.安装MySQL并初始化表结构

	1.克隆代码
[root@elk91 projects]# git clone https://gitee.com/y_project/RuoYi-Vue.git
Cloning into 'RuoYi-Vue'...
remote: Enumerating objects: 21151, done.
remote: Counting objects: 100% (743/743), done.
remote: Compressing objects: 100% (615/615), done.
remote: Total 21151 (delta 318), reused 51 (delta 15), pack-reused 20408 (from 1)
Receiving objects: 100% (21151/21151), 4.60 MiB | 3.55 MiB/s, done.
Resolving deltas: 100% (10763/10763), done.
[root@elk91 projects]# 


	2.部署MySQL
[root@elk91 ~]# docker container run \
  -e MYSQL_ALLOW_EMPTY_PASSWORD="yes" \
  -d \
  --name mysql-server \
  -e MYSQL_DATABASE="ry-vue" \
  -e MYSQL_USER="linux102" \
  -e MYSQL_PASSWORD="oldboyedu" \
  --network host \
  mysql:8.0.36-oracle \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci \
  --default-authentication-plugin=mysql_native_password
	
[root@elk91 projects]# docker ps -l
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS     NAMES
a81583c640b2   mysql:8.0.36-oracle   "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds             mysql-server
[root@elk91 projects]#
[root@elk91 projects]# ss -ntl | grep 3306
LISTEN 0      70                 *:33060            *:*          
LISTEN 0      151                *:3306             *:*          
[root@elk91 projects]# 
	
	3.导入SQL语句
[root@elk91 projects]# find RuoYi-Vue/ -name *.sql
RuoYi-Vue/sql/quartz.sql
RuoYi-Vue/sql/ry_20260320.sql
[root@elk91 projects]# 
[root@elk91 projects]# ll RuoYi-Vue/sql/
total 80
drwxr-xr-x  2 root root  4096 Mar 26 09:07 ./
drwxr-xr-x 14 root root  4096 Mar 26 09:07 ../
-rw-r--r--  1 root root 11985 Mar 26 09:07 quartz.sql
-rw-r--r--  1 root root 61374 Mar 26 09:07 ry_20260320.sql
[root@elk91 projects]# 
[root@elk91 projects]# docker cp RuoYi-Vue/sql mysql-server:/
[root@elk91 projects]# 
[root@elk91 projects]# docker exec -it mysql-server bash
bash-4.4# 
bash-4.4# cat > /etc/my.cnf <<EOF
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
character_set_client=utf8mb4
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci

[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
default-character-set=utf8mb4
EOF

bash-4.4# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)

mysql> 
bash-4.4# 
bash-4.4# ls /sql/
quartz.sql  ry_20260320.sql
bash-4.4# 
bash-4.4# mysql ry-vue < /sql/quartz.sql 
bash-4.4# 
bash-4.4# mysql ry-vue < /sql/ry_20260320.sql 
bash-4.4# 
bash-4.4# mysql ry-vue
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW TABLES;
+--------------------------+
| Tables_in_ry-vue         |
+--------------------------+
| QRTZ_BLOB_TRIGGERS       |
| QRTZ_CALENDARS           |
| QRTZ_CRON_TRIGGERS       |
| QRTZ_FIRED_TRIGGERS      |
| QRTZ_JOB_DETAILS         |
| QRTZ_LOCKS               |
| QRTZ_PAUSED_TRIGGER_GRPS |
| QRTZ_SCHEDULER_STATE     |
| QRTZ_SIMPLE_TRIGGERS     |
| QRTZ_SIMPROP_TRIGGERS    |
| QRTZ_TRIGGERS            |
| gen_table                |
| gen_table_column         |
| sys_config               |
| sys_dept                 |
| sys_dict_data            |
| sys_dict_type            |
| sys_job                  |
| sys_job_log              |
| sys_logininfor           |
| sys_menu                 |
| sys_notice               |
| sys_notice_read          |
| sys_oper_log             |
| sys_post                 |
| sys_role                 |
| sys_role_dept            |
| sys_role_menu            |
| sys_user                 |
| sys_user_post            |
| sys_user_role            |
+--------------------------+
31 rows in set (0.00 sec)

mysql> 

3.maven打包若依

	1.修改配置文件指定数据库信息
[root@elk91 projects]# vim RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml 
...
# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: 数据库地址
                username: 数据库账号
                password: 数据库密码
                
                
                
 	2.部署maven
wget https://dlcdn.apache.org/maven/maven-3/3.9.14/binaries/apache-maven-3.9.14-bin.tar.gz

SVIP:
[root@elk91 projects]# wget http://192.168.14.253/Resources/Docker/Projects/RuoYi/apache-maven-3.9.14-bin.tar.gz


[root@elk91 projects]# tar xf apache-maven-3.9.14-bin.tar.gz  -C /usr/local/
[root@elk91 projects]# 
[root@elk91 projects]# cat /etc/profile.d/maven.sh
#!/bin/bash


export MAVEN_HOME=/usr/local/apache-maven-3.9.14
export PATH=$PATH:$MAVEN_HOME/bin
[root@elk91 projects]# 
[root@elk91 projects]# source /etc/profile.d/maven.sh
[root@elk91 projects]# 
[root@elk91 projects]# mvn -v
Apache Maven 3.9.14 (996c630dbc656c76214ce58821dcc58be960875b)
Maven home: /usr/local/apache-maven-3.9.14
Java version: 22.0.2, vendor: Oracle Corporation, runtime: /usr/share/elasticsearch/jdk
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.15.0-173-generic", arch: "amd64", family: "unix"
[root@elk91 projects]# 


	3.打包编译
[root@elk91 projects]# cd RuoYi-Vue/
[root@elk91 RuoYi-Vue]# 
[root@elk91 RuoYi-Vue]# mvn clean package -Dmaven.test.skip=true
...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for ruoyi 3.9.2:
[INFO] 
[INFO] ruoyi .............................................. SUCCESS [  0.621 s]
[INFO] ruoyi-common ....................................... SUCCESS [ 22.057 s]
[INFO] ruoyi-system ....................................... SUCCESS [  0.585 s]
[INFO] ruoyi-framework .................................... SUCCESS [  4.145 s]
[INFO] ruoyi-quartz ....................................... SUCCESS [  0.625 s]
[INFO] ruoyi-generator .................................... SUCCESS [  0.504 s]
[INFO] ruoyi-admin ........................................ SUCCESS [  3.855 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  35.056 s
[INFO] Finished at: 2026-03-26T09:29:57+08:00
[INFO] ------------------------------------------------------------------------
[root@elk91 RuoYi-Vue]# 
[root@elk91 RuoYi-Vue]# ll ruoyi-admin/target/
total 87656
drwxr-xr-x 6 root root     4096 Mar 26 09:29 ./
drwxr-xr-x 4 root root     4096 Mar 26 09:29 ../
drwxr-xr-x 6 root root     4096 Mar 26 09:29 classes/
drwxr-xr-x 3 root root     4096 Mar 26 09:29 generated-sources/
drwxr-xr-x 2 root root     4096 Mar 26 09:29 maven-archiver/
drwxr-xr-x 3 root root     4096 Mar 26 09:29 maven-status/
-rw-r--r-- 1 root root 89657665 Mar 26 09:29 ruoyi-admin.jar
-rw-r--r-- 1 root root    65748 Mar 26 09:29 ruoyi-admin.jar.original
[root@elk91 RuoYi-Vue]# 

4.部署Redis服务

	1.部署redis
[root@elk91 projects]# docker container run -d \
	--name redis-server \
	--network host \
	redis:7.2.8-alpine3.21
	
	
	2.查看redis的监听端口
[root@elk91 projects]# 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
[root@elk91 projects]# 
[root@elk91 projects]# ss -ntl | grep 6379
LISTEN 0      511          0.0.0.0:6379       0.0.0.0:*          
LISTEN 0      511             [::]:6379          [::]:*          
[root@elk91 projects]# 

5.运行若依后台服务

	1.配置JDK环境
[root@elk91 RuoYi-Vue]# cat /etc/profile.d/tomcat.sh 
#!/bin/bash

#export JAVA_HOME=/usr/share/elasticsearch/jdk
#export TOMCAT_HOME=/usr/local/apache-tomcat-11.0.13
#export PATH=$PATH:$JAVA_HOME/bin:$TOMCAT_HOME/bin
[root@elk91 RuoYi-Vue]# 
[root@elk91 RuoYi-Vue]# java --version
openjdk 22.0.2 2024-07-16
OpenJDK Runtime Environment (build 22.0.2+9-70)
OpenJDK 64-Bit Server VM (build 22.0.2+9-70, mixed mode, sharing)
[root@elk91 RuoYi-Vue]# 
[root@elk91 RuoYi-Vue]# 


	2.启动若依服务
[root@elk91 RuoYi-Vue]# java -jar ruoyi-admin/target/ruoyi-admin.jar 
...
(♥◠‿◠)ノ゙  若依启动成功   ლ(´ڡ`ლ)゙  
 .-------.       ____     __        
 |  _ _   \      \   \   /  /    
 | ( ' )  |       \  _. /  '       
 |(_ o _) /        _( )_ .'         
 | (_,_).' __  ___(_ o _)'          
 |  |\ \  |  ||   |(_,_)'         
 |  | \ `'   /|   `-'  /           
 |  |  \    /  \      /           
 ''-'   `'-'    `-..-'              

	

6.部署前台服务

img

	1.下载nodejs
wget https://nodejs.org/dist/v24.14.1/node-v24.14.1-linux-x64.tar.xz

SVIP:
[root@elk91 projects]# wget http://192.168.14.253/Resources/Docker/Projects/RuoYi/node-v24.14.1-linux-x64.tar.xz



	2.安装nodejs
[root@elk91 projects]# tar xf node-v24.14.1-linux-x64.tar.xz  -C /usr/local/
[root@elk91 projects]# cat /etc/profile.d/nodejs.sh
#!/bin/bash

export NODEJS_HOME=/usr/local/node-v24.14.1-linux-x64
export PATH=$PATH:$NODEJS_HOME/bin
[root@elk91 projects]# 
[root@elk91 projects]# source /etc/profile.d/nodejs.sh
[root@elk91 projects]# 
[root@elk91 projects]# node -v
v24.14.1
[root@elk91 projects]# 
[root@elk91 projects]# npm -v
11.11.0
[root@elk91 projects]# 


	3.安装依赖并运行服务
[root@elk91 projects]# cd RuoYi-Vue/ruoyi-ui/
[root@elk91 ruoyi-ui]# 
[root@elk91 ruoyi-ui]# npm install --registry=https://registry.npmmirror.com
[root@elk91 ruoyi-ui]# 
[root@elk91 ruoyi-ui]# echo $?
0
[root@elk91 ruoyi-ui]# 


	4.运行项目
[root@elk91 ruoyi-ui]# npm run dev
...
 DONE  Compiled successfully in 20479ms                                                                                      9:45:29 AM


  App running at:
  - Local:   http://localhost:80/ 
  - Network: http://10.0.0.91:80/

  Note that the development build is not optimized.
  To create a production build, run npm run build.


	5.访问webUI(如上图所示)
http://10.0.0.91:80/

二.若依项目容器化

1.后端容器化

	1.修改MySQL的配置文件
[root@elk91 RuoYi-Vue]# vim ruoyi-admin/src/main/resources/application-druid.yml 
...
# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://mysql-server:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: admin
                password: yinzhengjie



	2.修改redis的配置文件
[root@elk91 RuoYi-Vue]# vim  ruoyi-admin/src/main/resources/application.yml 
...
# Spring配置
spring:
  ...
  data:
    # redis 配置
    redis:
      # 地址
      host: redis-server
      # 端口,默认为6379
      port: 6379
      # 数据库索引
      database: 0
  
  
  	3.清理环境
[root@elk91 RuoYi-Vue]# mvn clean

	4.打包生成jar包文件
[root@elk91 RuoYi-Vue]# mvn clean package -Dmaven.test.skip=true
[root@elk91 RuoYi-Vue]# ll ruoyi-admin/target/
total 87652
drwxr-xr-x 6 root root     4096 Mar 26 11:54 ./
drwxr-xr-x 4 root root     4096 Mar 26 11:54 ../
drwxr-xr-x 6 root root     4096 Mar 26 11:54 classes/
drwxr-xr-x 3 root root     4096 Mar 26 11:54 generated-sources/
drwxr-xr-x 2 root root     4096 Mar 26 11:54 maven-archiver/
drwxr-xr-x 3 root root     4096 Mar 26 11:54 maven-status/
-rw-r--r-- 1 root root 89657672 Mar 26 11:54 ruoyi-admin.jar
-rw-r--r-- 1 root root    65755 Mar 26 11:54 ruoyi-admin.jar.original
[root@elk91 RuoYi-Vue]# 


	5.编写Dockerfile
[root@elk91 RuoYi-Vue]# cp -r /usr/share/elasticsearch/jdk/  .
[root@elk91 RuoYi-Vue]# 
[root@elk91 RuoYi-Vue]# cat  Dockerfile 
FROM registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/tomcat:9.0.87-jdk17

MAINTAINER JasonYin

LABEL auther=yinzhengjie \
	blog=https://www.cnblogs.com/yinzhengjie

COPY ruoyi-admin/target/ruoyi-admin.jar /

EXPOSE 8080

CMD ["java" ,"-jar", "/ruoyi-admin.jar" ]
[root@elk91 RuoYi-Vue]# 
[root@elk91 RuoYi-Vue]# docker build -t ruoyi-backend:v0.1 .


	6.启动服务
[root@elk91 RuoYi-Vue]# grep server /etc/hosts
127.0.0.1 localhost  mysql-server  redis-server
[root@elk91 RuoYi-Vue]# 
[root@elk91 RuoYi-Vue]# docker run -d --name ruoyi-server  --network host ruoyi-backend:v0.1 
[root@elk91 RuoYi-Vue]# 
[root@elk91 RuoYi-Vue]# docker ps -l
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS          PORTS     NAMES
02b9811bf520   ruoyi-backend:v0.1   "/jdk/bin/java -jar …"   About a minute ago   Up 15 seconds             ruoyi-server
[root@elk91 RuoYi-Vue]# 

	7.查看日志(如上图所示)
[root@elk91 RuoYi-Vue]# docker logs ruoyi-server 
...
 .-------.       ____     __        
 |  _ _   \      \   \   /  /    
 | ( ' )  |       \  _. /  '       
 |(_ o _) /        _( )_ .'         
 | (_,_).' __  ___(_ o _)'          
 |  |\ \  |  ||   |(_,_)'         
 |  | \ `'   /|   `-'  /           
 |  |  \    /  \      /           
 ''-'   `'-'    `-..-'              
[root@elk91 RuoYi-Vue]# 
[root@elk91 RuoYi-Vue]# ss -ntl | grep 8080
LISTEN 0      1000               *:8080             *:*          
[root@elk91 RuoYi-Vue]# 

2.前端容器化

	1.打包前端代码
[root@elk91 ruoyi-ui]# npm run build:prod
[root@elk91 ruoyi-ui]# ll dist/
total 56
drwxr-xr-x 5 root root  4096 Mar 26 16:14 ./
drwxr-xr-x 8 root root  4096 Mar 26 16:14 ../
-rw-r--r-- 1 root root  5663 Mar 26 16:14 favicon.ico
drwxr-xr-x 2 root root  4096 Mar 26 16:14 html/
-rw-r--r-- 1 root root 12759 Mar 26 16:14 index.html
-rw-r--r-- 1 root root  4206 Mar 26 16:14 index.html.gz
-rw-r--r-- 1 root root    26 Mar 26 16:14 robots.txt
drwxr-xr-x 6 root root  4096 Mar 26 16:14 static/
drwxr-xr-x 3 root root  4096 Mar 26 16:14 styles/
[root@elk91 ruoyi-ui]# 

	2.编写nginx的配置文件
[root@elk91 ruoyi-ui]# cat nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
		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://localhost:8080/;
			proxy_pass http://ruoyi-server:8080/;			
		}

		# springdoc proxy
		location ~ ^/v3/api-docs/(.*) {
			# proxy_pass http://localhost:8080/v3/api-docs/$1;
			proxy_pass http://ruoyi-server:8080/v3/api-docs/$1;
		}

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@elk91 ruoyi-ui]# 


	3.编写Dockerfile
[root@elk91 ruoyi-ui]# cat Dockerfile 
FROM registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1


MAINTAINER JasonYin

LABEL auther=yinzhengjie \
	blog=https://www.cnblogs.com/yinzhengjie

EXPOSE 80

RUN rm -rf /usr/share/nginx/html/*

WORKDIR /usr/share/nginx/html/

COPY dist/ /usr/share/nginx/html

COPY nginx.conf /etc/nginx/nginx.conf
[root@elk91 ruoyi-ui]# 




	3.编译
[root@elk91 ruoyi-ui]# docker build -t ruoyi-frontend:v0.1  .

	4.启动容器
[root@elk91 ruoyi-ui]# docker run -d --name ruoyi-ui --network host ruoyi-frontend:v0.1 
e7fc33ed5b819b577e64d59404c218ae7c1cfea2d6eb9b83a12814b8393d886c
[root@elk91 ruoyi-ui]# 
[root@elk91 ruoyi-ui]# docker ps -l
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS        PORTS     NAMES
e7fc33ed5b81   ruoyi-frontend:v0.1   "docker-entrypoint.s…"   2 seconds ago   Up 1 second             ruoyi-ui
[root@elk91 ruoyi-ui]# 
[root@elk91 ruoyi-ui]# ss -ntl | grep 80
LISTEN 0      511          0.0.0.0:80         0.0.0.0:*          
LISTEN 0      1000               *:8080             *:*          
[root@elk91 ruoyi-ui]# 
[root@elk91 ruoyi-ui]# docker exec -it ruoyi-ui ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 nginx: master process nginx -g daemon off;
   31 nginx     0:00 nginx: worker process
   32 root      0:00 ps -ef
[root@elk91 ruoyi-ui]# 


	5.访问webUI
http://10.0.0.91/

3.docker-compose一键启动若依服务

	1.准备MySQL的配置文件
[root@elk91 projects]# cat my.cnf 
[mysqld]
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci

[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
default-character-set=utf8mb4
[root@elk91 projects]# 

	2.编写docker-compose文件
[root@elk91 projects]# cat docker-compose.yaml 
services:
  mysql-server:
    image: mysql:8.0.36-oracle
    container_name: mysql-server
    healthcheck:
      test: ["CMD", "mysqladmin", "ping"]
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 30s
      start_interval: 3s
    ports:
      - "3306:3306"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      MYSQL_DATABASE: "ry-vue"
      MYSQL_USER: "linux102"
      MYSQL_PASSWORD: "oldboyedu"
    command: ["--character-set-server=utf8", "--collation-server=utf8_bin", "--default-authentication-plugin=mysql_native_password"]
    networks:    
    - ruoyi
    volumes:
    - /oldboyedu/projects/RuoYi-Vue/sql/:/docker-entrypoint-initdb.d
    - /oldboyedu/projects/my.cnf:/etc/my.cnf:ro

  redis-server:
    image: redis:7.2.8-alpine3.21
    container_name: redis-server
    healthcheck:
      test: ["CMD", "redis-benchmark", "-h","127.0.0.1","-p", "6379","-n", "1", "-c","2"]
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 30s
      start_interval: 3s
    ports:
    - "6379:6379"
    networks:    
    - ruoyi


  ruoyi-server:
    image: ruoyi-backend:v0.1
    container_name: ruoyi-server
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 5s
      start_interval: 1s
    depends_on:
      mysql-server:
        condition: service_healthy
      redis-server:
        condition: service_healthy
    ports:
    - "8080:8080"
    networks:    
    - ruoyi


  ruoyi-ui:
    image: ruoyi-frontend:v0.1
    depends_on:
      - ruoyi-server
    container_name: ruoyi-ui
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 5s
      start_interval: 1s
    ports:
    - "80:80"
    networks:    
    - ruoyi

networks:
  ruoyi:
    name: mysql-net
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
          ip_range: 172.28.100.0/24
          gateway: 172.28.100.254
[root@elk91 projects]# 

三.部署过程中可能遇到的错误

1.The JAVA_HOME environment ....

QQ_1767497414250

	报错信息:
[root@master231 ~]# mvn --version
The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.
[root@master231 ~]# 

	
	错误分析:
缺少JAVA_HOME环境变量。


	解决方案:
安装JDK环境。

2.03:57:38.164 [Druid-ConnectionPool-Create-2005706991] ERROR c.a.d.p.DruidDataSource - [run,2795] - create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8, errorCode 0, state 08S01

QQ_1767499115774

	报错信息:
03:57:38.164 [Druid-ConnectionPool-Create-2005706991] ERROR c.a.d.p.DruidDataSource - [run,2795] - create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8, errorCode 0, state 08S01
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
	at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:175)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
	at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:446)
	at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:239)
	at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:188)
	at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:132)
	at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:244)
	at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:126)
	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1695)
	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1811)
	at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2793)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
	at jdk.internal.reflect.GeneratedConstructorAccessor41.newInstance(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150)
	at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166)
	at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89)
	at com.mysql.cj.NativeSession.connect(NativeSession.java:121)
	at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:945)
	at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:815)
	... 9 common frames omitted
Caused by: java.net.ConnectException: Connection refused
	at java.base/sun.nio.ch.Net.pollConnect(Native Method)
	at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672)
	at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542)
	at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597)
	at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
	at java.base/java.net.Socket.connect(Socket.java:633)
	at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153)
	at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63)
	... 12 common frames omitted


	错误分析
链接数据库失败。


	解决方案:
先启动数据库。

3.Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'ry.sys_config' doesn't exist

	错误信息:
04:10:16.347 [main] ERROR o.s.b.SpringApplication - [reportFailure,870] - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroFilterFactoryBean' defined in class path resource [com/ruoyi/framework/config/ShiroConfig.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authorizationAttributeSourceAdvisor' defined in class path resource [com/ruoyi/framework/config/ShiroConfig.class]: Unsatisfied dependency expressed through method 'authorizationAttributeSourceAdvisor' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityManager' defined in class path resource [com/ruoyi/framework/config/ShiroConfig.class]: Unsatisfied dependency expressed through method 'securityManager' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userRealm': Unsatisfied dependency expressed through field 'loginService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysLoginService': Unsatisfied dependency expressed through field 'userService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sysUserServiceImpl': Unsatisfied dependency expressed through field 'configService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sysConfigServiceImpl': Invocation of init method failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: Table 'ry.sys_config' doesn't exist
### The error may exist in URL [jar:file:/root/RuoYi/ruoyi-admin/target/ruoyi-admin.jar!/BOOT-INF/lib/ruoyi-system-4.8.2.jar!/mapper/system/SysConfigMapper.xml]
### The error may involve com.ruoyi.system.mapper.SysConfigMapper.selectConfigList-Inline
### The error occurred while setting parameters
### SQL: select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark    from sys_config
### Cause: java.sql.SQLSyntaxErrorException: Table 'ry.sys_config' doesn't exist
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'ry.sys_config' doesn't exist
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:537)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:214)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:270)
	at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:773)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:575)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:780)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:453)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:343)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1370)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1359)
	at com.ruoyi.RuoYiApplication.main(RuoYiApplication.java:18)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88)
	...


	错误分析:
缺少表空间信息。

	解决方案:
导入数据库信息。

4.字符编码问题

QQ_1767513161857

	错误信息:
如上图所示。


	解决方案:
检查数据库的字符编码是否存在问题。使用"SHOW VARIABLES LIKE 'character%';"命令查看验证。

5.Web server failed to start. Port 80 was already in use.

QQ_1767517313751

	错误信息
***************************
APPLICATION FAILED TO START
***************************

Description:

Web server failed to start. Port 80 was already in use.

Action:

Identify and stop the process that's listening on port 80 or configure this application to listen on another port.


	错误分析:
由于已经启动过服务,因此无需重复启动。


	解决方案:
检查是否重复启动若依服务。