写在前面:致敬软院传奇专业核心课程软工二:大作业卷得飞起(怎么有小组做了10个自由需求甚至做了CICD的啊),上课全在讲笑话期末考得一坨屎(本fw期末喜提卷面68分)。因为sb课程部署项目会加分,故有了这篇快速教学文章(文章不会涉及原理,只教如何使用工具),希望能对学习部署的人有所帮助。

一、下载docker

  • 在你的云服务器上(一般都是选择ubuntu系统)执行以下命令:

    1
    2
    sudo apt update
    sudo apt install docker.io docker-buildx
  • 下载完docker后因为docker的官方源需要梯子,所以要更换镜像源,进入/etc/docker文件夹并创建daemon.json文件,加入以下内容:

    1
    2
    3
    {
    "registry-mirrors": [ "https://docker.m.daocloud.io"]
    }

添加完毕之后输入sudo systemctl daemon-reload && sudo systemctl restart docker命令重新启动docker,这一步之后输入docker run hello-world查看是否能够正常拉取镜像,结果应该如图所示:

拉取hello-world镜像

至此,docker的安装已完成。

安装完成后可以先为你的项目创建一个网络,使用docker network create your_network_name

二、部署mysql

  • mysql的部署非常简单,输入以下命令即可:

    1
    2
    3
    docker run -d --name mysql --network your_network_name -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=your_root_password -e MYSQL_DATABASE=your_database_name \
    mysql:latest

然后再输入docker ps查看部署情况:

017639f4d7b60ceeedec7233fcd0061b

三、部署后端

  • 在部署后端之前,要先对后端项目进行打包,需要使用maven工具。下面以idea来做演示:

使用maven打包后端

​ 打包完成之后,在target/目录下会出现一个jar包,这个jar包就是我们部署后端需要的核心部件。

  • 创建/opt/your_project_name/backend目录来存放后端部署文件,将上面的jar包放入该文件夹,同时我们还需要后端运行的配置文件(yaml文件或者是properties文件)和Dockerfile部署文件。

  • application.yaml(示例)文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    spring:
    datasource:
    url: jdbc:mysql://mysql:3306/smartpricing?characterEncoding=utf-8&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useSSL=false
    username: root
    password: 123456
    jpa:
    hibernate:
    ddl-auto: update

    server:
    port: 8080

​ 注意这里的url不再是mysql://localhost:3306而是mysql://mysql:3306,也就是把主机名换成了你部署的mysql的容器名。

  • Dockerfile(示例)文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 使用官方的 OpenJDK 21 基础镜像
    FROM openjdk:21

    # 设置工作目录
    WORKDIR /opt/smart-pricing/backend

    # 将 JAR 文件和 application.yml 复制到工作目录中
    COPY smart-pricing.jar ./smart-pricing.jar
    COPY application.yml ./config/application.yml

    # 设置时区为上海
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

    # 暴露应用程序端口
    EXPOSE 8080

    # 指定容器启动时执行的命令,运行 Spring Boot 应用
    ENTRYPOINT ["sh", "-c", "java -Dspring.config.location=file:./config/application.yml -jar smart-pricing.jar"]

​ 因为本地后端配置和云服务器的后端配置文件不一样,所以需要指定选择配置文件来运行。

  • 这三个文件都准备好后,就在该目录下执行以下命令:

    1
    2
    docker build -t your_backend_name:1.0.0 .
    docker run -d -p 8080:8080 --name your_backend_container_name --network your_network_name your_backend_name:1.0.0

输入docker ps查看部署情况:

查看后端部署情况

至此后端部署完成。

四、部署前端

  • 和后端一样,在部署前端之前要先对前端项目进行打包。直接在前端项目目录下输入命令npm run build既可完成打包。成功之后应该会生成一个dist/文件夹,这个文件夹里面的东西就是我们部署需要的资源。

    dist文件夹

  • 创建目录/opt/your_project_name/nginx/opt/your_project_name/nginx/html,将dist/文件下的全部东西都放html/文件下,然后在nginx/文件夹下我们还需要一个nginx.conf文件来配置nginx服务。

    nginx文件结构

  • nginx.conf文件(示例)如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    worker_processes  1; //处理器使用数量

    events {
    worker_connections 256; //最大连接数
    }


    http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    server {
    listen 80;
    server_name your_sever_public_ip;

    location / { //资源定位
    root /usr/share/nginx/html;
    index index.html index.htm;
    }

    location /prod-api/ { //将/prod-api请求转发到后端
    proxy_pass http://your_backend_container_name:8080/;
    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;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }
    }

    因为这里是监听/prod-api请求并转发到后端的8080端口,所以不要修改你前端的main.ts文件:

    1
    axios.defaults.baseURL = ("http://your_sever_public_ip/prod-api")
  • 最后执行以下命令来部署nginx:

    1
    2
    3
    4
    docker run -d -p 80:80 \
    -v /opt/ruoyi/nginx/nginx.conf:/etc/nginx/nginx.conf -v /opt/ruoyi/nginx/html:/usr/share/nginx/html \
    --name your_nginx_container_name --network your_network_name \
    nginx:latest

输入docker ps来查看服务:

查看nginx服务

至此,三个服务都已部署成功。

五、一些踩过的坑

  • jar包运行失败或者是找不到主类。运行失败可能是jdk版本的问题,如果是找不到主类的话检查后端的pom.xml文件,为主类添加<skip>配置:

    1
    2
    3
    4
    <configuration>
    <mainClass>com.example.smartpricing.SmartPricingApplication</mainClass>
    <skip>false</skip>
    </configuration>

    同时本地可以通过命令java -jar your_jar_name.jar来检查jar包能否正常运行,部署完后也可以通过命令docker logs your_backend_container_name来检查后端是否已经正常启动。

  • http访问公网ip显示无法访问此页面。检查你的云服务器是否开放了80(http)端口,如果没有将其开放即可。

    检查http端口