项目概述
本文将详细介绍如何在 Rockylinux9.6 环境下使用 Docker Compose 一键部署包含 Spring Boot 2 后端、Vue 3 前端、MySQL 数据库和 Redis 缓存的全栈项目。
环境要求
-
服务器环境:Rockylinux9.6(云服务器或本地虚拟机)
-
容器环境:Docker 及 Docker Compose
-
开发环境:JDK 17、Maven 3、IDEA、Node.js(用于项目构建)
部署步骤
1.环境准备
设置静态ip
1. 安全设置(可选)
永久关闭防火墙
# 停止防火墙服务
sudo systemctl stop firewalld
# 禁用防火墙开机自启
sudo systemctl disable firewalld
# 验证防火墙状态
sudo systemctl status firewalld
永久关闭 SELinux
# 编辑 SELinux 配置文件
sudo vi /etc/selinux/config
# 修改为以下内容
SELINUX=disabled
# 重启系统使配置生效
sudo reboot
2. 编辑网络配置文件
vi /etc/NetworkManager/system-connections/ens160.nmconnection
3. 配置文件内容
[connection]
id=ens160
uuid=2d3400d6-97d2-320c-a0b4-3e87f4067d67
type=ethernet
autoconnect-priority=100
interface-name=ens160
timestamp=1766835341
[ethernet]
[ipv4]
method=manual
addresses=192.168.92.13/24,192.168.92.2
dns=114.114.114.114
[ipv6]
addr-gen-mode=eui64
method=ignore
[proxy]
重启命令:
systemctl restart NetworkManager
配置Rockylinux9.6的yum源
#(这里是rockylinux9系列配置方法)
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/rocky*.repo
dnf makecache
安装docker
1、若您安装过docker,需要先删掉,之后再安装依赖:
sudo yum remove docker docker-common docker-selinux docker-engine
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2、下载repo文件。
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
软件仓库地址替换为:
sudo sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
3、更新索引文件并安装
sudo dnf makecache
sudo yum install docker-ce
4、启动& 开机启动docker
systemctl enable docker --now
docker ps命令验证一下

5、配置国内镜像加速器
# 创建 Docker 配置目录
sudo mkdir -p /etc/docker
# 配置镜像加速器(使用国内多个镜像源)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.m.daocloud.io",
"https://docker.xuanyuan.me"
]
}
EOF
# 重新加载配置并重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
安装docker-compose
#从github中拉取下载docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose
#设置文件具备执行权限
sudo chmod +x /usr/local/bin/docker-compose
#查看已安装的版本,如果能正常输出版本号说明安装compose完毕
docker-compose -v
2.前端、后端项目打包
前端后端打包之前,需要将项目配置信息进行调整,redis:host: redis等,后续创建容器的会创建一个自定义网络,并把所有容器都连接到自定义网络中。这样它们之间通信,就能通过容器名代替ip地址通信
后端未配置 CORS(application.yml 中没有 spring.web.cors 相关配置),因此必须由 Nginx 处理跨域。

后端打包:打开maven面板,先执行clean,再执行package,这样就会出现一个target目录,target目录会有一个jar包

前端有一些地方也要进行配置:




前端打包:打开终端,输入npm run build,这样左边会有一个dist目录,dist就是由前端打包出来的

创建目录:
mkdir -p /data/docker-compose/{backend,nginx}
将后端jar和前端dist文件夹中的内容上传到根目录(~)
项目的树形包结构:
[root@localhost data]# tree
.
├── docker-compose
│ ├── backend
│ │ ├── Dockerfile
│ │ └── Springbootdemo-0.0.1-SNAPSHOT.jar
│ ├── docker-compose.yml
│ └── nginx
│ ├── dist
│ │ ├── assets
│ │ │ ├── 1-DxVeaUtM.jpg
│ │ │ ├── 2-U6Qjex4J.jpg
│ │ │ ├── chichi03-DW8jof7n.jpg
│ │ │ ├── index-CYqzScuv.js
│ │ │ └── index-Cp89o39-.css
│ │ ├── favicon.ico
│ │ └── index.html
│ └── nginx.conf
├── mysql
│ ├── data
│ └── init
│ └── init.sql
└── redis
└── data
10 directories, 14 files
3.配置 Dockerfile
Dockerfile的作用是将后端SpringBoot的项目Jar包build成Docker镜像。
首先创建Dockerfile文件:
#进入到backend目录
cd /data/docker-compose/backend
#创建Dockerfile文件
vi Dockerfile
将 JAR 文件移动到 Dockerfile 目录:
mv /root/Springbootdemo-0.0.1-SNAPSHOT.jar /data/docker-compose/backend/
将下述内容同步到Dockerfile中:
[root@localhost backend]# cat Dockerfile
FROM eclipse-temurin:17-jdk-alpine #指定基础镜像
LABEL author=liuyunjie #为生成的镜像添加元数据标签。author=liuyunjie 是一个键值对。
COPY Springbootdemo-0.0.1-SNAPSHOT.jar /app.jar #将构建上下文(即执行 docker build 命令的目录)中的 Springbootdemo-0.0.1-SNAPSHOT.jar 文件,复制到镜像内部的根目录下,并重命名为 app.jar。
EXPOSE 8080 #声明容器在运行时将监听的网络端口(这里是 8080)。
ENTRYPOINT ["java","-jar","/app.jar"] #设置镜像的主启动命令。当基于此镜像启动容器时,这个命令会自动执行。
构建成功后,通过命令docker images查看刚刚生成的镜像:

这样就说明Dockerfile没有任何的问题,此时就可以通过命令将SpringBoot项目JAR镜像删除(可以删可以不删)
docker rmi 镜像id
4.配置 Nginx
进入目标目录,创建好Nginx配置文件:
# 进入目录
cd /data/docker-compose/nginx
# 创建配置文件
vi nginx.conf
将下述配置复制到nginx.conf文件中(注意换成自己的ip):
[root@localhost nginx]# cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 可选:配置日志格式和路径,方便排查
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;
server {
listen 80; #监听 80 端口(HTTP)。
server_name 192.168.92.13; #匹配的域名或IP。你填写的 192.168.92.13 是宿主机IP,确保你能通过该IP访问。容器内通信不依赖此。
# 【规则一:静态文件服务】- 处理前端文件 (html, css, js, images等)
# 根目录设置为前端 dist 文件夹
root /usr/share/nginx/html; #静态文件的根目录。必须与 docker-compose.yml 中 Nginx 的挂载卷 - ./nginx/dist:/usr/share/nginx/html:ro 完全对应。
# 默认首页文件
index index.html index.htm; #当访问 http://192.168.92.13/ 时,会自动寻找并返回 index.html。
# 【关键指令】用于支持前端路由(如 Vue Router 的 history 模式)
# 当请求的文件或目录不存在时,将请求重写到 index.html,由前端框架处理路由
try_files $uri $uri/ /index.html;
# 【规则二:API 代理】- 将以 /api 开头的请求转发到后端
location /api/ {
# 跨域处理(考虑到你可能直接调试后端接口,保留此配置)
add_header 'Access-Control-Allow-Origin' '$http_origin' always; # 动态匹配来源,更安全
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Allow-Credentials' 'true' always; # 如需携带Cookie
# 处理 OPTIONS 预检请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
# 核心代理设置
proxy_pass http://springboot:8080/; #springboot是你的 Spring Boot 服务在 Docker Compose 网络中的服务名。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 可选:超时设置
proxy_connect_timeout 75s;
proxy_read_timeout 300s;
}
# 【可选规则:代理其他路径】如果你还有其他后端服务,可以继续添加
# location /other-service/ {
# proxy_pass http://other-service:8081;
# ... 类似配置 ...
# }
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@localhost nginx]#
5.配置 DockerCompose
在这之前做一下准备工作:
[root@localhost data]# mkdir mysql/data #mysql卷挂载目录
[root@localhost data]# mkdir redis/data #redis卷挂载目录
#把sql语句复制进init.sql,docker-compose.yml会在运行mysql的时候自动执行这个init.sql
[root@localhost data]# mkdir mysql/init/init.sql
DockerCompose的作用是批量操作Docker容器,这样就可以一键部署好我们的环境了。
首先进入到目标目录,创建docker-compose.yml文件:
# 进入目标目录,创建文件
cd /data/docker-compose/
vi docker-compose.yml
将下述内容复制到文件中:
[root@localhost docker-compose]# cat docker-compose.yml
version: '3.8'
services:
# Redis 缓存服务
redis:
image: redis:6-alpine # 使用更小的 alpine 版本
container_name: redis
restart: always
command: redis-server --maxmemory 512mb --appendonly yes
volumes:
- /data/redis/data:/data
networks:
- app-network
# 注意:生产环境建议移除 ports,仅内部网络访问
# ports:
# - "6379:6379"
# MySQL 数据库服务
mysql:
image: mysql:8.0
container_name: mysql
restart: always
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: big_event # 已正确添加
command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --lower-case-table-names=1
- --performance-schema=1
- --skip-log-bin
volumes:
- /data/mysql/data:/var/lib/mysql
- /data/mysql/init:/docker-entrypoint-initdb.d:ro #SQL 初始化
networks:
- app-network
ports:
- "3306:3306" # 保留,方便本地数据库工具连接
# Spring Boot 后端应用
springboot:
build: ./backend # 使用当前目录下的 backend 文件夹中的 Dockerfile
container_name: springboot
restart: always
environment:
- SPRING_REDIS_HOST=redis
- SPRING_REDIS_PORT=6379
depends_on:
- mysql
- redis
networks:
- app-network
# 注意:后端端口不对外暴露,只通过内部网络访问
# Nginx 网关(前端 + 反向代理)
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
ports:
- "80:80" # 对外只暴露 80 端口
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # Nginx 配置
- ./nginx/dist:/usr/share/nginx/html:ro # 前端静态文件
depends_on:
- springboot
networks:
- app-network
# 定义网络
networks:
app-network:
driver: bridge
[root@localhost docker-compose]#
启动命令:
[root@localhost docker-compose]# docker-compose up -d


部署完成