docker 部署 java 项目详解

        在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署。今天我们以若依项目为例,总结下部署项目的整体流程。简单来说,第一步:安装项目所需的中间件;第二步:将项目打包成 jar 包;第三步:编写 Dockerfile 文件,构建镜像;第四步:编写 docker-compose.yml 文件;第五步:编写 nginx.conf 文件;第六步:启动项目,进行测试。

      1:安装项目所需中间件

         项目部署依赖的中间件,如数据库 mysql 、缓存 redis、负载均衡 nginx 等,这些中间件的安装就不在这儿一 一赘述了。如果有不清楚的小伙伴,可以看我之前写的几篇博客,如下:

        安装 mysql:docker 安装 mysql 详解-CSDN博客

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

        安装 nginx:docker 安装 nginx 详解-CSDN博客

     2:将项目打成 jar 包

        部署不同的环境,需要选择不同的配置文件,部署测试环境一般选择 application-test.yml 文件打包,部署生产环境一般选择 application-prod.yml 文件。打 jar 包时一定注意本地修改不需要提交的配置,先回滚,然后拉取最新的代码,点击 maven  clean,然后点击 package 打包,打包完后在 target 目录。将 jar 包上传到服务器指定的目录。

        注意:比如在服务器上新建一个 /docker/ruoyi/ 的目录,那么 jar 包放在这个目录下,在这个目录下再新建 Dockerfile 文件 和 docker-compose.yml 文件,如下所示:

                               

     3:编写 Dockerfile 文件,构建镜像

        Dockerfile文件示例:

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

       Dockerfile文件内容释义
       1):FROM openjdk:17: 使用OpenJDK 17基础镜像
       2):RUN mkdir -p /ruoyi/logs:创建一个名为/ruoyi/logs的目录,即日志目录
       3):WORKDIR /ruoyi:切换工作目录
       4):ENV SERVER_PORT=8008 \
              LANG=C.UTF-8 \
              LC_ALL=C.UTF-8
        配置环境变量,Docker 镜像构建时设置了三个环境变量,分别是服务端口和字符编码相关的环境变量,LANG=C.UTF-8 和 LC_ALL=C.UTF-8:这两个环境变量用于设置字符编码和语言环境,\ 末尾的反斜杠 \ 是行延续符,表示下一行是当前命令的延续
       5):EXPOSE 8008:暴露8008端口
       6):ADD ruoyi-admin.jar ./app.jar:
       添加应用Jar包到容器中,ADD:这是 Dockerfile 里用于复制文件和目录的指令,ruoyi-admin.jar:这是位于宿主机上的源文件路径,./app.jar:这是目标路径,指定将源文件复制到 Docker 镜像中的位置和文件名。./ 表示镜像中的当前 # 工作目录,将源文件 ruoyi-admin.jar 复制到镜像的当前工作目录下,并命名为 app.jar
       7):ENTRYPOINT ["java", \
              "-Dserver.port=${SERVER_PORT}", \
              "-Xlog:gc*:time,tags,level", \
              "-XX:+UseZGC", \
              "-jar", "app.jar"]
        a:ENTRYPOINT 关键字:这是 Dockerfile 里用来定义容器启动命令的指令。
        b:"java":表明要执行的是 Java 虚拟机。
        c:"-Dserver.port=${SERVER_PORT}":设置 Java 虚拟机的系统属性。server.port 通常用于指定 Spring Boot 应用程序监听的端口,#${SERVER_PORT} 是一个环境变量引用,其值在之前的 ENV 指令中设置为 8008,这意味着应用程序会监听 8008 端口。
        d:"-Xlog:gc*:time,tags,level":开启 Java 垃圾回收(GC)日志记录功能。gc* 表示记录所有与垃圾回# 收相关的事件,time,tags,level 表示日志中要包含时间、事件标签和日志级别等信息。
        e:"-XX:+UseZGC":启用 Z Garbage Collector(ZGC),这是 Java 11 及以上版本引入的一种可扩展的低# 延迟垃圾回收器,能显著减少垃圾回收停顿时间。
        f:"-jar":告诉 Java 虚拟机要执行一个 JAR 包,"app.jar":指定要执行的 JAR 包名称,这个 JAR 包是之前使用 ADD 或 COPY 指令复制到镜像中的。

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

        

     4:编写 docker-compose.yml 文件

        docker-compose.yml 文件示例:

services:ruoyi-admin:image: ruoyi-admin:v1.0container_name : ruoyi-adminenvironment:- SERVER_PORT=8008# 可选,Java 启动参数- JAVA_OPTS="-Xmx2g -Xms2g" - TZ=Asia/Shanghairestart: alwaysnetwork_mode: "host"

        docker-compose.yml 文件内容释义
        1):image: ruoyi-admin:v1.0:服务会使用ruoyi-admin:v1.0镜像来创建容器
        2):container_name:容器名称
        3):SERVER_PORT=8008:定义环境变量
        4):- JAVA_OPTS="-Xmx2g -Xms2g":可选参数,-Xmx用来设定 JVM 堆内存的最大使用量;-Xms用于设置 JVM 堆内存的初始使用量。JAVA_OPTS="-Xmx2g -Xms2g" 把 JVM 堆内存的初始大小和最大大小都设置为 2GB。这么做可以避免在应用程序运行过程中频繁进行堆内存的扩容和缩容操作,从而提升性能。不过,设置时要依据应用程序的实际内存需求和服务器的可用内存来合理调整,防止出现内存不足或者浪费的情况。
        5):- TZ=Asia/Shanghai:把容器内的时区指定为 Asia/Shanghai(即上海所在的时区,也就是中国标准时间,UTC+8)。这样容器内运行的应用程序所显示和处理的时间会UTC+8时区处理。
        6):restart: always:为容器指定了一种重启策略,确保容器在各种情况下都能尽可能保持运行状态。当容器由于各种原因(如正常退出、异常崩溃、宿主机重启等)停止运行时,Docker 会依据此策略自动尝试重启容器。
       除了always,还有其他几种重启策略:
       no:默认策略,容器停止后不会自动重启。
       on-failure:只有当容器以非零退出码退出时,Docker 才会尝试重启它。可以通过 on-failure: N 的形式指定最多重启 N 次。
       unless-stopped:容器停止后,除非手动停止(如使用 docker stop 命令),否则 Docker 会在 Docker 守护进程重启或宿主机重启后自动重启容器。
      7):network_mode: "host":指定容器使用宿主机的网络,即容器直接使用宿主机的网络接口,而非创建独立的 Docker 网络。

     5:配置 nginx.conf

        nginx.conf 文件示例:

user  nginx;
worker_processes  auto;pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  60;server {listen 80;server_name localhost;charset utf-8;location / {proxy_pass  http://localhost:8008;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}

      6:启动项目,测试

        1):进入 /doker/ruoyi/ 目录下,即 docker-compose.yml 文件目录,使用 docker compose up -d 命令启动容器,启动完成后可以使用 docker ps 命令查看启动的容器,信息如下:

        使用 docker logs -f  容器id 查看启动日志,启动成功:

        2):访问系统,nginx 配置监听 80 端口,所以访问地址为:http:ip地址:80,访问成功,页面如下:

        可能会遇到的问题:项目启动成功,访问失败,可以查看项目端口是否因没开防火墙导致无法访问。如果是,解决步骤如下:

        1):查看防火墙开的端口:firewall-cmd --zone=public --list-ports

        2):若端口未开,则添加,比如开放 8008 端口:firewall-cmd --zone=public --add-port=8008/tcp --permanent

        3):修改完成后,重启防火墙:firewall-cmd --reload

        以上为 docker 部署项目的基本步骤。主要是Dockerfile文件的编写,第一次构建镜像比较慢,因为要下载依赖的基础镜像,只需耐心等待即可。Dockerfile文件有问题,会导致构建镜像失败。构建完成后,可以使用 docker images 查看构建的镜像。启动容器可以直接使用 docker run 命令后面跟启动参数启动,这样做不好的地方每次启动项目,都要输入一 长串命令,不便于使用,在docker-compose.yml文件里面编写启动命令,可以更好的管理启动命令,所以推荐使用docker-compose.yml文件方式。在项目目录使用 docker compose up -d 命令启动就可以,docker compose up -d,带上 -d 是非阻塞的,不阻塞当前的命令窗口。使用 docker logs -f 容器id 或者 容器名称 可以查看启动日志。

        

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

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

相关文章

【C++】STL介绍 + string类使用介绍 + 模拟实现string类

目录 前言 一、STL简介 二、string类 1.为什么学习string类 2.标准库中的string类 3.auto和范围for 4.迭代器 5.string类的常用接口说明 三、模拟实现 string类 前言 本文带大家入坑STL,学习第一个容器string。 一、STL简介 在学习C数据结构和算法前,我…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期,我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子,需要在这类环境下开发程序。说实在的我也没有用过这个平台,但是基于常识,推测只要基于C和Qt,应该问题不大。 1. …

电路研究9.2.3——合宙Air780EP中FTP——FTPGET 命令使用方法研究

怎么说呢,之前也是看的,但是也很迷茫,感觉上虽然是对的,但是无法联系到应用里面,今天研究一下FTP 命令使用方法吧。 15.29 使用方法举例 这里发现下面那些看的不懂呢,于是就返回FTP的应用了。 9.5.4 FTP 应…

单细胞分析基础-第一节 数据质控、降维聚类

scRNA_pipeline\1.Seurat 生物技能树 可进官网查询 添加链接描述 分析流程 准备:R包安装 options("repos"="https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packages("BiocManager",update = F,ask =…

【数组OJ】两数之和

两数之和 题目 思路 暴力枚举:逐一遍历,将当前数与之后的数个个相加、判断其相加后是否等于target 代码实现 /*** Note: The returned array must be malloced, assume caller calls free().*///暴力枚举: int* twoSum(int* nums, int nu…

ResNeSt: Split-Attention Networks 参考论文

参考文献 [1] Tensorflow Efficientnet. https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet. Accessed: 2020-03-04. 中文翻译:[1] TensorFlow EfficientNet. https://github.com/tensorflow/tpu/tree/master/models/official/efficien…

Java后端之AOP

AOP&#xff1a;面向切面编程&#xff0c;本质是面向特定方法编程 引入依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>示例&#xff1a;记录…

51单片机开发:独立键盘实验

实验目的&#xff1a;按下键盘1时&#xff0c;点亮LED灯1。 键盘原理图如下图所示&#xff0c;可见&#xff0c;由于接GND&#xff0c;当键盘按下时&#xff0c;P3相应的端口为低电平。 键盘按下时会出现抖动&#xff0c;时间通常为5-10ms&#xff0c;代码中通过延时函数delay…

java求职学习day18

常用的设计原则和设计模式 1 常用的设计原则&#xff08;记住&#xff09; 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 &#xff08;1&#xff09;开闭原则&#xff08;Open Close Principle…

c++ 定点 new

&#xff08;1&#xff09; 代码距离&#xff1a; #include <new> // 需要包含这个头文件 #include <iostream>int main() {char buffer[sizeof(int)]; // 分配一个足够大的字符数组作为内存池int* p new(&buffer) int(42); // 使用 placement new…

本地部署 DeepSeek-R1 大模型指南:基于 Ollama 的完整流程

Ollama是什么 Ollama 是一个开源的大语言模型本地化部署与管理工具&#xff0c;支持&#xff1a; 一键式模型下载与版本管理 本地化模型推理服务部署 REST API 接口提供 多平台客户端接入支持 整体步骤 安装 OllamaOllama服务配置部署模型客户端配置&#xff08;Page Ass…

Git Bash 配置 zsh

博客食用更佳 博客链接 安装 zsh 安装 Zsh 安装 Oh-my-zsh github仓库 sh -c "$(curl -fsSL https://install.ohmyz.sh/)"让 zsh 成为 git bash 默认终端 vi ~/.bashrc写入&#xff1a; if [ -t 1 ]; thenexec zsh fisource ~/.bashrc再重启即可。 更换主题 …

Controller 层优化四步曲

Controller 层优化四步曲 前言 在开发过程中&#xff0c;Controller 层作为系统与外界交互的桥梁&#xff0c;承担着接收请求、解析参数、调用业务逻辑、处理异常等职责。 然而&#xff0c;随着业务复杂度的增加&#xff0c;Controller 层的代码往往会变得臃肿且难以维护。 …

面试经典150题——图

文章目录 1、岛屿数量1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、被围绕的区域2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、克隆图3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、除法求值4.1 题目链接4.2 题目描述4.3 解题代码4.4 解题思路 5、课…

FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验

文章目录 FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验概述笔记my_fltk_test.cppfltk_test.hfltk_test.cxx用adjuster工程试了一下&#xff0c;好使。END FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验 概述 用fluid搭建UI…

【外文原版书阅读】《机器学习前置知识》1.线性代数的重要性,初识向量以及向量加法

目录 ​编辑 ​编辑 1.Chapter 2 Why Linear Algebra? 2.Chapter 3 What Is a Vector? 个人主页&#xff1a;Icomi 大家好&#xff0c;我是Icomi&#xff0c;本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的…

Python设计模式 - 组合模式

定义 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象&#xff0c;从而简化了客户端代码。 组合模式有透明组合…

Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

当高兴、尊重和优雅三位一体是什么情况吗?

英语单词 disgrace 表示“失脸&#xff0c;耻辱&#xff0c;不光彩&#xff0c;名誉扫地”一类的含义&#xff0c;可做名词或动词使用&#xff0c;含义基本一致&#xff0c;只是词性不同。 disgrace n.丢脸&#xff1b;耻辱&#xff1b;不光彩&#xff1b;令人感到羞耻的人(或…

LeetCode热题100(八)—— 438.找到字符串中所有字母异位词

LeetCode热题100&#xff08;八&#xff09;—— 438.找到字符串中所有字母异位词 题目描述代码实现思路解析 你好&#xff0c;我是杨十一&#xff0c;一名热爱健身的程序员在Coding的征程中&#xff0c;不断探索与成长LeetCode热题100——刷题记录&#xff08;不定期更新&…