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

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...