docker 部署前、后端分离项目详细步骤(从打包到部署)

        在平常的开发工作中,一个项目经历需求、开发、测试、上线等步骤。在开发测试完成后,我们需要部署测试环境、生产环境等,那么我们用 docker 方式应该怎么部署呢?前后端分离的项目又该如何部署呢?那么,今天我们总结下前后端分离项目从打包到部署的详细步骤。

     一:安装所需软件

        安装项目所需软件,如安装 mysql、redis、nacos等,这些安装方式在前面已经写过,这里不再赘述,安装步骤博客如下:

        1:docker 安装 mysql 详解_本机连接docker mysql-CSDN博客

        2:docker 安装 nginx 详解_docker 拉取nginx-CSDN博客

        3:docker 安装 redis 详解_docker 安装redis-CSDN博客

        4:docker 安装 Rabbitmq 详解_docker 安装rabbitmq-CSDN博客

        5:docker 安装 MinIO 步骤详解_docker minio-CSDN博客

     二:前端打包

        1:修改 .env.deployment 配置文件接口调用配置,用于部署环境的环境变量配置文件,通常与 .env 文件类似,但专门针对部署阶段(如生产环境、预发布环境等)的特定配置,如图:

        2:项目打包:npm run build,在 npm run build 时可以添加一些参数来调整打包。例如在 Vue CLI 项目中:npm run build -- --mode development:指定以开发模式进行打包。

        当看到控制台输出如下信息时,表示打包成功:

        打包成功,前端项目包如图所示:

     三:后端打包

        1:修改数据库信息为对应数据库,数据库配置一般在 application.yml 文件中配置。一般项目中会有多个配置文件,如 dev 开发环境、test 测试环境、prod 生产环境配置文件等,一定要注意每种配置文件中对应的数据库信息正确。如:

        2:如果需要修改部署在服务上项目的端口信息,在 application.yml 中修改端口信息,如:

        3:先点击 clean,然后点击 package 打包,操作如图所示:

     四:构建后端服务镜像

        1:编写 Dockerfile文件,Dockerfile 是一种纯文本文件,文件命名就是 “Dockerfile”,用来构建 Docker 镜像的文本文件,包含了一系列的指令和参数。通过 Dockerfile 构建的镜像可以保证开发环境、测试环境和生产环境的镜像一致,避免了换机器不能运行的问题。通过指令可以自动构建镜像。Dockerfile 可以与 Jenkins 等集成,实现自动化构建和部署。

# 使用OpenJDK 17基础镜像
FROM openjdk:17
# 创建一个名为/litemall/logs的目录
RUN mkdir -p /litemall/logs
# 切换工作目录
WORKDIR /litemall
# 配置环境变量
ENV SERVER_PORT=8085 \LANG=C.UTF-8 \LC_ALL=C.UTF-8# 暴露应用端口
EXPOSE 8085# 添加应用Jar包到容器中
ADD litemall-wx-api-0.1.0.jar ./app.jar# 设置启动命令
ENTRYPOINT ["java", \"-Dserver.port=${SERVER_PORT}", \"-Xlog:gc*:time,tags,level", \"-XX:+UseZGC", \"-jar", "app.jar"]

        2:docker build -t  镜像名:tag  .  如:docker build -t litemall-all:v1.0 . ,编写完 Dockerfile 文件后,这个时候就可以构建镜像了。注意版本后面有个 空格 点。使用点 . :表示使用当前目录下的 Dockerfile,如果不加这个点,Docker 不会知道从哪里获取 Dockerfile。镜像构建完成后,可以使用 docker images 查看生成的镜像。
  
          查看镜像:docker images
    

    五:启动后端服务

      1:编写后端服务 docker-compose.yml 文件。启动容器,可以直接用docker run  后面接一堆指令启动,也可以用 docker-compose.yml 文件管理指令,docker compose 是定义和运行多容器 Docker 应用的工具,用 docker compose 命令启动,这样更加的便捷。

services:litemall-all:image: litemall-all:v1.0container_name : litemall-allenvironment:- SERVER_PORT=8085- JAVA_OPTS="-Xmx2g -Xms2g" - TZ=Asia/Shanghairestart: alwaysnetwork_mode: "host"

        2:启动后端服务  docker compose up -d 命令,docker compose up 是阻塞窗口的,带上 -d 是非阻塞的。docker compose up -d 启动,可以更方便的管理启动命令。
        遇到的问题:
        报错 1 如下:下载镜像报错

    解决方法:
    修改 /etc/daemon.json文件中镜像加速器配置,如果遇见下载镜像错误,基本都是这种解决方法。但是修改了好久镜像加速器配置,就是没有解决,一直以为是加速器没有配置对,导致问题,后面发现是 docker-compose.yml 中 image 镜像名称写错了,所以导致下载镜像一直失败,Dockerfile 文件中的镜像,如图:
   

     报错 2 如下:无法找到运行的主类

  解决方法:找到服务所在模块的 pom.xml 中如下配置:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><id>repackage</id><configuration><executable>true</executable><classifier>exec</classifier></configuration> </execution></executions></plugin></plugins>
</build>

 将 <execution> 标签中的内容改为如下,即可解决:

<goals><goal>repackage</goal><goal>build-info</goal>
</goals>

        4:测试后端服务
        在服务器上执行:curl -v http://localhost:8085/wx/auth/login  后面接口为后端服务中的接口,查看返回信息,如果返回 200,则表示接口调用成功;如果连接失败,-v 会显示错误详情(如 Connection refused 表示端口未监听)。

     六:nginx 配置

        1:编写 nginx.conf 文件,主要作用是将 Nginx 服务器配置为监听 6255 端口,处理前端静态资源请求和后端接口请求,通过反向代理将以 /wx/ 开头的请求转发到 http://localhost:8085 后端服务器。

user  nginx;
worker_processes  auto;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;autoindex on;keepalive_timeout  65;server {listen 6255;server_name localhost;charset utf-8;# 处理前端静态资源请求location / {root  /usr/share/nginx/html;index index.html index.htm;}# 处理后端接口请求location /wx/ {proxy_pass http://localhost:8085;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}

        2:编写 docker-compose.yml 文件,定义了使用镜像及版本,容器名称、环境配置及端口映射,挂载了宿主机目录等,使用 docker-compose.yml 文件,可以更好的管理启动命令,方便使用。

services:nginx:image: nginx:latestcontainer_name: nginx-litemall-testenvironment:TZ: Asia/Shanghaiports:- "8085:8085"volumes:# 配置文件映射- /litemall/nginx/conf/nginx.conf:/etc/nginx/nginx.conf- /litemall/nginx/conf:/etc/nginx/conf# 页面目录- /litemall/html/dist:/usr/share/nginx/htmlprivileged: truenetwork_mode: "host"

        3:启动 nginx,用  docker compose up 启动,可以实时看到启动日志。可以 docker ps 查看是否启动成功。

        4:遇到的问题:访问报 404,如下:
  
   nginx 报错如下:无法打开 /html 文件夹,没有此文件或者目录
    
    解决方法:搜了好多方法,基本都是说文件夹权限问题,chmod 修改文件夹权限,各种修改权限,看目录路径是否正确,修改了好久,没有解决,后面发现是 nginx.conf 中
前端文件目录写的是宿主机的文件目录,而不是容器的目录,所以导致一直找不到,
        修改前、后如下图:

        

        
        此处要注意:nginx 文件挂载目录映射位置:

        

     七:测试

        根据 http://xx.xx.xx.xx:6255 进行访问,访问页面如下:

        
        可能会遇到的问题:项目启动成功,访问失败,可以查看项目端口是否因没开防火墙导致无法访问。如果是,解决步骤如下:
        (1):查看防火墙开的端口:firewall-cmd --zone=public --list-ports
        (2):若端口未开,则添加,比如开放 8008 端口:firewall-cmd --zone=public --add-port=8008/tcp --permanent
        (3):修改完成后,重启防火墙:firewall-cmd --reload

     八:总结

        首先装需要的软件,如部署需要的 nginx、redis、rabbitmq、nacos、mysql等,接着就是 打前端包,打后端包,包打完之后,将包上传到服务器,构建后端服务镜像,编写启动后端服务 docker-compose.yml 文件。创建 nginx.conf 文件,nginx.conf 文件的配置 和 nginx 的 docker-compose.yml 文件中配置尤为重要,监听的端口,挂载文件目录,一定要注意书写正确,否则可能看着都没问题,但是就是访问失败。

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

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

相关文章

大语言模型理解一般需求到在专业领域中最大限度地发挥其效能的演变轨迹

在人工智能技术飞速发展的当下&#xff0c;大语言模型&#xff08;LLM&#xff09;凭借其强大的语言处理能力和广泛的应用潜力&#xff0c;成为了各行业关注的焦点。从最初的文本生成、简单问答&#xff0c;到如今在专业领域的深度应用&#xff0c;大语言模型与用户的交互模式正…

mindyolo填坑

1、按照gitee上的文档跑预测代码&#xff0c;跑不通 更改&#xff1a; 将predict.py复制到跟目录。如果是cpu&#xff08;本地测试比较常见&#xff09;&#xff0c;那么正确的命令行是&#xff1a; python predict.py --device_targetCPU --config ./configs/yolov7/yolov7.…

Python集合全解析:从基础到高阶应用实战

一、集合核心特性与创建方法 1.1 集合的本质特征 Python集合&#xff08;Set&#xff09;是一种​​无序且元素唯一​​的容器类型&#xff0c;基于哈希表实现&#xff0c;具有以下核心特性&#xff1a; ​​唯一性​​&#xff1a;自动过滤重复元素​​无序性​​&#xff…

【javascript】竞速游戏前端优化:高频操作与并发请求的解决方案

文章目录 前言一、性能痛点分析二、核心技术方案1.Web Worker2.Promise高级控制3.智能队列系统4.游戏化节流设计 三、最佳实践选择 前言 在竞速类网页游戏中&#xff0c;玩家高频点击与服务器实时交互会引发两大核心挑战&#xff1a; 客户端性能瓶颈&#xff1a;频繁操作导致…

Linux操作系统系统编程:x86-64架构下的系统调用

在Linux操作系统里&#xff0c;系统编程如同精密仪器的核心部件&#xff0c;掌控着系统运行的关键。而 x86-64 架构下的系统调用&#xff0c;更是连接用户空间程序与内核的关键桥梁。你可以把用户空间的程序想象成一个个 “工匠”&#xff0c;它们有着各式各样的需求&#xff0…

理解数据湖

目录 一、数据湖的定义与相关概念 二、数据湖出现的背景 三、数据湖关键技术 (一)存储技术

前端应用开发技术历程的简要概览

前端应用开发技术详解 一、萌芽期&#xff08;1990s - 2004&#xff09; 技术特征 HTML 3.2 / HTML 4.01 是主流版本。 样式用 CSS1/CSS2&#xff0c;但大部分样式写在 <style> 标签甚至行内。 动态效果主要通过 JavaScript 控制 DOM&#xff0c;兼容性极差。 代表事…

交换机配置DHCP

交换机配置DHCP 背景先关闭路由器的DHCPconsole口连接到交换机配置交换机 背景 路由器的dhcp分配IP地址变慢&#xff0c;怎么处理 先关闭路由器的DHCP 查看路由器中DHCP地址池范围; 关闭路由器的DHCP console口连接到交换机 协议Serial端口COMX波特率9600流控无 配置交换机…

解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南

解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南 前言 在开发Flutter应用时,经常会遇到Gradle构建卡在Running Gradle task assembleDebug阶段的问题。本文将分享如何通过配置华为云镜像和使用自定义脚本下载依赖的方法解决这些问题。…

AI驱动文字冒险游戏

github地址&#xff1a;https://github.com/thornbsj/ImmenseSimGame 虽然游戏比较简陋&#xff0c;但是由于笔者不想对游戏做过多的“剧透”&#xff0c;因此本文只粗略讲一下大致逻辑以及部分代码&#xff0c;有兴趣的朋友可以看上面的仓库获得更详细的部分。 一、状态机改…

springboot中有关数据库信息转换的处理

现代项目一般都是前后端分离的&#xff0c;前端只负责展示数据&#xff0c;不负责对数据处理&#xff0c;所以所有数据处理工作都由后端进行 比如在仿京东中的status&#xff0c;审核信息展示&#xff0c;数据库中是以0/1显示&#xff0c;但是前端需要以"审核/未审核&quo…

提示词版本化管理:AI开发中被忽视的关键环节

当我的提示词"消失"在团队协作中 上周五下午&#xff0c;我经历了一场小型"灾难"。作为一名AI产品经理&#xff0c;我花了整整三天精心打磨的客服机器人提示词&#xff0c;在周末更新后突然"失效"了。机器人不再能够准确识别用户意图&#xff0…

Centos Ubuntu RedOS系统类型下查看系统信息

文章目录 一、项目背景二、页面三、说明四、代码1.SysInfo2.EmsSysConfig3.HostInformationController4.HostInfo 一、项目背景 公司项目想展示当前部署系统的&#xff1a;操作系统&#xff0c;软件版本、IP、主机名。 二、页面 三、说明 说明点1&#xff1a;查询系统类型及…

阿里云自动备份网站,阿里云自动备份网站的方法

阿里云提供了多种自动备份网站的方法&#xff0c;适用于不同场景和需求&#xff0c;用户可根据自身技术能力和业务要求选择合适的方案。以下是几种主流的自动备份方法及操作要点&#xff1a; 一、基于云服务器ECS的自动快照备份 适用场景&#xff1a;适用于基于ECS部署的网站…

输入输出(python)

open&#xff08;&#xff09;需要和close&#xff08;&#xff09;配合使用 with open () as 不需要用close&#xff08;&#xff09;函数 在python3.0中的一些变动&#xff1a; eval 是编程语言中用于动态执行字符串形式代码的内置函数 &#xff0c;名称源于英文 “evaluate”…

Arduino逻辑控制详细解答,一点自己的想法记录

一、逻辑控制的基础概念与核心语法 1.1 逻辑控制的基本原理 逻辑控制是嵌入式系统中最常见的功能之一,其核心在于通过条件判断(if-else)、循环(for/while)和布尔运算(&&/||)实现对硬件的精确控制。例如,通过按键状态切换LED亮度、根据传感器数据调整电机转速…

字符串的相关方法

1. equals方法的作用 方法介绍 public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写 示例代码 public class StringDemo02 {public static void main(String[] args) {//构造方法的方式得到对象char[] chs {a, b, c};String s1 new String(chs);…

JAVA基础:Collections 工具类实战指南-从排序到线程安全

在 Java 开发中&#xff0c;集合类几乎贯穿每一个项目&#xff0c;而Collections工具类提供了一系列强大的方法&#xff0c;用于操作和增强集合的功能。无论是排序、查找还是线程安全的封装&#xff0c;Collections工具类都是提升代码效率和质量的重要工具。 一、Collections …

ReLU函数及其Python实现

ReLU函数及其Python实现 文章目录 ReLU函数及其Python实现1. ReLU函数定义2. Python实现3. 在深度学习中的应用总结 1. ReLU函数定义 ReLU&#xff08;Rectified Linear Unit&#xff0c;修正线性单元&#xff09;函数是深度学习中常用的激活函数之一。它的定义非常简单&#…

2505ahk,wmi学习

检索每个服务的状态和启动类型 wbemServices : ComObjGet("winmgmts:\\.") //.代表本地计算机. wbemObjectSet : wbemServices.InstancesOf("Win32_Service")For wbemObject In wbemObjectSetMsgBox, % "Display Name: " wbemObject.DisplayNam…