当前位置: 首页 > news >正文

dockerfile部署前后端(vue+springboot)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 0.环境说明和准备
  • 1.前端多环境打包
    • 1.1前端多环境设置
    • 1.2打包
  • 2.后端项目多环境配置以及打包
    • 2.1后端多环境配置
    • 2.2项目打包
  • 3.文件上传
  • 4.后端镜像制作
    • 4.1dockerfile编写
    • 4.2构建镜像
    • 4.3容器允许
  • 5.前端镜像制作
    • 5.1nginx配置文件
    • 5.2dockerfile文件编写
    • 5.3构建镜像
    • 5.4容器运行
    • 5.5测试
  • 总结


前言

本篇文章,用来记录如何将一个springboot+vue开发的项目部署到云服务器上。分别打包前后端为一个镜像,方便以后再次部署。


0.环境说明和准备

我们会有一台云服务器,并且在上面安装配置好了宝塔面板(很多提供商都提前装好的),然后安装好了docker工具。

登录并访问宝塔页面,我们先选择安装推荐设置:
在这里插入图片描述

在这里插入图片描述
环境安装好后,我们先要将项目打包。
不管是前端还是后端项目,都有多环境的配置,允许我们在不同的场景间切换配置,接下来,我们看看前后端分别如何完成多环境切换并且打包的。

1.前端多环境打包

1.1前端多环境设置

这里简单提一下前端如何进行多环境设置
前端对于vue项目来说,我们要使用多环境,就会为每个环境编写.env文件。然后在执行vue-cli的打包命令时额外通过–mode参数来指定要激活的环境。
然后在打包后的文件中,加载的数据就是对应的.env文件中的数据。

1.2打包

设置好多环境后,我们先使用vue-cli工具将项目打包,命令是vue-cli-service build,可以先在package.json文件中进行封装:
在这里插入图片描述

  • 执行完成后会生成一个dist文件夹来存放我们打包好的文件。

  • 打包时不指定mode则我们默认读取的是.dev.production这个环境配置文件。
    然后我们可以得到打包后的dist文件夹
    在这里插入图片描述

2.后端项目多环境配置以及打包

2.1后端多环境配置

这里也只是简单提一下:
大体来说就是,提供多个application-环境名,的配置文件来进行不同环境下的配置。
然后在主要配置文件(application.yml)下使用spring.profiles.active配置项目来指定当前启用的环境

2.2项目打包

我们使用maven打包
在这里插入图片描述

3.文件上传

打包好后,就可以将打包好的前端dist目录和后端jar包上传到服务器(FTP或其他工具都可以),这里使用宝塔面板的话直接使用它提供的上传功能即可。
在这里插入图片描述

4.后端镜像制作

4.1dockerfile编写

我们先制作后端的镜像,首先我们需要先拿到一个JDK的镜像作为基础镜像,这个JDK的版本要和项目需求的版本相符。
我们在与jar包同级的目录中创建dockerfile文件,并编写其内容如下

FROM openjdk:17
WORKDIR /app
//这里SPRING_ENV就是环境变量名,对应项目配置文件中${}中的内容,
//设置了一个默认值dev, 代表默认情况下以开发模式下的配置执行
ENV SPRING_ENV=dev
COPY myproject.jar /app
EXPOSE 9090
CMD ["java", "-jar", "myproject.jar"]

如果是在多环境下,要做到能够在运行容器时切换环境,那么需要使用环境变量
首先,在项目的配置文件中应该将激活环境的配置项的值修改为从环境变量获取
在这里插入图片描述

4.2构建镜像

然后我们使用docker build命令构建镜像
在这里插入图片描述
然后我们可以看到镜像构建完成:
在这里插入图片描述

4.3容器允许

下来就可以使用docker run命令来运行容器了,为了方便展示,使用-it参数让其展示运行效果在界面上:
docker run -it -p 9090:9090 --name bootproject myprojectimage:latest
在这里插入图片描述
至此,后端部署完成,然后去服务器防火墙配置中将9090端口放行即可。

5.前端镜像制作

5.1nginx配置文件

我们要使用nginx服务器部署项目,那么我们要先编写好nginx的配置文件。
我们在dist同级的目录下创建好nginx.conf文件(为了方便也可以在自己电脑中编写好后再上传到服务器),在里面配置好端口、项目路径、ip等。以下是这次的配置文件:

# nginx进程数
worker_processes  1;
# 事件区块
events {
# 单个进程最大连接数worker_connections  1024;
}
# 设定http服务器
http {#include:导入外部文件mime.types,将所有types提取为文件,然后导入到nginx配置文件中include       mime.types;#默认文件类型default_type  application/octet-stream;#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。sendfile        on;#长连接超时时间,单位是秒keepalive_timeout  65;# 第一个Server区块开始,表示一个独立的虚拟主机站点server {# 提供服务的端口,默认80listen       9528;# 提供服务的域名主机名server_name  localhost;#服务默认启动目录root   G:/nginx-1.26.2/html/dist;# 默认的首页文件,多个用空格分开index index.html;location / {try_files $uri $uri/ /index.html;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}server {listen       9529;server_name  localhost;root   G:/nginx-1.26.2/html/distdev;index index.html;location / {try_files $uri $uri/ /index.html;}# 错误页面路由# 出现对应的http状态码时,使用50x.html回应客户error_page   500 502 503 504  /50x.html;# location区块开始,访问50x.htmllocation = /50x.html {# 指定对应的站点目录为htmlroot   html;}}
}

这里我将不同环境打包生成的dist目录分别配置在两个server配置中,为其分配不同端口,server_name改为自己的服务器名
需要注意的是,对于vue项目而言,需要额外配置访问根路径时的文件匹配规则,也就是:

location / {try_files $uri $uri/ /index.html;}

5.2dockerfile文件编写

接下来,来编写dockerfile文件,内容如下
在这里插入图片描述

  • 因为我们在nginx中分别为不同环境的项目包配置了不同的server所以这里也要暴露两个端口。

  • 然后将项目目录和nginx配置文件分别放到指定位置(nginx的配置目录和项目目录)

5.3构建镜像

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

5.4容器运行

在这里插入图片描述

5.5测试

我访问服务器对应前端接口,发现页面错误
在这里插入图片描述
查看日志,报错信息如下:
在这里插入图片描述
表示发生了重定向循环
于是开始排查问题

我们可以使用 docker exec -i -t 容器id /bin/bash来与容器的linux进行交互
在这里插入图片描述
可以看到,使用该命令我们可以进入容器的linux系统中(每个容器都可以当作是一个小的linux系统)
然后我们分别进入存放项目文件和nginx配置文件的路径中查看,发现容器中并不存在我们的dist目录。
说明,我们本地的项目文件并没有被成功的放到容器中,于是通过docker cp命令在容器运行时手动复制项目文件到容器中,解决问题。
在这里插入图片描述


总结

本文章是对一个简单的项目部署流程的记录。现在有了前后端镜像后,可以进一步使用docker compose工具进行容器的批量运行,将前后端的部署工作也放到一起。

相关文章:

dockerfile部署前后端(vue+springboot)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言0.环境说明和准备1.前端多环境打包1.1前端多环境设置1.2打包 2.后端项目多环境配置以及打包2.1后端多环境配置2.2项目打包 3.文件上传4.后端镜像制作4.1dockerf…...

c语言的思维导图

之前已经全部学完c语言了,所以为了更好的复习回顾,我做了一份c语言超详细的思维导图,帮助实现一张图就可以复习,避免盲目, 由于平台不支持直接发上图,有想要的小伙伴,可以私信找我要原件...

Android 拍照(有无存储权限两种方案,兼容Q及以上版本)

在某些行业,APP可能被禁止使用存储权限,或公司在写SDK功能,不方便获取权限 所以需要有 无存储权限拍照方案。这里两种方案都列出里。 对于写入权限,在高版本中,已经废弃, 不可用文件写入读取权限&#xf…...

MongoDB在自动化设备上的应用示例

发现MongoDB特别适合自动化检测数据的存储。。。 例如一个晶圆检测项目&#xff0c;定义其数据结构如下 #pragma once #include <vector> #include <QString> #include <QRectF> #include <string> #include <memory>class tpoWafer; class tp…...

draggable插件——实现元素的拖动排序——拖动和不可拖动的两种情况处理

最近在写后台管理系统的时候&#xff0c;遇到一个需求&#xff0c;就是关于拖动排序的功能。 我之前是写过一个关于拖动表格的功能&#xff0c;此功能可以实现表格中的每一行数据上下拖动实现排序的效果。 vue——实现表格的拖拽排序功能——技能提升 但是目前我这边的需求是…...

Redux的使用

到如今redux的已经不是react程序中必须的一部分内容了&#xff0c; 我们应该在本地需要大量更新全局变量时才使用它! redux vs reducer reducer的工作机制&#xff1a; 手动构造action对象传入dispatch函数中 dispatch函数将 action传入reducer当中 reducer结合当前state与a…...

【JAVA】Java高级:多数据源管理与Sharding:数据分片(Sharding)技术的实现与实践

大规模分布式系统&#xff0c;数据存储和管理变得越来越复杂。随着用户数量和数据量的急剧增加&#xff0c;单一数据库往往难以承载如此庞大的负载。这时&#xff0c;数据分片&#xff08;Sharding&#xff09;技术应运而生。数据分片是一种将数据水平切分到多个数据库实例的技…...

ASP.NET Core 9.0 静态资产传递优化 (MapStaticAssets )

一、结论 &#x1f4a2;先看结论吧&#xff0c; MapStaticAssets 在大多数情况下可以替换 UseStaticFiles&#xff0c;它已针对为应用在生成和发布时了解的资产提供服务进行了优化。 如果应用服务来自其他位置&#xff08;如磁盘或嵌入资源&#xff09;的资产&#xff0c;则应…...

LeetCode刷题day18——贪心

LeetCode刷题day18——贪心 135. 分发糖果分析&#xff1a; 406. 根据身高重建队列分析&#xff1a;for (auto& p : people) 昨天写了一道&#xff0c;今天写了一道&#xff0c;都有思路&#xff0c;却不能全整对。昨天和小伙伴聊天&#xff0c;说是因为最近作业多&#xf…...

MATLAB Simulink® - 智能分拣系统

系列文章目录 前言 本示例展示了如何在虚幻引擎 环境中对四种不同形状的标准 PVC 管件实施半结构化智能分拣。本示例使用 Universal Robots UR5e cobot 执行垃圾箱拣选任务&#xff0c;从而成功检测并分类物体。cobot 的末端执行器是一个吸力抓手&#xff0c;它使 cobot 能够拾…...

linuxCNC(五)HAL驱动的指令介绍

HAL驱动的构成 指令举例详解 从终端进入到HAL命令行&#xff0c;执行halrun&#xff0c;即可进入halcmd命令行 # halrun指令描述oadrt加载comoonent&#xff0c;loadrt threads name1 period1创建新线程loadusr halmeter加载万用表UI界面loadusr halscope加载示波器UI界面sho…...

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期

需求分析 上一个案例我们输出了PWM波&#xff0c;这个案例我们使用输入捕获功能&#xff0c;来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑&#xff0c;检查测试的结果。 如何测量 1、输入捕获功能主要是&#xff1a;测量输入通道的上升沿和下降沿 2、让第一个…...

第一节、电路连接【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍如何搭建一个51单片机TB6600驱动器步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机最小控制系统 ②USB转TTL模块 ③开关电源 ④TB6600步进电机驱动器 ⑤二相四线步进电机 ⑥电…...

【通俗理解】Koopman算符与非线性动力系统分析

【通俗理解】Koopman算符与非线性动力系统分析 关键词&#xff1a; #Koopman算符 Koopman Operator #非线性动力系统 Nonlinear Dynamical System #无穷维线性算子 Infinite-Dimensional Linear Operator #演化分析 Evolution Analysis #Bernard Koopman Bernard Koopman 第…...

mybatis plus打印sql日志

1、官方文档 使用配置 | MyBatis-Plus 2、日志实现 MyBatis-Plus 提供了多种日志实现&#xff08;log-impl&#xff09;&#xff0c;用于记录 SQL 语句和相关操作&#xff0c;帮助开发者进行调试和监控数据库操作。以下是一些可用的日志实现及其说明&#xff1a; StdOutImpl…...

ObjectMapper

ObjectMapper 是 Jackson 库中非常重要的一个类&#xff0c;它是 JSON 和 Java 对象之间进行序列化与反序列化的核心工具。ObjectMapper 的底层实现是基于 Jackson 的数据绑定模型&#xff0c;它将 Java 对象与 JSON 数据转换为互通格式。 1. ObjectMapper 的设计与核心功能 O…...

新增白名单赋予应用安装权限

目录 相关问题 具体实现 相关问题 安装app到/data/分区时&#xff0c;如何在安装阶段就赋予权限&#xff0c;无需请求权限 具体实现 frameworks/base/core/res/res/values/config.xml <!-- For whitelis apk --><string-array translatable"false" nam…...

传奇996_51——脱下装备,附加属性设为0

奶奶的lua怎么都修改不了&#xff0c;可以调用txt的 ; LINKPICKUPITEM ; ChangeitemaddvaLue -1 5 0 ; GETITEMADDVALUE 3 5 M10 ; SENDUPGRADEITEM ; SENDMSG 9 你的衣服附加了<$STR(M10)>点防御属性. 或者lua callscriptex(actor,“LINKPICKUPITEM”) callscriptex(…...

【Mac】安装Gradle

1、说明 Gradle 运行依赖 JVM&#xff0c;需要先安装JDK&#xff0c;Gradle 与 JDK的版本对应参见&#xff1a;Java Compatibility IDEA的版本也是有要求Gradle版本的&#xff0c;二者版本对应关系参见&#xff1a;Third-Party Software and Licenses 本次 Gradle 安装版本为…...

MySQL中的redoLog

在数据库系统中&#xff0c;redo log&#xff08;重做日志&#xff09;用于记录所有已提交事务的修改操作&#xff0c;它的主要目的是确保在系统崩溃或故障后&#xff0c;能够恢复数据库到崩溃前的状态。Redo log 记录的是事务修改的数据的具体操作&#xff0c;而不是数据本身。…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...