使用docker部署SpringBoot+Vue前后端分离项目
写在前面:致敬软院传奇专业核心课程软工二:大作业卷得飞起(怎么有小组做了10个自由需求甚至做了CICD的啊),上课全在讲笑话期末考得一坨屎(本fw期末喜提卷面68分)。因为sb课程部署项目会加分,故有了这篇快速教学文章(文章不会涉及原理,只教如何使用工具),希望能对学习部署的人有所帮助。
一、下载docker
在你的云服务器上(一般都是选择ubuntu系统)执行以下命令:
1
2sudo 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
查看是否能够正常拉取镜像,结果应该如图所示:
至此,docker的安装已完成。
安装完成后可以先为你的项目创建一个网络,使用docker network create your_network_name
二、部署mysql
mysql
的部署非常简单,输入以下命令即可:1
2
3docker 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
查看部署情况:
三、部署后端
- 在部署后端之前,要先对后端项目进行打包,需要使用maven工具。下面以idea来做演示:
打包完成之后,在target/
目录下会出现一个jar包,这个jar包就是我们部署后端需要的核心部件。
创建
/opt/your_project_name/backend
目录来存放后端部署文件,将上面的jar包放入该文件夹,同时我们还需要后端运行的配置文件(yaml
文件或者是properties
文件)和Dockerfile
部署文件。application.yaml
(示例)文件如下:1
2
3
4
5
6
7
8
9
10
11spring:
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
2docker 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/
文件夹,这个文件夹里面的东西就是我们部署需要的资源。创建目录
/opt/your_project_name/nginx
和/opt/your_project_name/nginx/html
,将dist/
文件下的全部东西都放html/
文件下,然后在nginx/
文件夹下我们还需要一个nginx.conf
文件来配置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
35worker_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
4docker 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
来查看服务:
至此,三个服务都已部署成功。
五、一些踩过的坑
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)端口,如果没有将其开放即可。