dockerfile部署前后端(vue+springboot)

news2025/1/19 14:32:52

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

文章目录

  • 前言
  • 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 {
	 # 提供服务的端口,默认80
        listen       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.html
        location = /50x.html {
		# 指定对应的站点目录为html
            root   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工具进行容器的批量运行,将前后端的部署工作也放到一起。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tomcat使用教程

下载地址:https://tomcat.apache.org/ 配置环境变量 变量名: CATALINA_HOME 变量值: D:\tools\apache-tomcat-9.0.97 Path: %CATALINA_HOME%\bin 启动Tomcat(打开命令提示符) startup.bat 解决乱码问题(打开conf\logging.properties) java.util.logging.Conso…

vim实用命令整理(常用的命令)

本章教程,总结自己平时使用vim过程中,经常使用的命令,分享给大家。 一、高频使用 i:进入插入模式(光标处插入) a:进入插入模式(光标后插入) esc:返回普通模式 ::进入命令模式 :w:保存 :q:退出 :wq:保存并退出 :q!:强制退出不保存 :e filename:打开文件 :set n…

UiPath API接口说明

Swagger网址 私有云网址(企业版) https://企业/swagger/index.html 公有云网址(社区版) https://cloud.uipath.com/linan/LinanZhang/orchestrator_/swagger/index.html#/ 常见问题 Swagger页面测试请求时报错“You are not a…

17. Threejs案例-Three.js创建多个立方体

17. Threejs案例-Three.js创建多个立方体 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 WebGL 场景的核心类。它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选…

【解决pycharm下site-packages文件标记为红色的问题】

怎么解决pycharm下site-packages文件标记为红色的问题 这是一个pycharm无法识别本地site-packages问题答案解释器设置路径如下: 这是一个pycharm无法识别本地site-packages问题 最近正在搭建一个python3requestsunittestHTMLTestRunner接口测试框架,发现…

高中数学:计数原理-排列组合

文章目录 一、排列排列数例题 二、组合组合数例题 三、使用方法总结 一、排列 排列数 例题 二、组合 组合数 例题 三、使用方法总结 组合:从n个元素中抽取m个元素,不排序,则用组合计算 排列:从n个元素中抽取m个元素,再…

软件设计师下午题知识点

下午题一:数据流图DFD 数据流图平衡原则 此题注意两个平衡: 1、父图与子图的平衡(顶层图、0层图);2、子图内平衡)遵循自顶向下,从抽象到具体 结构化分析 在结构化分析方法中,数…

C++哈希(一)

1.底层结构 顺序结构以及平衡中,元素关键码与其存储位置之间没有相对应的关系,因此在查找一个元素时,要经过关键码的多次比较。顺序查找的时间复杂度为O(N)。 理想的搜索方法:可以不经过比较,依次直接从表中直接搜索…

Open-webui:本地化管理AI大模型

Open WebUI 是一个开源的用户界面工具,用于运行和管理大语言模型 (LLM) 及其他人工智能功能。它的主要目的是简化人工智能模型的本地部署和操作,让用户能够方便地通过浏览器界面与各种 AI 模型进行交互。 官方地址:https://github.com/open-…

1 数据库(上):MySQL的概述和安装、SQL简介、IDEA连接数据库使用图形化界面

文章目录 前言一、数据库相关的概念二、MySQL概述1 MySQL的安装和配置2 MySQL登录、退出(1)mysql -uroot -p1234 或者mysql -uroot -p ---- 登录(2)exit或者quit ---- 退出 3 远程登录服务器上的MySQL命令mysql -hip地址 -P3306 -…

Elasticsearch:使用硬件加速的 SIMD 指令实现超快 BBQ

作者:来自 Elastic Chris Hegarty 我们如何使用硬件加速 SIMD(Single Instruction Multiple Data - 单指令多数据)指令优化 BBQ 中的向量比较。 随着我们继续致力于让 Elasticsearch 和 Apache Lucene 成为存储和搜索向量数据的最佳场所&…

面经自测——死锁/死锁的必要条件/死锁的预防/进程通信的方式

前言 本文是作者专门用来自测Java后端相关面试题的,所有问题都是在牛客、知识星球或网上找到的最近最新的面试题,全文回答都是作者按自己的真实水平仿照真实环境的回答,所以答案不一定真实(但回答一定真诚🤣&#xff0…

通过电路指纹攻击发现洋葱服务

文章信息 论文题目:Discovering onion services through circuit fingerprinting attacks 期刊(会议): High-Confidence Computing 时间:2023 级别:CCF C 文章链接:https://www.sciencedir…

[每周一更]-(第126期):MQ解耦场景

消息队列(MQ)解耦是一种软件架构设计模式,主要通过中间件将系统中的生产者和消费者模块分离,减少模块之间的直接依赖,使系统具有更高的扩展性和灵活性。这种模式尤其适用于需要处理复杂业务逻辑、频繁请求或异步处理的…

flinkSql 将流和表的互相转换

流——>表 方式一 方式二 方式一&#xff1a;写sql DataStreamSource<String> source env.socketTextStream("localhost", 8881); // 表名&#xff0c;流&#xff0c;字段名称 tableEnv.createTemporaryView("t_1",source&#xff0c;$("…

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

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

SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测

之前和很多群友聊天发现对2016的无域和负载均衡满心期待&#xff0c;毕竟可以简单搭建而且可以不适用第三方负载均衡器&#xff0c;SQL自己可以负载了。windows2016已经可以下载使用了&#xff0c;那么这回终于可以揭开令人憧憬向往的AlwaysOn2016 负载均衡集群的神秘面纱了。 …

vue3+elementPlus封装的数据过滤区

目录结构 源码 index.vue <template><el-form class"mb-5" :rules"rules" :model"queryForm" ref"queryDOM" label-width"80"><el-row :gutter"20"><slot></slot><el-col cla…

iOS如何自定义一个类似UITextView的本文编辑View

对于IOS涉及文本输入常用的两个View是UITextView和UITextField&#xff0c;一个用于复杂文本输入&#xff0c;一个用于简单文本输入&#xff0c;在大多数开发中涉及文本输入的场景使用这两个View能够满足需求。但是对于富文本编辑相关的开发&#xff0c;这两个View就无法满足自…

《黑神话:悟空》闪退,提示D3D12崩溃,游戏崩溃无法启动是什么原因?要怎么解决?

《黑神话&#xff1a;悟空》闪退、D3D12崩溃及游戏无法启动&#xff1a;原因、解决方案与预防措施 作为一名软件开发从业者&#xff0c;我深知电脑游戏运行时可能遇到的各种问题&#xff0c;尤其是像《黑神话&#xff1a;悟空》这样的高品质游戏&#xff0c;其对硬件和系统配置…