Docker深度解析:部署 SpringBoot 项目

ops/2025/2/9 2:28:17/

方式一:通过两个容器部署

  1. 前端部署:
    1. 修改前端访问端口 ip 为服务器 ip,打包前端:npm run build:prod
    2. 创建文件夹,放置前端部署需要的文件,并将打包的前端 dist 文件放到此文件
    3. 编写 default.conf 配置文件,配置 nginx:
      server{listen 80;server_name 62.234.35.76;       #修改为自己服务器 iplocation / {root /usr/share/nginx/html;index   index.html;}location /prod-api/ {proxy_pass http://62.234.35.76:8383/;}
      }
    4. 编写 Dockerfile 文件:
      
      #基于父类镜像 nginx
      FROM nginx#作者
      MAINTAINER lijiaxu#将前端的内容复制到 nginx 目录下
      COPY dist /usr/share/nginx/html/#用本地的 nginx 配置文件覆盖镜像的 nginx 配置
      COPY default.conf /etc/nginx/conf.d#开放端口
      EXPOSE 80
    5. dockerfile 文件打包成镜像文件:
      docker build -f Dockerfile -t community-front:1 .    #注意 . 不要忘掉
    6. 运行该镜像:
      docker run -p 83:80 community-front:1
  2. 后端部署:
    1. 修改后端端口 ip,打包项目:
    2. 创建文件夹部署需要的文件,将打包好的 jar 包放入此文件夹
    3. 编写 Dockerfile 文件:
      # 基础镜像使用java
      FROM java:8
      # 作者
      MAINTAINER zhangjinxiu
      # VOLUME 指定了临时文件目录为/tmp。
      # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
      VOLUME /tmp
      # 将jar包添加到容器中并更名为springbootb.jar
      ADD jar包文件名 community.jar
      # 运行jar包
      RUN bash -c 'touch /community.jar'
      ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/community.jar"]
      #暴露8080端口
      EXPOSE 8383
    4. dockerfile 打包成镜像文件:
      docker build -f Dockerfile -t community-java:1 .    #注意 . 不要忘记
    5. 运行该镜像文件:
      docker run -p 8383:8383 community-java:1
    6.  还需启动 mysql 和 redis:
    7. 访问服务即可:

第二种方式:通过 compose 编排容器自动部署

  1. 删除所有容器以及镜像:
    docker stop $(docker ps -q) & docker rm $(docker ps -aq)      ===>  停止所有容器,并删除所有容器
    docker rmi $(docker images -q)    ===> 删除所有镜像
  2. 创建文件夹,放置需要部署的文件:
    1. 将前端打包后的 dist 文件夹放入该文件下
  3. 修改后端配置文件,打包后上传至服务器:
  4. 编写启动后台的 Dockerfile 文件:
    #基础镜像
    FROM  kdvolder/jdk8:latest#作者   
    MAINTAINER lijiaxu# 在主机 /var/lib/docker 目录下创建一个临时文件,并链接到容器的 /tmp 
    VOLUME /tmp#将 jar 包添加至容器并更名为 community.jar
    ADD SpringBootCommunity-1.0-SNAPSHOT.jar community.jar#运行的 jar 包
    RUN bash -c 'touch /community.jar'ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/community.jar"]#暴露 8383 端口
    EXPOSE 8383
  5. 在文件夹中创建 db 文件夹,里面放置项目用到的 SQL 文件
  6. 编写 mysql-dockerfile:
    
    FROM mysql:5.7MAINTAINER lijiaxu#docker-entrypoint-initdb.d/ 目录下所有 .sh  .sql  .sql.gz 文件将在数据库初始化时被执行或导入
    #这意味着community-linux.sql 中的 SQL 命令将在数据库容器首次启动时被执行,从而初始化数据库
    ADD ./db/community-linux.sql /docker-entrypoint-initdb.d/
  7. 编写 nginx.conf 文件:
    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;}location /prod-api/ {proxy_pass http://服务器地址:8383/;}}
    }

  8. 编写 docker-compose.yml 文件:
    version: '3.0'services:mysql:image: mysql:5.7container_name: mysqlbuild: context: ./dockerfile: mysql-dockerfilerestart: alwayscommand: --default-authentication-plugin=mysql_native_password       #解决外部无法访问问题ports:- "3308:3306"environment:MYSQL_ROOT_PASSWORD: 'root'MYSQL_DATABASE: 'community'MYSQL_PASSWORD: 'root'networks:- communityredis:image: redis:7.0container_name: redisrestart: alwaysports:- "6379:6379"networks:- communitynginx:container_name: nginxbuild:context: ./dockerfile: nginx-dockerfile# restart: always#  volumes:#     - ./nginx.conf:/etc/nginx/nginx.conf
    #      - ./dist:/usr/share/nginx/html/ports:- "83:80"depends_on:- my-communitynetworks:- communitymy-community:build:context: ./dockerfile: Dockerfileports:- "8383:8383"
    #    volumes:
    #      - /CommunityFace/upload/face:/app/data/face/
    #      - /CommunityFace/upload/excel/:/app/data/excel/depends_on:- redis- mysqlrestart: alwaysnetworks:- communitynetworks:       #定义服务的桥community: driver: bridge
  9. 运行容器
    docker-compose up    #前台运行
    docker-compose up -d     #后台运行
  10. 查看容器
  11. 如果容器发生错误:
    1. 如:不显示端口映射,可以查看详细信息
      docker-compose logs nginx(容器名)
  12. 页面测试,访问端口:83

http://www.ppmy.cn/ops/156859.html

相关文章

产品经理的人工智能课 02 - 自然语言处理

产品经理的人工智能课 02 - 自然语言处理 1 自然语言处理是什么2 一个 NLP 算法的例子——n-gram 模型3 预处理与重要概念3.1 分词 Token3.2 词向量化表示与 Word2Vec 4 与大语言模型的交互过程参考链接 大语言模型(Large Language Models, LLMs)是自然语…

流式传输的实现为什么需要缓存?

流式传输的实现通常确实需要使用缓存(或称缓冲)。这里解释一下为什么缓存是必要的以及它是如何工作的: 为什么需要缓存? 网络波动:互联网连接的速度和稳定性可能会发生变化。缓存可以确保在网络变慢或中断时&#xf…

实际时钟(RTC)的介绍

一、RTC介绍 RTC:实时时钟(Real-Time Clock)的缩写,是一种集成电路,通常称为时钟芯片。 应用:广泛应用于消费类电子产品,提供精确的实时时间或为电子系统提供时间基准。 工作原理:采用精度较高…

Redis企业开发实战(二)——点评项目之商户缓存查询

目录 一、缓存介绍 二、缓存更新策略 三、如何保证redis与数据库一致性 1.解决方案概述 2.双写策略 3.双删策略 3.1延迟双删的目的 4.数据重要程度划分 四、缓存穿透 (一)缓存穿透解决方案 (二)缓存穿透示意图 五、缓存雪崩 (一)缓存雪崩解决方案 (二)缓存雪崩…

React 中常见的Hooks,安排!

哈喽小伙伴们大家好!我是小李,今天是年后开工的第一天,相信大家已经元气满满,准备好迎接新的一年的挑战了吧!打起精神来,我们继续加油呀!今天,给大家分享一道我之前面试被问到相关Ho…

基于C#语言的海康威视智能车牌识别系统

基于C#语言的海康威视智能车牌识别系统,通过布控对来往车辆进行检测抓拍 资源文件列表 AICar.sln , 984 AICar.sln.GhostDoc.xml , 1306 AICar.v12.suo , 72704 AICar/AICar.csproj , 3573 AICar/AICar.csproj.user , 228 AICar/bin/Debug/AICar.exe , 220672 AIC…

【戒抖音系列】短视频戒除-1-对推荐算法进行干扰

如今推荐算法已经渗透到人们生活的方方面面,尤其是抖音等短视频核心就是推荐算法。 【短视频的危害】 1> 会让人变笨,慢慢让人丧失注意力与专注力 2> 让人丧失阅读长文的能力 3> 让人沉浸在一个又一个快感与嗨点当中。当我们刷短视频时&#x…

【MySQL】详解数据库约束、聚合查询和联合查询

数据库约束 约束类型 数据库的约束类型主要包括以下几种: 主键约束(Primary Key Constraint):确保表中的每一行都有唯一的标识,且不能为NULL。 外键约束(Foreign Key Constraint)&#xff1a…