Docker Compose部署SpringBoot2+Vue3+redis项目(Rockylinux9.6)

项目概述

本文将详细介绍如何在 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

部署完成

相关推荐
tzhou644522 小时前
Docker Compose 编排与 Harbor 私有仓库
运维·docker·容器
Clarence Liu2 小时前
虚拟机与容器的差异与取舍
linux·后端·容器
摇滚侠2 小时前
CentOS 7 Linux 离线安装 Docker:离线安装包、依赖文件、安装步骤
linux·docker·centos
典孝赢麻崩乐急3 小时前
Redis复习-------Redis数据类型
redis
计算机小手3 小时前
Kong + Konga 网关入门实践:Docker 部署、反向代理与插件使用指南
运维·经验分享·网络协议·docker·kong·开源软件
汪碧康3 小时前
【k8s-1.34.2安装部署】六.企业级部署cilium-1.18.4网络插件
网络·云原生·容器·kubernetes·k8s·cilium·xkube
回忆是昨天里的海3 小时前
k8s暴露服务NodePort
云原生·容器·kubernetes
特级业务专家3 小时前
这下发布不需要Jenkins了
linux·git·docker
回忆是昨天里的海3 小时前
docker自定义网络-简单总结
运维·docker·容器