文章同步更新于我的个人博客:松果猿的博客,欢迎访问获取更多技术分享。🍀🍀🍀
同时,您也可以关注我的微信公众号:松果猿的代码工坊,获取最新文章推送和编程技巧。🚀🚀🚀
前言
一般常见的前后端部署方式有以下三种方式:
-
单体部署:将前端和后端代码打包在一起,部署到同一个服务器或应用容器中。
-
分离部署:分离部署是指将前端和后端代码分开部署,前端部署在静态资源服务器上,后端部署在应用服务器上
-
Docker容器化部署:将应用及其依赖环境打包成一个或多个Docker容器,然后部署到支持Docker的服务器上
我们就用Docker容器化部署一个springboot+vue的项目,我选用的是若依后台管理系统,仓库地址:gitee.com/y_project/R...,将其克隆下来作为我们部署的项目。
一般来说应该是先在本地打包成docker镜像然后上传到私有仓库,然后在服务器将镜像拉取下来,但是我们个人没有什么镜像仓库,但是可以先将jar包上传到服务器,然后在服务器上打包成镜像
-
以下为本人个人方案,若有错误请指出
-
域名以及SSL配置不进行赘述,不是本文的重点
-
需要对docker的相关知识有所了解,可以看我的这篇文章:docker学习笔记(1)
一、Spring Boot 项目打包
1. 修改配置文件
在 IDEA 中打开 Spring Boot 项目,找到 application.yaml
文件。根据部署需求,将数据库和 Redis 的地址修改为 Docker 容器名:
这里可能有人有疑问,为什么不是后端服务器地址,因为我想的是docker会创建一个网络,这样就不需要连接其公网地址,直接连接容器名更好一点。
2. 打包为 JAR 文件
在 IDEA 的右侧边栏中找到 Maven 面板。然后点击生命周期下的 package 目标。双击 package 目标,IDEA 会自动运行 Maven 的 package
命令来构建项目。构建完成后,JAR 文件会生成在项目的 target
目录下。
二、Docker 环境搭建与服务部署
1. 创建 Docker 网络
为了使各个容器能够方便地通信,首先需要创建一个 Docker 网络。打开Xshell
连接云服务器,执行以下命令:
bash
docker network create ruoyi
2. 部署 MySQL 到 Docker
创建并运行 MySQL 容器,设置环境变量以配置数据库的密码等信息。执行以下命令:
bash
docker run -d \
--name mysql \
--network ruoyi \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=your_root_password \
-e MYSQL_DATABASE=your_database_name \
mysql:latest
-d
表示在后台运行容器。--name mysql
为容器指定一个名称。--network ruoyi
将容器连接到ruoyi
网络。-e
后面跟随的是环境变量,用于设置 MySQL 的相关配置,如 root 密码、默认数据库名称。mysql:latest
使用最新版本的 MySQL 镜像。
3. 部署 Redis 到 Docker
创建并运行 Redis
容器,执行以下命令:
bash
docker run -d \
--name redis \
--network ruoyi \
-p 6379:6379 \
redis:latest
-d
表示在后台运行容器。--name redis
为容器指定一个名称。--network ruoyi
将容器连接到ruoyi
网络。redis:latest
使用最新版本的 Redis 镜像。
4. Navicat 连接远程数据库
先来到阿里云控制台开放3306端口:
在 Navicat 的主界面,点击左上角的"连接"按钮,选择你想要连接的数据库类型
在新建弹窗中输入连接名称、 IP 地址、端口等:
连接成功后,就可以在数据库中运行SQL文件创建表了:
三、Spring Boot 应用 Docker 部署
1. 准备 Dockerfile
先在本地创建一个 Dockerfile
,内容如下:
dockerfile
# 使用官方的 Java 基础镜像
FROM openjdk:11-jre-slim
# 设置工作目录
WORKDIR /opt/ruoyi/backend
# 将 JAR 文件复制到工作目录中
COPY ruoyi-admin.jar ./ruoyi-admin.jar
# 暴露应用程序端口
EXPOSE 8080
# 指定容器启动时执行的命令,运行 Spring Boot 应用
ENTRYPOINT ["java", "-jar", "ruoyi-admin.jar"]
2. 构建 Docker 镜像
来到根目录,创建一个目录,使用 Xftp
将 JAR 包和 Dockerfile
上传到服务器的 /opt/ruoyi/backend
目录下。
bash
mkdir -p /opt/ruoyi/backend
上传文件后,在服务器上的 /opt/ruoyi/backend
目录下,执行以下命令构建 Docker 镜像:
bash
docker build -t ruoyi:latest .
docker build
是构建 Docker 镜像的命令。-t ruoyi:latest
为构建的镜像指定一个标签,这里标签名为ruoyi:latest
。.
表示 Dockerfile 位于当前目录。
3. 运行 Docker 容器
构建好镜像后,可以使用以下命令来运行 Docker 容器:
bash
docker run -d -p 8080:8080 --name ruoyi --network ruoyi ruoyi:latest
-d
表示在后台运行容器。-p 8080:8080
将容器的 8080 端口映射到宿主机的 8080 端口。--name ruoyi
为运行的容器指定一个名称。--network ruoyi
将容器连接到ruoyi
网络。ruoyi:latest
是之前构建的 Docker 镜像名称。
查看日志,若依成功启动:
这样三个容器都启动起来了:
四、使用 Docker 部署 Nginx
1. 准备 Nginx 配置和静态资源目录
将若依项目的前端部分进行打包:
arduino
npm run build
执行 npm run build:prod
命令后,这里打包的是其生产环境,会生成一个 dist
文件夹,里面包含了打包后的静态资源文件
这里nginx
可以用卷映射也可以用dockerfile进行配置,为了简单方便一点就用卷映射吧。在宿主机上创建 Nginx 的配置文件目录和静态资源目录:
dockerfile
mkdir -p /opt/ruoyi/nginx/html
mkdir -p /opt/ruoyi/nginx
将打包后的dist文件使用Xftp
传输到/opt/ruoyi/nginx/html
2. 配置 Nginx 反向代理
为了使 Nginx 能够将请求转发到若依框架的后端服务,需要修改 nginx.conf
文件:
bash
cd /opt/ruoyi/nginx
vi nginx.conf
在 以下配置复制到nginx.conf
文件中:
ini
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 8.155.27.197;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /prod-api/ {
proxy_pass http://ruoyi: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;
}
}
}
3. 使用 Docker 部署 Nginx
使用以下命令启动一个 Nginx 容器,并通过卷映射将宿主机的配置文件和静态资源目录映射到容器中:
bash
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 ruoyi-nginx \
--network ruoyi \
nginx:latest
访问是可以正确访问了,但是为什么报错了????好像是什么java依赖包有问题,不过我们部署一整套流程没出错就行,哈哈哈哈哈😊😊😊😊😊😊😊😊😊😊😊
贴一个从网上看到的使用DockerCompose的方法:blog.csdn.net/weixin_4659...
本文只是简单演示,如果想要更加规范化,还需要使用到Docker Compose
该服务器实例我已经删除,访问不了了