Docker+nginx部署SpringBoot+vue前后端分离项目(保姆及入门指南)

前后分离项目部署

  • 项目回顾
  • 工具
  • 上线准备
  • 1、win
    • 1.1、前端
    • 1.2、后端
  • 2、linux环境
    • 2.1、安装docker
    • 2.2、安装docker compose
    • 2.3、编写Dockerfile文件
    • 2.4、编写docker-compose.yml文件
    • 2.5、修改application-pro.yml
    • 2.6、准备好nginx的挂载目录和配置
    • 2.7、部署后端服务

项目回顾

书接上文,我们使用springboot+jwt+shiro+vue+elementUI+axios+redis+mysql完成一个前后端分离的博客项目
csdn链接:https://blog.csdn.net/weixin_45683778/article/details/139002415
github地址:https://github.com/huang-hanson/vueblog

项目展示地址:http://47.116.123.21:81/blogs

这部分介绍如何部署我们的项目

工具

  • xshell 7 绿色破解版
  • Navicat 11 简体中文

上线准备

这里我们同步演示怎么部署到win环境和linux(centos7)系统中,前端服务器采用nginx部署并使用docker统一管理前后端服务器。
所以我们会用到:

  • nginx
  • docker compose

1、win

win环境我就用本机来演示了,我们需要分别打包前后端,前后端打包都是一条命令即可,只不过我们打包之前注意需要配置好线上的环境参数等

1.1、前端

先来配置一下后端的调用路径,因为现在部署在本地localhost,所以在axios.js中,我们配置好链接,因为等下后端部要也是本机,所以我这里直接这样配置就好了,如下:

  • srclaxios.js
axios.defaults.baseURL = "http://localhost:8082"

在这里插入图片描述

上面配置的就是前端访问后端接口的服务。

然后前端部署还需要考虑一个问题:打包之后项目资源引用路径,比如我们打包后链接是否需要带项目名称等。按照Vue官方的部罢说明,我们添加一个vue.config.js文件,

  • vueblog-vue/vue.config.js
module.exports = {
    publicPath: '/'
}

在这里插入图片描述

当然了,pubicPath默认其实是空的,也就是publicPath:",两个效果貌似其实是一样的,哈哈哈,我只是提醒一下有这回事而已,嘿嘿。

设置完毕之后,我们执行打包命令:

#打包命令
npm run build

命令执行之后,我们在项目根目录下就可以找到一个dist的目录,这个就是打包之后的文件夹里面有个index.html,但是我们点击直接打开是看不到任何内容的,这时候,我们需要部署到nginx中。

注:首次打包需要npm install一下
在这里插入图片描述

在这里插入图片描述

首先我们下载一个nginx,下载地址:http://nginx.org/en/download.html,这里我们下载nginx/Windows-1.26.0版本,下载之后解压zip。根据我们对nginx的熟悉,静态文件我们放在html文件夹下面,所以先把html文件夹中的index.html50x.html删掉,然后把打包出来的dist文件夹内的所有文件都复制到nginxhtml中,如图:

在这里插入图片描述
在这里插入图片描述

双击nginx.exe启动nginx,然后浏览器输入http://localhost,出现了我们熟悉的界面,虽然没有博客数据,链接也自动跳转到了http://localhost/blogs,

在这里插入图片描述
我们点击任意一个链接或者按钮或者剧新界面,这时候出现了404:

在这里插入图片描述
刷新之后nginx就找不到路由了,这是为啥,得和你们科普一下,vue项目的入口是index.html文件,nginx路由的时候都必领要先经过这个文件,所以我们得给nginx定义一下规则,让它匹配不到资源路径的时候,先去读取index.html,然后再路由。所以我们配置一下nginx.conf文件。具体操作就是找到location,添加上一行代码try_files $uri $uri/ /index.html last;如下:

  • nginx-1.26.0/conf/nginx.conf
location / {
	root html;
	try_files $uri $uri/ /index.html last;
	index index.html index.htm;
} 

在这里插入图片描述

这一行代码是什么意思呢?
try_files的语法规则:格式1:try_files file…uri,表示按指定的们file顺序查找存在的文件,并使用第一个找到的文件进行请求处理,last表示匹配不到就内部直接匹配最后一个。

重启nginx之后,链接再刷新都正常啦。但是没有数据,所以我们去部署一下后端。windows环境nginx的重启我一般都是打开任务管理器直接干掉nginx进程,然后再重新双击的~~

在这里插入图片描述
重启之后,这样就能找到我们的资源路径了(例如:通过logs,跳转到登录页)

在这里插入图片描述
在这里插入图片描述

前端已经部署完毕,但是没有数据进来,现在部署后端。

1.2、后端

后端的打包就简单多了,应该大家都挺熟悉的,注意配置redis、mysql的链接密码啥的,然后执行命令,本机测试,redis和mysql我都已经提前安装好的了,sql文件也在vueblog-java的resources日录下

对了,pom.xml文件里面,spring-boot-maven-plugin之前注释掉了,现在一定要打开。不然执行jar会找不到主类。

  • pom.xml
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

在这里插入图片描述

执行打包命令:

#跳过测试打包
mvn clean package -Dmaven.test.skip=true

得到target下的vueblog-0.0.1-SNAPSHOT.jar,然后再执行命令

或者直接通过maven工具

在idea右侧直接运行clean–>test–>package,左边会出现target文件和jar包
在这里插入图片描述

java jar vueblog-0.0.1-SNAPSHOT.jar --spring.profiles.active=default

后端上线之后,我们再访问下前端,发现已经可以正常浏览网页啦!spring.profiles.active表示指定环境配置文件。

在这里插入图片描述
在这里插入图片描述
图中后端启动完成,端口为8082,刷新前端页面

在这里插入图片描述

到此,win部署完成。

2、linux环境

linux环境部署相对复杂一点,因为我们还要部署redis、mysql等。我们使用docker compose来编排我们的服务,一起性搞定部罢。
二话不说,我们先来安装一下docker和docker compose,对于docker知识还不是特别懂的同学,建议自行去补习补习哈。

2.1、安装docker

#安装
yum install docker

#检验安装是否成功
[rootalocalhost opt]# docker--version
Docker version 26.0.0, build 2ae903e


#启动
systemctl start docker

2.2、安装docker compose

可以参考:https://docs.docker.com/compose/install/

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

或者

sudo wget "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64" -O /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

#检查是否安装成功
docker-compose --version

在这里插入图片描述

2.3、编写Dockerfile文件

因为我们的项目需要成为docker的镜像,所以我们必须先编写Dockerfile文件构建我们的项目镜像然后进行编排,Dockerfile文件可以帮我们进行构建。

在这里插入图片描述

  • Dockerfile
FROM openjdk:8

EXPOSE 8080

ADD vueblog-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'

ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=pro"]

2.4、编写docker-compose.yml文件

我们需要用到的软件与服务分别有nginx、mysq、redis、还有我们的springboot项目,所以编写如下:

  • docker-compose.yml
version: '3'

services:
  nginx: # 服务名称
    image: nginx:latest # 最新版本的nginx
    ports:
      #- 80:80 # 把docker容器的80端口映射到宿主机的80端口
      - 81:81
    volumes:
      - /root/nginx/html:/usr/share/nginx/html  # 将docker中额html文件夹映射到宿主机的/root/nginx/html目录下
      - /root/nginx/nginx.conf:/etc/nginx/nginx.conf  # 将docker中额nginx.conf配置文件映射到宿主机的/root/nginx/nginx.conf目录下
    privileged: true # 这个必须要加,解决nginx的文件调用权限问题
  mysql:
    image: mysql:5.7.27
    ports:
      #- 3306:3306
      - 8081:3306
    environment:
      - MYSQL_ROOT_PASSWORD=admin
  redis:
    image: redis:latest
    command: redis-server /etc/redis/redis.conf
    volumes:
      - ./redis/data:/data
      - /root/redis/redis.conf:/etc/redis/redis.conf  # 将docker中额nginx.conf配置文件映射到宿主机的/root/nginx/nginx.conf目录下
    ports:
      - 6379:6379
  vueblog:
    image: vueblog:latest
    build: .   # 这个不能从docker hub中去拉取,需要自己构建,会去寻找同级下的Dockerfile文件(文件中的jar包)进行构建
    ports:
      - 8082:8082
    depends_on:
      - mysql
      - redis

上面注释写的很明白

2.5、修改application-pro.yml

然后我们再回头看看applicaiion-pro.yml文件,mysql和redls的链接之前还是localhost,现在我们需要修改成容器之间的调用,如何知道mysql和redis的链接地址呢?docker compose就帮我们解决了这个问题,我们可以使用镜像容器的服务名称来表示链接。比如docker-compose.yml中mysql的服务名称就叫mysql、redis就叫redis。

# DataSource Config
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysql:8081/vueblog?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: admin
shiro-redis:
  enabled: true
  redis-manager:
    host: redis:6379

2.6、准备好nginx的挂载目录和配置

docker-compose.yml中已经提到

  • 宿主机的挂载目录:/root/nginx/htmI
  • 挂载配置:/root/nginx/nginx.conf

所以我们在root目录下新建nginx目录,并进入nginx目录下新建html目录和一个nginx.conf配置文件。

在这里插入图片描述
axios.js文件中url需要改成你的linux机器ip

在这里插入图片描述
重新前端代码打包,压缩后托到html文件夹下面

在这里插入图片描述

将dist文件下面的文件全部转移到html下

在这里插入图片描述

编写nginx.config配置文件,其中可以参考win下的配置文件

将location 的html地址改成挂载的目录

# user root;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        # listen       80;
        listen       81;
        server_name  localhost;
        
        location / {
            root   /usr/share/nginx/html;
			try_files $uri $uri/ /index.html last;
            index  index.html index.htm;
        }

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

在这里插入图片描述

2.7、部署后端服务

一切准备就绪之后,我们就开始编排部署了哈。

首先本地打包vueblog项目,vueblog-0.0.1-SNAPSHOT.jar,并上传到linux中,同时docker-compose.ymlDockerfile也上传到同一目录下。如图所示:

在这里插入图片描述

然后我们执行一下编排命令:

#开始编排
cd
docker-compose up -d

其中-d表示后台服务形式启动

然后我们稍等片刻,特别是开始Building vueblog的时候可能时间有点长,耐心等待即可!最后提示如下·

在这里插入图片描述

访问连接:http://47.116.123.21:81/blogs(你自己的ip+port)我这里为了避免冲突,我将80改成了81端口
在这里插入图片描述
发现没有数据,需要导入sql表

DROP TABLE IF EXISTS `m_blog`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
SET character_set_client = utf8mb4 ;
CREATE TABLE `m_blog` (
                          `id` bigint(20) NOT NULL AUTO_INCREMENT,
                          `user_id` bigint(20) NOT NULL,
                          `title` varchar(255) NOT NULL,
                          `description` varchar(255) NOT NULL,
                          `content` longtext,
                          `created` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
                          `status` tinyint(4) DEFAULT NULL,
                          PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `m_user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
SET character_set_client = utf8mb4 ;
CREATE TABLE `m_user` (
                          `id` bigint(20) NOT NULL AUTO_INCREMENT,
                          `username` varchar(64) DEFAULT NULL,
                          `avatar` varchar(255) DEFAULT NULL,
                          `email` varchar(64) DEFAULT NULL,
                          `password` varchar(64) DEFAULT NULL,
                          `status` int(5) NOT NULL,
                          `created` datetime DEFAULT NULL,
                          `last_login` datetime DEFAULT NULL,
                          PRIMARY KEY (`id`),
                          KEY `UK_USERNAME` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

INSERT INTO `vueblog`.`m_user` (`id`, `username`, `avatar`, `email`, `password`, `status`, `created`, `last_login`) VALUES ('1', 'hanson', 'https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg', NULL, '96e79218965eb72c92a549dd5a330112', '0', '2020-04-20 10:44:01', NULL);

在这里插入图片描述
再次刷新项目就部署成功了;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/637925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pod容器资源限制和探针

目录 一、资源限制 1.Pod和容器的资源请求和限制 2.CPU 资源单位 案例一 案例二 二、健康检查&#xff0c;又称为探针&#xff08;Probe&#xff09; 1.探针的三种规则 2.Probe支持三种检查方法 3.探测获得的三种结果 案例一&#xff1a;exec 案例二&#xff1a;htt…

C语言/数据结构——每日一题(有效的括号)

一.前言 如果想要使用C语言来解决这道题——有效的括号&#xff1a;https://leetcode.cn/problems/valid-parentheses/description/我们必须要借用上一篇我们所讲的内容——栈的实现&#xff1a;https://blog.csdn.net/yiqingaa/article/details/138923750?spm1001.2014.3001.…

LLM实战:当网页爬虫集成gpt3.5

1. 背景 最近本qiang~关注了一个开源项目Scrapegraph-ai&#xff0c;是关于网页爬虫结合LLM的项目&#xff0c;所以想一探究竟&#xff0c;毕竟当下及未来&#xff0c;LLM终将替代以往的方方面面。 这篇文章主要介绍下该项目&#xff0c;并基于此项目实现一个demo页面&#x…

【linux】深入了解线程池:基本概念与代码实例(C++)

文章目录 1. 前言1.1 概念1.2 应用场景1.3 线程池的种类1.4 线程池的通常组成 2. 代码示例2.1 log.hpp2.2 lockGuard.hpp① pthread_mutex_t 2.3 Task.hpp2.4 thread.hpp2.5 threadPool.hpp① 基本框架② 成员变量③ 构造函数④ 其余功能函数&#xff1a; main.cc结果演示 完整…

车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文

系列文章目录 车载网络测试实操源码_使用CAPL脚本解析hex、S19、vbf文件 车载网络测试实操源码_使用CAPL脚本对CAN报文的Counter和CRC进行实时监控 车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文 车载网络测试实操源码_使用CAPL脚本实现安全…

Go语言实现人脸检测(Go的OpenCV绑定库)

文章目录 OpenCVGithub官网安装环境变量 Go的OpenCV绑定库Github文档安装搜索视频设备ID显示视频检测人脸 OpenCV Github https://github.com/opencv/opencv/ 官网 https://opencv.org/ 安装 brew install opencv brew upgrade opencv安装目录 cd /usr/local/opt/opencv…

做OZON怎么选择物流,OZON物流Xingyuan

随着跨境电商的蓬勃发展&#xff0c;OZON作为俄罗斯领先的电商平台&#xff0c;吸引了大量中国卖家入驻。然而&#xff0c;物流作为跨境电商的关键环节&#xff0c;其选择对于卖家来说至关重要。本文将围绕“做OZON怎么选择物流”这一问题&#xff0c;深度解析OZON物流Xingyuan…

我爱我家:租赁下位替代买房,能行吗?

我爱我家&#xff0c;凭什么五天四板&#xff1f; 上周五的楼市组合拳出台后&#xff0c;地产板块迎来高潮。 这其中最火的不是我们常说的“招宝万金”&#xff0c;而是——我爱我家。 五天四板&#xff0c;一个月不到&#xff0c;股价轻松翻翻。 公司有什么变化吗&#xff1…

Android ART 虚拟机简析

源码基于&#xff1a;Android U 1. prop 名称选项名称heap 变量名称功能 dalvik.vm.heapstartsize MemoryInitialSize initial_heap_size_ 虚拟机在启动时&#xff0c;向系统申请的起始内存 dalvik.vm.heapgrowthlimit HeapGrowthLimit growth_limit_ 应用可使用的 max…

3dmax安装不完整Revit Interoperability

3dmax安装不完整Revit Interoperability 1.错误如图 2.在Autoremove界面中&#xff0c;点击扩展选项。 3.在扩展选项中&#xff0c;寻找并点击"1402 1406修复"。 4.根据软件指引&#xff0c;执行修复操作。Autoremove将自动修复无法打开注册表的问题。 如图 修…

[智能AI摄像头]使用docker搭建RV1126开发环境

创建ubuntu docker 创建dockerfile # 设置基础镜像为Ubuntu 18.04FROM ubuntu:20.04# 设置作者信息MAINTAINER warren "2016426377qq.com"# 设置环境变量&#xff0c;用于非交互式安装ENV DEBIAN_FRONTENDnoninteractive# 备份源列表文件RUN cp -a /etc/apt/source…

基于SSM的大学生兼职管理系统

基于SSM的大学生兼职管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 企业界面 前台学生界面 管理员界面 摘要 随着大学生兼职市场的日益繁…

LeetCode674:最长连续递增序列

题目描述 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每个 l < i < r&#xff0c;都有 nums[i] < nums…

必应bing国内广告开户首充和开户费是多少?

微软必应Bing作为国内领先的搜索引擎之一&#xff0c;其广告平台凭借其精准的投放、高效的数据分析和广泛的用户覆盖&#xff0c;已成为众多企业的首选。 根据最新政策&#xff0c;2024年必应Bing国内广告开户预充值金额设定为1万元人民币起。这一调整旨在确保广告主在账户初始…

智研未来,直击 AI DevOps,阿里云用户交流日杭州站来啦!

在这个技术日新月异的时代&#xff0c;云上智能化 DevOps 正以前所未有的速度推动企业创新边界&#xff0c;重塑软件开发的效率与品质。 为深入探索这一变革之路&#xff0c;诚邀您参与我们的专属闭门技术沙龙&#xff0c;携手开启一场关于云上智能化 DevOps 的挑战、实践与未…

Vue学习笔记2——创建一个Vue项目

Vue项目 1、创建一个Vue项目2、Vue项目的目录结构3、模版语法4、属性绑定5、条件渲染 1、创建一个Vue项目 vue官方文档&#xff1a; https://cn.vuejs.org/打开命令行界面&#xff08; “winR"再输入"cmd”&#xff09;&#xff0c;切换位置到指定的位置创建vue项目…

通胀担忧仍存,美联储降息预期或又推迟

KlipC报道&#xff1a;周三&#xff0c;美联储公布4月30日至5月1日政策会议纪要&#xff0c;会议纪要显示美联储对通胀仍感到担忧&#xff0c;将更长时间维持利率不变&#xff0c;必要时进一步收紧政策。 尽管在前不久公布的4月CPI数据显示通胀有所缓解&#xff0c;但是被认为…

高刚性滚柱直线导轨有哪些优势?

滚柱导轨是机械传动系统中用于支持和引导滑块或导轨的装置&#xff0c;承载能力较高、刚性强及高精度等特点。特别适用于大负载和高刚性的工业设备&#xff0c;如机床、数控机床等设备&#xff0c;这些优势使其在工业生产和机械设备中得到了广泛的应用。 1、高精度&#xff1a;…

如何用java做一个模拟登录画面

要求&#xff1a; 实现registerAction方法中的注册逻辑。实现login方法中的登录逻辑&#xff0c;确保只有当用户名和密码都正确时才返回true。实现好友管理功能&#xff0c;包括添加好友、删除好友、查看好友列表。确保所有的文件操作&#xff08;如读取和写入credentials.txt…

Jenkins安装 :AWS EC2 Linux

1 JDK11 install # 用的yum安装 # 压缩包安装&#xff0c;下载的jdk-11.0.22_linux-x64_bin.tar.gz在EC2解压&#xff0c;配置环境变量&#xff0c;运行jenkins的时候会报错$ yum -y list java-11* Available Packages java-11-amazon-corretto-devel.x86_64 …