当前位置: 首页 > 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;而不是数据本身。…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...