若依前后端分离项目部署(使用docker)

若依前后端分离项目部署(使用docker)

文章目录

由于之前做若依的二次开发项目,项目完成之后想部署到云服务器,折腾了好久才部署成功,所以总结下来,希望能帮到大家。

这里是使用docker进行部署的,如果想用别的方式部署,就需要友友网上再找找了。

这里做个规定:下面说到使用零件的意思就是使用下面我给出的资料,在对应资料有说明,友友要记得看,修改成自己的项目情况。

一、搭建后端

1.1 搭建流程:

  1. 首先需要把后端项目需要的程序先搭建好,如 mysql,redis(使用零件)
  2. 创建网桥(推荐根据项目命名),把mysql,redis和nginx(后面前端布置,现在先不用)放在一起
  3. 打包后端项目(后端项目的mysql和redis对应配置文件记得修改,如果放在一个网桥里面,可以使用网桥名称 )。
image-20241223094433308
  1. 在云服务器里面单独开一个文件夹(推荐使用项目相关名称命名),把后端项目上传到文件夹里面.(优点:便于管理)
  2. 在文件夹里面创建Dockerfile文件,填入对应零件内容(使用零件)
image-20241223090605902
  1. 构建镜像(使用零件)
  2. 创建后端容器(使用零件)

1.2 后端零件:

1.2.1 mysql容器创建:

这里设置的mysql密码为123,有需要的友友自己修改一下。

docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ -v ./mysql/data:/var/lib/mysql \ -v ./mysql/conf:/etc/mysql/conf.d \ -v ./mysql/init:/docker-entrypoint-initdb.d \ mysql 

1.2.2 redis容器创建:

这里设置的redis密码为123456,有需要的友友自己修改一下。

docker run -d \ --name redis \ -p 6379:6379 \ -e REDIS_PASSWORD=123456 \ redis:latest \ 

1.2.3 Dockerfile内容:

openjdk 是jdk的版本,这里使用的是jdk11,如果想使用其它版本可以自己改,一般直接用11也是可以的。

这里需要修改的就是xxx部分,修改成自己后端项目的名称,其它的不用改。

# 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY xxxxx.jar /app.jar # 入口 ENTRYPOINT ["java", "-jar", "/app.jar"] 

1.2.4 构建项目镜像:

注意:构建镜像需要看完下面的解释之后再进行操作,一定一定。

docker build -t 镜像名称 .
  1. . 表示Dockerfile文件路径就在当前路径。例如下图:自己在 root/dkd 中,Dockerfile 文件也在 root/dkd 中就可以使用.
  2. 镜像名称无所谓,最好其和项目有关的。
  3. 后端项目需要放在和Dockerfile相同的文件夹里面。
  4. 基本和下图一样(项目名称不一样),除了 mysql,mysql 不需要创建在哪里(那里是错误的),mysql的数据我们使用客户端工具连上自己加。
image-20241217161210265

1.2.5 创建后端容器:

docker run -d \ --name 容器名(自己指定) \ -p 8080:8080 \ --network 网桥名 \ 镜像名(前面构建的) 

二、前端搭建:

2.1 搭建流程:

  1. nginx 容器创建(使用零件),记得放到网桥里面。
  2. 打包前端项目,生成 dist 文件(前端项目所在位置)。

下图为如何打包

image-20241217154852338

下图为 dist 所在文件夹(在项目文件夹里面):

image-20241217165805588
  1. 把 dist 里面的所有内容拷贝到/var/lib/docker/volumes/html/_data 目录里面
image-20241217170127979
  1. 修改/var/lib/docker/volumes/conf/_data/ 文件夹里面的 nginx.conf 文件(直接贴零件,稍加修改)。
image-20241217170247293
  1. 最后不要忘记要重启 nginx 容器刷新配置。

2.2 前端零件:

不一定都会用到。

2.2.1 nginx 容器创建:

一般不用改。

docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html -v conf:/etc/nginx nginx 

2.2.2 nginx.conf 文件:

注意:下面有些要修改成自己项目的。

user root; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; server { listen 80; server_name 159.75.xxx.145(记得切换); location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; #防止刷新报404 # try_files $uri $uri/ /index.html; } # location /prod-api/{ # proxy_set_header Host $http_host;ls # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header REMOTE-HOST $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_pass http://159.75.xxx.145:8080/; # } location /prod-api/{ proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://dkd-project(记得切换):8080/; } location /dev-api/{ proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://dkd-project(记得切换):8080/; } } include /etc/nginx/conf.d/*.conf; } 

2.2.3 nginx html 数据卷所在位置:

/var/lib/docker/volumes/html/_data 

2.2.4 nginx conf 数据卷所在位置:

/var/lib/docker/volumes/conf/_data/ 

三、总结

3.1 后端:

最好要把后端项目分成开发和上线两个部分(打包的时候记得切换到上线部分)。

只要把mysql(数据要有)和redis先搭建好,后端自己制作镜像创建容器即可,注意点就是,项目访问mysql和redis是通过网桥来访问的,好处可以少开放一点端口,加快访问速度。

后端构建镜像需要Dockerfile文件。

3.2 前端:

首先创建nginx容器(要把conf和html文件,挂载出来)。

前端项目基本不用动。

把dist里面的文件放入html/_data里面。

配置conf文件。

最后要把nginx放到网桥里面。

结语:
其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话,还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

在这里插入图片描述

Read more

[安卓] Kotlin中的架构演进:从MVC到MVVM

从Java到Kotlin,不仅仅是语法的升级,更是架构思维的进化。本文将带你全面掌握Kotlin在Android开发中三种核心架构模式:MVC、MVP、MVVM,揭示如何用Kotlin特性写出更优雅的架构代码。 引言:为什么Android开发者需要架构模式? 如果你有过Java Android开发经验,一定遇到过这些问题:Activity/Fragment代码臃肿(动辄上千行)、业务逻辑与UI逻辑混杂、测试困难、代码难以维护。架构模式正是为了解决这些问题而生的。而Kotlin,以其简洁的语法和强大的特性,让这些架构模式的实现变得更加优雅。 让我们从一个真实案例开始——用户登录模块,看看在不同架构模式下的演变: // 糟糕的无架构代码(Java风格)class BadLoginActivity :AppCompatActivity(){privatelateinitvar editUsername: EditText privatelateinitvar editPassword: EditText privatelateinitvar buttonLogin: Button

By Ne0inhk
【Kafka进阶篇】深入Kafka内部:日志存储的设计思路,藏着中间件高性能的真相

【Kafka进阶篇】深入Kafka内部:日志存储的设计思路,藏着中间件高性能的真相

🍃 予枫:个人主页 📚 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 💻 Debug 这个世界,Return 更好的自己! 引言 做分布式开发的同学,几乎都用过Kafka,但多数人只停留在“生产者发消息、消费者收消息”的表层使用,很少深究:百万级消息并发下,Kafka如何快速定位目标消息?底层的.log、.index、.timeindex文件各司其职,又是如何配合实现高效读写的?今天就从物理层面拆解Kafka日志存储与索引机制,吃透这部分,不仅能搞定面试难点,更能在生产环境中精准优化Kafka性能。 文章目录 * 引言 * 一、前言:为什么要搞懂Kafka日志与索引机制? * 二、核心前提:Kafka日志的“分段存储”设计 * 三、深度拆解:三种核心文件的作用与结构 * 3.1 .log文件:消息的“真正存储载体” * 关键细节: * 3.2

By Ne0inhk

PostgreSQL:详解 PostGIS 地理信息数据处理

更多内容请见: 《深入掌握PostgreSQL数据库》 - 专栏介绍和目录 文章目录 * 一、PostGIS 简介 * 1.1 什么是 PostGIS? * 1.2 PostGIS 能做什么? * 二、安装与启用 PostGIS * 2.1 安装方式(以 Ubuntu 为例) * 2.2 验证安装 * 三、核心数据类型 * 3.1 geometry(几何类型) * 3.2 geography(地理类型) * 3.3 常见几何子类型(OGC 标准) * 四、空间数据表示与输入 * 4.1 WKT(Well-Known Text)

By Ne0inhk
Flutter 组件 fam 适配鸿蒙 HarmonyOS 实战:文件资产监控,构建分布式媒体管理与全场景资源分发治理架构

Flutter 组件 fam 适配鸿蒙 HarmonyOS 实战:文件资产监控,构建分布式媒体管理与全场景资源分发治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 fam 适配鸿蒙 HarmonyOS 实战:文件资产监控,构建分布式媒体管理与全场景资源分发治理架构 前言 在鸿蒙(OpenHarmony)生态迈向万物智联、涉及海量分布式文件同步、社交应用图片即时刷新及严苛的沙箱存储审计背景下,如何实现一套既能覆盖系统级文件变动感知、又能保障低功耗运行且具备“亚秒级”事件回调能力的“文件监控中心”,已成为决定应用数据发现速率与存储交互稳健性的基石。在鸿蒙设备这类强调分布式文件系统(HMDFS)协同且存储分区高度隔离的场景下,如果应用依然采用低效的定时轮询扫描,由于由于 I/O 资源的无效损耗,极易由于由于“电量泄露”导致鸿蒙应用在后台由于由于由于由于后台任务限制而被系统强制挂起。 我们需要一种能够解耦物理路径、支持递归监听且符合鸿蒙事件驱动模型的文件监控方案。 fam(File Asset Monitor)为 Flutter 开发者引入了“存储感知”范式。它不是简单的 File 操作扩展,

By Ne0inhk