若依前后端分离项目容器化
下载代码 复制以下命令到终端执行
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
访问测试:
运行前端
安装依赖并运行服务
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
使用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
加入健康检查
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
正文完
还行