使用 docker-compose 部署 SpringBoot 项目 nginx 部署前端

news2024/9/19 13:51:20

安装 Docker

自动下载

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

检查是否安装成功

docker -v

image-20231031135739923

配置镜像仓库

更换镜像加速器(推荐阿里云)

容器镜像服务 (aliyun.com)

扫码登录后找到镜像仓库

每个人都不同,复制自己的镜像仓库

image-20230618171351652

复制好上面的地址后,编辑到 daemon.json 中

vi /etc/docker/daemon.json

image-20231031140340869

ESC ,使用 :wq 保存

启动 docker

systemctl start docker

安装 docker-compose

安装命令行

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

设置文件权限

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

查看版本

docker-compose -v

image-20231031140815313

编写 Dockerfile

Dockerfile 可以将我们的项目打包好的 jar 包转换为镜像

这里我将 dockerfile 以及 docker-compose 放在了项目包中,这里位置可随意,最后要上传到服务器上的

image-20231031141103201

文件内容

Dockerfile 的文件内容为

# 设置jdk版本
FROM java:8

# 设置我们的个人信息,大家根据需求随便写
MAINTAINER daqi <daqi_email@163.com>

# 这两行是设置我们容器内的时间以及 jvm 的时间(默认不是 GMT )
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone

# 前面的 【Esurvey-backend-1.1.jar】 是我们上传的 jar 包名称(在 target 目录中打包的 jar 包),后面的【springboot.jar】是我们新命名的 jar 包
ADD Esurvey-backend-1.1.jar springboot.jar

# 镜像启动成为容器后,对外暴露的端口
EXPOSE 9996

# Image创建容器时的初始化内存,最大内存,及启动时使用的profile. -c为清除以前启动的数据
ENTRYPOINT ["java","-Xms1024m","-Xmx1024m","-jar","/springboot.jar","--spring.profiles.active=prod","-c"]

说明:

**FROM java:8:**这是一个 FROM 指令,指定基础镜像为 java:8,也就是包含 Java 8 环境的镜像

**MAINTAINER daqi daqi_email@163.com:**这是一个 MAINTAINER 指令,指定镜像的作者和联系方式

**RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime:**这是一个 RUN 指令,执行一个命令,并将结果保存到镜像中。这个命令是将亚洲/上海时区文件复制到 /etc/localtime 文件中,设置容器内的时区为亚洲/上海

**ADD Esurvey-backend-1.1.jar springboot.jar:**这是一个 ADD 指令,将本地或远程文件或目录复制到镜像中。这个命令是将 Esurvey-backend-1.1.jar 文件复制到镜像中,并重命名为springboot.jar。如果只需要复制本地文件或目录,建议使用 COPY 指令代替 ADD 指令

**EXPOSE 9996:**这是一个 EXPOSE 指令,声明容器运行时监听的端口。这个指令不会实际开放端口,只是一种文档化的作用,需要在运行容器时使用 -p 或 -P 参数来映射端口。这个命令是声明容器监听9996端口

**ENTRYPOINT [“java”,“-Xms1024m”,“-Xmx1024m”,“-jar”,“/springboot.jar”,“–spring.profiles.active=prod”,“-c”]:**这是一个 ENTRYPOINT 指令,定义容器启动时运行的可执行程序和参数。这个指令可以与 CMD 指令配合使用,CMD 指令中的参数会追加到 ENTRYPOINT 指令中。这个命令是定义容器启动时运行 java 程序,并设置内存、jar 包和 profile 等参数。

编写 docker-compose 文件

介绍

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YAML 文件来配置应用程序需要的所有服务,然后使用一个命令就可以创建并启动所有服务。Docker Compose 可以帮助您简化容器的管理,实现服务的快速部署、扩展和升级

Docker Compose 的主要作用有以下几点:

  • 一次性创建和启动多个容器,实现应用程序的多服务协作
  • 使用 YAML 文件来定义服务的配置,避免重复输入命令行参数
  • 通过项目名来隔离不同的应用环境,避免容器、网络和卷之间的冲突
  • 提供了一系列命令来管理容器的生命周期,如构建、启动、停止、重启、销毁等
  • 支持使用变量和模板来参数化和复用配置文件

文件内容

找一个地方创建文件 docker-compose.yml

# 指定我们docker-compose的版本
version: "3"

# 设置我们的服务
services:

  # 配置mysql服务
  mysql:

    # 这里指定 mysql 镜像文件,mysql 版本是 8.0.27,这里要使用 docker 命令拉取镜像
    image: mysql:8.0.27

    # 配置容器名字
    container_name: esurvey-mysql

    # 通过我们的宿主机的 9995 端口映射到容器里的 3306 端口,因为容器内的网络与我们外界是不互通的,只有宿主机能够去访问我们的容器,这样我们就能通过宿主机的 9995 端口去访问容器的 mysql了
    ports:
      - "9995:3306"

    # 配置环境,主要是配置我们的mysql的登陆密码,mysql容器创建出来默认可以用不同的ip地址访问,所以这里不用进行配置
    environment:
      - MYSQL_ROOT_PASSWORD=mysql2023

    # 配置挂载的文件夹,在当前文件夹下面创建 mysql 文件夹,里面有 conf,logs,data,分别挂载到容器mysql 中的 conf.d,logs,mysql 中,这样当我们的容器如果没了,但是我们的数据还是在的
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/logs:/logs
      - ./mysql/data:/var/lib/mysql

  # 配置 redis 服务
  redis:

    # 设置容器对应的镜像,同上
    image: redis:6.2.7

    # 设置容器名
    container_name: esurvey-redis

    # 设置命令,这里是用来设置我们的redis登陆密码的,root处是密码,自己根据需求填入即可
    command: redis-server --requirepass redis2023

    # 同上,作为端口映射
    ports:
      - "9994:6379"

    # 同上,挂载文件夹
    volumes:
      - ./redis:/data

  # 配置springboot服务
  springboot:
    # 生成镜像,用.它会自动去当前目录下面去找一个Dockerfile的文件,然后根据里面的配置去生成一个镜像
    build: .

    # 指定我们生成的镜像的名字和版本号
    image: springboot:v1.1

    # 指定容器名
    container_name: Esurvey-backend

    # 同上,做端口映射
    ports:
      - "9996:9996"

    # 写清楚我们springboot依赖的服务,有 mysql 以及 redis,这里的名称是 service 名
    depends_on:
      - mysql
      - redis

修改 application-prod.yml

项目中使用了 spring.profiles.active 控制项目环境,这里修改 application-prod.yml 生成环境上的一些连接配置

  1. 修改 mysql 的 url,改为服务器 ip:端口
  2. 同理 redis 的 host 也改为 ip,同时端口也要和上面 docker-compose.yml 配置的一样

注:可以试一下 msyql:9995 以及 redis:9994 的访问方式,我没有访问成功,可能是 不在同一个 network 的原因,大家也可以试一下

image-20231031142742762

使用 docker-compose 运行容器

使用 xhell 连接服务器(也可以使用其他的远程连接),将打包好的 jar 包,Dockerfile,docker-compose 放在文件夹中

以我为例,我统一放在了 /home/server/Esurvey/Esurvey-backend 下,目录结构如下

image-20231031143302680

redis 和 mysql 文件是在运行容器后产生的,是映射容器中的数据卷

进入到当前的目录

image-20231031143558846

运行

docker-compose up -d

image-20231031143629359

这样后端 java 项目就运行成功了

前端项目 Nginx 部署

上传文件

同样,将打包好的文件上传到服务器

以我为例,我传到了 /home/server/Esurvey/Esurvey-app

image-20231031143956291

注意,将前端项目中的请求前缀去掉,我们是通过 nginx 反向代理访问的

安装 Nginx

这里如何用命令行安装就不赘述了

我使用宝塔安装 nginx,在软件商城中安装

配置文件修改

文件中修改 http 下的内容

注意 server 的位置,在 http 中的,这里监听了 9998 端口,首页文件是 index.html,文件路径是上传路径

location ^~ /api/ 是匹配 /api/ 路径然后代理成 http://127.0.0.1:9996/api/,这个地址是后端的地址

server {
  listen 9998;
  server_name xxxx.top;
  index index.html;
  root  /home/server/Esurvey/Esurvey-app;
  
  location ^~ /api/ {
    proxy_pass http://127.0.0.1:9996/api/;
    add_header 'Access-Control-Allow-Origin' $http_origin;
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers '*';
    	if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Origin' $http_origin;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    	}
	}
}

重载 nginx,配置就生效了,页面也就可以访问了

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

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

相关文章

基于深度学习的人脸识别系统 计算机竞赛

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…

1.PPT高效初始化设置

1.PPT高效初始化设置 软件安装&#xff1a;Office 2019 主题和颜色 颜色可以在白天与黑夜切换&#xff0c;护眼 切换成了黑色 撤回次数 撤回次数太少&#xff0c;只有20次怎么办 自动保存 有时忘记保存就突然关闭&#xff0c;很需要一个自动保存功能 图片压缩 图片…

保姆级,Fiddler抓包辅助-抓取APP端数据包,看这篇就足够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 做接口测试的时候…

数据结构和算法——用C语言实现所有图状结构及相关算法

文章目录 前言图的基本概念图的存储方式邻接矩阵邻接表十字链表临界多重表 图的遍历最小生成树普里姆算法&#xff08;Prim&#xff09;克鲁斯卡尔算法&#xff08;Kruskal&#xff09; 最短路径BFS求最短路径迪杰斯特拉算法&#xff08;Dijkstra&#xff09;弗洛伊德算法&…

python:使用gdal和numpy进行遥感时间序列最大值合成

作者:CSDN @ _养乐多_ 本文将介绍使用python编程语言,进行遥感数据时间序列最大值合成的代码。代码中使用了numpy和gdal,通过numpy广播机制实现时间序列最大值合成,并以NDVI时间序列数据为例。代码方便易运行,逻辑简单,速度快。只需要输入单波段遥感数据,就可输出最大值…

宝兰德BES应用服务器部署应用报错:java.lang.OutOfMemory:Metspace

问题现象&#xff1a;使用宝兰德BES应用服务器部署应用时报错&#xff0c;报错日志大致如下&#xff1a; 提示&#xff1a;ERROR SpringApplication run failed java.lang.OutOfMemoryError:Metaspace 此前在TongWeb部署环境时也有遇到类似问题&#xff1a;TongWeb的OutOfMem…

三维地图数据共享与统一存储

这家总部位于北京的高新企业是一家致力于三维数字地理技术的领军企业&#xff0c;提供中国领先的三维数据获取服务&#xff0c;并依据三维数据自动建模云计算服务、提供全国性的地图与位置服务。这项技术其实我们每天都有可能用到&#xff0c;例如百度地图、高德地图就属于三维…

vue实现一个账号在同一时间只有一个能登录的效果

目录 1.实现方法 2.实现示例 1.实现方法 要实现一个账号在同一时间只有一个能登录的效果&#xff0c;你可以使用以下步骤来实现&#xff1a; 在后端服务器端设置一个标志位&#xff0c;用于标记用户是否已登录。这个标志位可以存储在数据库中或者缓存在服务器内存中。当用户…

一年时间如何能掌握 C++ ?

一年时间如何能掌握 C &#xff1f; 建议不要把掌握c作为一个一年的目标。 C的外延太广&#xff0c;就是应用领域、面向对象、设计模式等等。C语法和标准库本身是有限的。 最近很多小伙伴找我&#xff0c;说想要一些C资料&#xff0c;然后我根据自己从业十年经验&#xff0c;…

缓存和数据库一致性解决方案

引入缓存提高性能 如果你的业务处于起步阶段&#xff0c;流量非常小&#xff0c;那无论是读请求还是写请求&#xff0c;直接操作数据库即可&#xff0c;这时你的架构模型是这样的&#xff1a; 但随着业务量的增长&#xff0c;你的项目请求量越来越大&#xff0c;这时如果每次都…

期中考成绩一键私发

作为一名教师&#xff0c;期中考试后最繁忙的事情之一就是发布成绩。每个学生都希望尽快知道自己的成绩&#xff0c;而作为老师&#xff0c;我们需要一种更高效、更方便的方式来完成这项任务。今天&#xff0c;我就来给大家介绍一种成绩查询系统&#xff0c;让我们一起告别繁琐…

【接口自动化测试框架】YAML管理接口框架配置的最佳实践

管理接口框架配置是构建强大的接口测试框架的关键一环。良好的配置管理可以提高测试效率、可维护性和可扩展性。在本文中&#xff0c;我们将重点介绍使用YAML&#xff08;YAML Ain’t Markup Language&#xff09;来管理接口框架配置的最佳实践&#xff0c;并通过实例演示其用法…

肺癌不再是老年病:33岁作家的离世引发关注,有这些情况的请注意

近期&#xff0c;90后网络小说家七月新番和26岁男艺人蒋某某因肺癌去世&#xff0c;引发关注。他们都没有吸烟习惯&#xff0c;那么他们为什么会得肺癌呢&#xff1f;浙大二院呼吸内科副主任医师兰芬说&#xff0c;现在年轻人熬夜、加班导致身体过劳&#xff0c;在劳累情况下身…

【嵌入式】Linux C编程——C要注意的东西

1、语法分析中的“贪心法”&#xff1a; 编译器将程序分解成符号的方法是&#xff0c;从左到右一个字符一个字符地读入&#xff0c;如果该字符可能组成一个符号&#xff0c;那么再读入下一个字符&#xff0c;判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分&…

java_stream流

stream 流 文章目录 1. stream 流初体验2. 获取 Stream 流2.1 单列集合 获取 stream 流2.2 双列集合 获取 Stream 流2.3 数组获取 stream 流2.4 一堆零散数据获取 Stream 流 3. Stream 流的中间方法3.1 filter 过滤方法3.2 limit 和 skip 方法3.3 distinct 去重方法3.4 cancat…

计算机网络第3章-TCP协议(2)

TCP拥塞控制 TCP拥塞控制的三种方式&#xff1a; 慢启动、拥塞避免、快速恢复 慢启动 当一条TCP连接开始时&#xff0c;cwnd的值是一个很小的MSS值&#xff0c;这使得初始发送速率大约为MSS/RTT。 在慢启动状态&#xff0c;cwnd的值以1个MSS开始并且每当传输的报文段首次被…

4.2 SSAO算法 屏幕空间环境光遮蔽

一、SSAO介绍 AO 环境光遮蔽&#xff0c;全程Ambient Occlustion&#xff0c;是计算机图形学中的一种着色和渲染技术&#xff0c;模拟光线到达物体能力的粗略的全局方法&#xff0c;描述光线到达物体表面的能力。 SSAO 屏幕空间环境光遮蔽&#xff0c;全程 Screen Space Amb…

Android 处理多个TextView, 文案过长时前面文本省略的问题

遇到显示多个TextView&#xff0c;文案过短时&#xff0c;这几个TextView跟随显示&#xff0c;文案过程时&#xff0c;前面TextView省略&#xff0c;后个的TextView全显示。效果如下&#xff1a; 用ConstraintLayout 没有得到解决&#xff0c;采用 RelativeLayout 解决 代码如…

【小黑嵌入式系统第六课】嵌入式系统软件设计基础——C语言简述、程序涉及规范、多任务程序设计、状态机建模(FSM)、模块化设计、事件触发、时间触发

上一课&#xff1a; 【小黑嵌入式系统第五课】嵌入式系统开发流程——开发工具、交叉开发环境、开发过程(生成&调试&测试)、发展趋势 文章目录 一 单片机的C语言简述1、为什么要用C语言&#xff1f;2、单片机的C语言怎么学&#xff1f;之一&#xff1a;变量定义之二&am…

高并发和存储之间的关系是什么?

文章目录 &#x1f50a;博主介绍&#x1f916;博主的简介&#x1f4e5;博主的目标 &#x1f964;本文内容&#x1f34a; 一、高并发对存储的压力&#x1f34a; 二、存储的性能和可扩展性 &#x1f4e2;总结 &#x1f50a;博主介绍 &#x1f4d5;我是廖志伟&#xff0c;一名Java…