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

简介: 配合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后终于成功
目录
相关文章
BigDecimal多值求和
java.math.BigDecimal。BigDecimal一共有4种够造方法,让我先来看看其中常用两种用法。
957 0
|
缓存 监控 Java
【Elasticsearch专栏 09】深入探索:Elasticsearch如何处理并发写入和读取请求
Elasticsearch通过分片机制分散读写请求,利用事务日志确保数据持久性,通过多线程处理并发请求,并允许通过配置调整分片和副本数量、线程池设置来优化并发性能。同时,使用批量操作和查询优化进一步提高写入和读取效率。
588 0
|
人工智能 监控 API
阿里云百炼产品月刊【2025年5月】
本文介绍了阿里云百炼平台在2025年6月的产品和模型更新内容,重点涵盖资源包优惠、新模型上线及应用能力增强。
1281 0
|
前端开发 JavaScript 安全
【网络安全/前端XSS防护】一文带你了解HTML的特殊字符转义及编码
【网络安全/前端XSS防护】一文带你了解HTML的特殊字符转义及编码
1766 0
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
1299 1
|
移动开发 编解码 数据可视化
分享12款我常用的开源免费工具
分享12款我常用的开源免费工具
1455 1
|
SQL 关系型数据库 MySQL
【MySQL核心】MySQL无法启动?批量恢复MySQL 物理文件-拯救即将跑路的你
【MySQL核心】MySQL无法启动?批量恢复MySQL 物理文件-拯救即将跑路的你
|
数据采集 大数据 数据挖掘
为什么说爬虫很适合做大数据业务
**摘要:** 在数据驱动的时代,爬虫技术成为大数据业务的关键,因其高效收集结构化与非结构化数据、实时更新信息、多样化数据源、定制化抓取、降低成本及辅助深度决策的优势。爬虫的自动化与灵活性满足了大数据分析对时效性、多样性和精准性的要求,助力企业在市场竞争中占据优势。随着技术进步,其在大数据领域的角色将更加重要。
|
弹性计算 NoSQL 安全
如何在阿里云服务上部署java项目
最近博主接了一波私活,由于上云的概念已经深入人心,客户要求博主也上云,本文将介绍上云的教程。
2620 0
|
缓存 Linux 开发工具
【已解决】Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist
【已解决】Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist
13720 1
【已解决】Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist