使用ESC部署前后端分离项目

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 配合Docker快速部署java前后端分离项目

1.1、安装docker

# 安装

yum install docker

# 检验安装是否成功

[root@huchao /]# docker --version

Docker version 20.10.8, build 3967b7d

# 启动

systemctl start docker

1.2、安装docker compose

# 安装docker compose

1.从github上下载docker-compose二进制文件安装

sudocurl-L"https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)"-o /usr/local/bin/docker-compose

2.若是github访问太慢,可以用daocloud下载

sudocurl-Lhttps://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m`-o /usr/local/bin/docker-compose

# 赋予权限

sudochmod+x /usr/local/bin/docker-compose

# 检查是否安装成功

docker-compose --version

1.3、编写Dockerfile文件

因为我们的项目需要成为docker的镜像,所以我们必须先编写Dockerfile文件构建我们的项目镜像然后进行编排,Dockerfile文件可以帮助我们进行构建

打包后的jar包,如果要放到容器里面,就要借助dockerfile进行构建

文件中expose的作用:

  1. 只是说明docker容器开放了哪些端口,并没有将这些端口实际开放了出来!更多的作用是告诉运维人员或容器操作人员我开放了容器的哪些端口,只是一种说明
  2. -P命令可以结合这个dockerfile文件中的EXPOSE暴露的端口。会将容器中的EXPOSE端口随机映射到宿主机的端口
  • Dockerfile

FROM java:8

EXPOSE 8080

ADD websocket-0.0.1-SNAPSHOT.jar app.jar

RUN bash-c'touch /app.jar'

ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=pro"]

上面的几行命令其实很简单,首先依赖jdk8环境,对外暴露了8080端口,然后就是复制 websocket-0.0.1-SNAPSHOT.jar到docker容器中并命名为 app.jar ,最后是执行 java -jar /app.jar --spring.profiles.active=pro 使用的是我们编写的生产环境配置

1.4、编写docker-compose.yml文件

docker的编排配置文件

version: '3'# 指定docker-compose版本

services:

 nginx:    # 服务名称  用户自定义

   image: nginx:latest   # 镜像nginx的最新版本

   ports:

     - 80:80     # 暴露端口(宿主:容器),把容器80端口映射到宿主机的80端口

   volumes:      # 挂载(宿主:容器)

     - /root/nginx/html:/usr/share/nginx/html

     - /root/nginx/nginx.conf:/etc/nginx/nginx.conf

   privileged: true  # 这个必须要,解决nginx的文件调用的权限问题

 mysql:

   image: mysql:5.7.19

   ports:

     - 3306:3306

   environment:    # 指定 root 用户的密码

     - MYSQL_ROOT_PASSWORD=12345

 redis:

   image: redis:latest

 vue-springboot-blog:

   image: vueblog:latest

   build: .    # 表示以当前目录下的Dockerfile开始构建镜像

   ports:

     - 8085:8085

   depends_on:   # 依赖于mysql、redis,其实可以不填,默认已经表示可以

     - mysql

     - redis

1.5、修改application-pro.yml

直接使用mysql替换掉MySQL的URL

当我们访问时,mysql会自动转换成docker内部的IP地址

# DataSource Config

spring:

 datasource:

   driver-class-name: com.mysql.cj.jdbc.Driver

   url: jdbc:mysql://mysql:3306/vueblog?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai

   username: root

   password: 10428376

shiro-redis:

 enabled: true

 redis-manager:

   host: redis:6379

1.6、准备好nginx的挂载目录和配置

docker-compose.yml中已经提到,

  • 宿主机的挂载目录: /root/nginx/html
  • 挂载配置:/root/nginx/nginx.conf

所以我们在root目录下新建nginx目录,并进入nginx目录下新建html目录和一个nginx.conf配置文件。

然后读nginx.conf进行编写,具体配置如下:

  • nginx.conf

#user root;

worker_processes  1;

events {

   worker_connections  1024;

}

http {

   include       mime.types;

   default_type  application/octet-stream;

   sendfile        on;

   keepalive_timeout  65;

   server {

       listen       80;

       server_name  localhost;

       location / {

           root   /usr/share/nginx/html;

           try_files $uri $uri/ /index.html last;

           index  index.html index.htm;

       }

       

       error_page   500 502 503 504  /50x.html;

       location = /50x.html {

           root   html;

       }

   }

}

1.7、上传前端

前端打包之后先修改前端调用后端的接口

然后npm run build 打包得到dist文件夹,将其压缩,并上传到linux的 root/nginx/html目录下

  • 解压:upzip dist.zip
    安装unzip:yum install unzip
  • mv dist/* .
  • 去除dist文件夹和dist.zip:rm -rf dist*
  • cd ..
  • vim nginx.conf
  • :wq:保存退出

1.8、部署后端

打包后端项目:跳过测试

mvn clean package -Dmaven.test.skip=true

将打包好的jar包、Dockerfile、docker-compose.yml都上传到linux根目录下,

然后执行一下编排命令

# 开始编排

docker-compose up -d

其中-d表示后台服务形式启动, 然后稍等片刻,特别是Building vue-springboot-blog 的时候可能时间有点长,耐心等待即可!


# 查看日志

docker logs -f java项目的containerID

常见问题

  1. Unable to start docker Container from docker-compose “unknown flag: iidfile”
    原因compose版本过高导致1.29.1
    解决:降低compose版本到1.26.2

rm -f /usr/local/bin/docker-compose

  1. 备注:因为降低了compose版本,compose的yml文件需要降低版本到3.3
  2. 数据库连接报错:plugin caching_sha2_password could not be loaded
    将MySQL版本由8降为了5.7
  3. 重新启动docker-compose重启但不更新:
  • 全部:docker-compose restart
  • 单个:docker-compose restart worker
  1. 重启并更新:
  • 全部:docker-compose up --detach --build
  • 单个:docker-compose up --detach --build websocket
  1. java.sql.SQLSyntaxErrorException: Table 'chatroom.USER' doesn't exist
    Windows中的表名不区分大小写,而linux中区分
  2. Error parsing HTTP request header
    我们在前后台交互的时候往往使用json格式的字段串参数,其中含有“{}”“[]”这些特舒符号,在高版本的tomcat中含有这些字符的请求会被拦截
    添加如下配置类即可

@Configuration

publicclassTomcatConfig {

   @Bean

   publicTomcatServletWebServerFactorywebServerFactory() {

       TomcatServletWebServerFactoryfactory=newTomcatServletWebServerFactory();

       factory.addConnectorCustomizers((Connectorconnector) -> {

           connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");

           connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");

       });

       returnfactory;

   }

}

  1. 加了这个是本地可以正常运行,服务器是不报错了,但功能却没实现!
    更改为在配置中:

#设置http参数限制

server.tomcat.max-http-header-size=3145728

  1. 已被springboot高级版本废除

server.max-http-header-size=8192

  1. 也不行;
    docker-compose up --detach --build后终于成功
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
资源调度 关系型数据库 MySQL
若依框架部署从零开始2023版(前后端分离)
电脑最近重装了一次系统,目前什么都没有安装,记录一下从零开始部署前后端分离版本的若依框架系统先去官网把若依源码拉下来。
692 0
|
6月前
|
弹性计算 NoSQL Java
若依框架---前后端分离项目部署实践
若依框架---前后端分离项目部署实践
405 0
|
人工智能 Linux BI
TechMindWave(BIGC前后端分离项目)从0到1-开发到部署1
TechMindWave(BIGC前后端分离项目)从0到1-开发到部署
41 0
|
消息中间件 资源调度 前端开发
TechMindWave(BIGC前后端分离项目)从0到1-开发到部署3
TechMindWave(BIGC前后端分离项目)从0到1-开发到部署
42 0
|
3月前
|
Kubernetes jenkins 持续交付
微服务从代码到k8s部署应有尽有系列(十四、部署环境搭建)
微服务从代码到k8s部署应有尽有系列(十四、部署环境搭建)
|
13天前
|
前端开发 安全 JavaScript
在阿里云快速启动Appsmith搭建前端页面
本文介绍了Appsmith的基本信息,并通过阿里云计算巢完成了Appsmith的快速部署,使用者不需要自己下载代码,不需要自己安装复杂的依赖,不需要了解底层技术,只需要在控制台图形界面点击几下鼠标就可以快速部署并启动Appsmith,非技术同学也能轻松搞定。
|
6月前
|
SQL 前端开发 NoSQL
【若依】前后端分离版快速上手
【若依】前后端分离版快速上手
283 1
|
6月前
|
前端开发 数据可视化 Java
前后端分离项目部署上线详细教程
前后端分离项目部署上线详细教程
|
6月前
|
前端开发 关系型数据库 数据库连接
项目重构,从零开始搭建一套新的后台管理系统(后端版)
项目重构,从零开始搭建一套新的后台管理系统(后端版)
277 0
|
6月前
|
SQL 应用服务中间件 Linux
【Linux】部署单体项目以及前后端分离项目(项目部署)
【Linux】部署单体项目以及前后端分离项目(项目部署)
304 0
下一篇
无影云桌面