当前位置: 首页 > article >正文

使用Docker部署Java项目的完整指南

前言

Docker是一个轻量级的容器化平台,可将应用及其依赖打包成标准化单元,实现快速部署和环境隔离。本文以Spring Boot项目为例,演示如何通过Dockerfile部署Java应用。


准备工作

  1. 本地环境

    • 安装Docker Desktop(官网下载)
    • JDK 8+ 和 Maven/Gradle
    • Spring Boot项目(可通过mvn clean package生成JAR包)
  2. 项目结构

    my-java-app/
    ├── src/
    ├── pom.xml
    └── target/my-app.jar  # 打包后的可执行JAR
    

步骤1:编写Dockerfile

在项目根目录创建名为Dockerfile的文件(无后缀),内容如下:

# 使用官方Java基础镜像(推荐选择alpine精简版)
FROM openjdk:17-jdk-alpine# 设置工作目录
WORKDIR /app# 复制Maven生成的JAR包到镜像中
COPY target/my-app.jar /app/my-app.jar# 声明暴露端口(与Spring Boot的server.port一致)
EXPOSE 8080# 启动Java应用
ENTRYPOINT ["java", "-jar", "my-app.jar"]# 可选:添加JVM参数(如内存限制)
# ENTRYPOINT ["java", "-Xmx512m", "-jar", "my-app.jar"]

步骤2:构建Docker镜像

在终端中进入项目目录,执行以下命令构建镜像:

# -t 指定镜像名称和标签
docker build -t my-java-app:1.0 .

输出示例:

Successfully built 7d9492d78f3c
Successfully tagged my-java-app:1.0

步骤3:运行Docker容器

# 运行容器并将宿主机8080端口映射到容器8080端口
docker run -d -p 8080:8080 --name java-container my-java-app:1.0
  • -d: 后台运行
  • -p: 端口映射(主机端口:容器端口)
  • --name: 指定容器名称

步骤4:验证部署

  1. 查看容器状态

    docker ps -a
    

    若STATUS显示Up,则运行正常。

  2. 访问应用
    浏览器打开http://localhost:8080,检查应用接口。

  3. 查看日志

    docker logs -f java-container
    

高级配置示例

多阶段构建(优化镜像体积)

# 第一阶段:使用Maven构建
FROM maven:3.8.6-openjdk-17 AS build
WORKDIR /workspace
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests# 第二阶段:生成最终镜像
FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY --from=build /workspace/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

常见问题排查

  1. 端口冲突

    • 错误:Bind for 0.0.0.0:8080 failed: port is already allocated
    • 解决:修改主机端口 -p 8090:8080 或停止占用端口的进程
  2. 镜像构建失败

    • 确保Dockerfile中的JAR文件名与实际打包名称一致
    • 检查是否已执行mvn clean package
  3. 时区问题
    在Dockerfile中设置时区:

    RUN apk add --no-cache tzdata && \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone
    

总结

通过Dockerfile定义部署流程,可实现Java应用的一键容器化。结合CI/CD工具(如Jenkins、GitHub Actions),可进一步自动化构建和发布流程。

相关文章:

使用Docker部署Java项目的完整指南

前言 Docker是一个轻量级的容器化平台,可将应用及其依赖打包成标准化单元,实现快速部署和环境隔离。本文以Spring Boot项目为例,演示如何通过Dockerfile部署Java应用。 准备工作 本地环境 安装Docker Desktop(官网下载&#xff0…...

基于 Spring Boot 瑞吉外卖系统开发(三)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;三&#xff09; 分类列表 静态页面 实现功能所需要的接口 定义Mapper接口 Mapper public interface CategoryMapper extends BaseMapper<Category> {}定义Service接口 public interface CategoryService extends ISe…...

TCP,UDP协议和域名地址

1.TCP&#xff08;传输控制协议&#xff09;是面向连接&#xff0c;UDP&#xff08;用户数据报协议&#xff09;是无连接的 2.应用层&#xff1a;FTP,HTTP,SMTP,TELNET,DNS,TFTP 传输层;TCP,UDP 网际层&#xff1a;IP,ICMP,ARP,RARP 3.TCP21:20端口数据传输&#xff1b;21端…...

winserver2022备份

安装备份&#xff0c;然后等待安装完成即可 然后可以在这里看到安装好的win server2022备份 一直下一步然后到这里 不要用本地文件夹备份 备份到远程服务器&#xff0c;远程服务器路径 然后确定备份即可 如何恢复呢&#xff1f; 点击右侧的恢复就可以了 打开任务计划程序 这…...

GAT-GRAPH ATTENTION NETWORKS(论文笔记)

CCF等级&#xff1a;A 发布时间&#xff1a;2018年 代码位置 25年4月21日交 目录 一、简介 二、原理 1.注意力系数 2.归一化 3.特征组合与非线性变换 4.多头注意力 4.1特征拼接操作 4.2平均池化操作 三、实验性能 四、结论和未来工作 一、简介 图注意力网络&…...

SpringBoot和微服务学习记录Day1

分布式架构 为了解决大量的用户请求&#xff0c;需要多台服务器&#xff0c;为处理某些请求将一些服务器划分为一个集群&#xff0c;通过一种技术来处理集群的请求 典型应用&#xff1a; nginx&#xff1a;Tomcat集群 Redis&#xff1a;哨兵模式 MySQL&#xff1a;mycat 微…...

PDFBox/Itext5渲染生成pdf文档

目录 PDFBox最终效果实现代码 Itext5最终效果实现代码 PDFBox 使用PDFBox可以渲染生成pdf文档&#xff0c;并且自定义程度高&#xff0c;只是比较麻烦&#xff0c;pdf的内容位置都需要手动设置x&#xff08;横向&#xff09;和y&#xff08;纵向&#xff09;绝对位置&#xff…...

前端获取不到后端新加的字段 解决方案

前端获取不到后端新加的字段 解决方案 sql 返回的是 FileInfo 对象 private String lastUpdateTimeStr;// 自定义 setLastUpdateTime 方法&#xff0c;确保在设置 lastUpdateTime 时自动格式化为字符串public void setLastUpdateTime(LocalDateTime lastUpdateTime) {this.las…...

【Java学习】AI时代下如何学习Java语言开发

学习 Java 语言开发时&#xff0c;合理借助 AI 工具可以提升效率、深化理解&#xff0c;以下是具体的学习策略和方法&#xff1a; 一、利用 AI 辅助基础学习 1. 智能文档解读与语法解析 工具&#xff1a;ChatGPT、Bing Chat、Google Bard用法&#xff1a; 直接提问基础语法问…...

联想拯救者Y9000K重装Ubuntu系统

USB刻录Ubuntu&#xff0c;并插入电脑。 进入官网https://rufus.ie/downloads/&#xff0c;安装4.0p版本&#xff0c;对应Ubuntu 22.04版本进入官网https://www.releases.ubuntu.com/22.04/&#xff0c;下载Ubuntu 22.04的iso文件插入一个空USB。运行rufus.exe&#xff0c;选择…...

罗技K860键盘

罗技蓝牙键盘的顶部功能键F1-F12的原本功能 单击罗技键盘的功能键时&#xff0c;默认响应的是键盘上面显示的快进、调节音量等功能。改变回F1~F12原本功能&#xff0c;同时按下 fn和esc组合键...

PyTorch Tensor维度变换实战:view/squeeze/expand/repeat全解析

本文从图像数据处理、模型输入适配等实际场景出发&#xff0c;系统讲解PyTorch中view、squeeze、expand和repeat四大维度变换方法。通过代码演示对比不同方法的适用性&#xff0c;助您掌握数据维度调整的核心技巧。 一、基础维度操作方法 1. view&#xff1a;内存连续的形状重…...

【NLP 面经 9、逐层分解Transformer】

目录 一、Transformer 整体结构 1.Tranformer的整体结构 2.Transformer的工作流程 二、Transformer的输入 1.单词 Embedding 2.位置 Embedding 计算公式&#xff1a; 三、Self-Attention 自注意力机制 1.Self-Attention 结构 ​编辑 2.Q、K、V的计算 代码实现 3.Self-Attenti…...

【线程有哪些状态?这些状态如何相互转换?阻塞和等待的状态有什么区别?】

线程状态及其转换与区别 线程的生命周期包含多个状态&#xff0c;不同状态之间的转换由线程调度和同步机制决定。以下是线程状态的详细说明、转换关系及阻塞与等待的区别&#xff1a; 一、线程的六种基本状态&#xff08;以Java为例&#xff09; 状态描述NEW&#xff08;新建…...

netty中的ChannelPipeline详解

Netty中的ChannelPipeline是事件处理链的核心组件,负责将多个ChannelHandler组织成有序的责任链,实现网络事件(如数据读写、连接状态变化)的动态编排和传播。以下从核心机制、执行逻辑到应用场景进行详细解析: 1. 核心结构与组成 双向链表结构 组成单元:ChannelPipeline…...

Ubuntu 24.04 中文输入法安装

搜狗输入法&#xff0c;在Ubuntu 24.04上使用失败&#xff0c;安装教程如下 https://shurufa.sogou.com/linux/guide 出现问题的情况&#xff0c;是这个帖子里描述的&#xff1a; https://forum.ubuntu.org.cn/viewtopic.php?t493893 后面通过google拼音输入法解决了&#x…...

踩雷,前端一直卡在获取token中

问题&#xff1a;一直卡在var token SecureStorage.Default.GetAsync("auth_token").Result; public VideoService(){_httpClient new HttpClient();var token SecureStorage.Default.GetAsync("auth_token");} 这是一个典型的同步等待异步操作导致的死…...

这是一个文章标题

# Markdown 全语法示例手册本文档将全面演示 Markdown 的语法元素&#xff0c;包含 **标题**、**列表**、**代码块**、**表格**、**数学公式** 等 18 种核心功能。所有示例均附带实际应用场景说明。---## 一、基础文本格式### 1.1 标题层级 markdown # H1 (使用 #) ## H2 (使用…...

xtrabackup备份

安装&#xff1a; https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/tarball/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz?_gl1*1ud2oby*_gcl_au*MTMyODM4NTk1NS4xNzM3MjUwNjQ2https://downloads.perc…...

(51单片机)串口通讯(串口通讯教程)(串口接收发送教程)

前言&#xff1a; 今天有两个项目&#xff0c;分别为&#xff1a; 串口接收: 串口发送&#xff1a; 如上图将文件放在Keli5 中即可&#xff0c;然后烧录在单片机中就行了 烧录软件用的是STC-ISP&#xff0c;不知道怎么安装的可以去看江科大的视频&#xff1a; 【51单片机入门…...

redis 延迟双删

Redis延迟双删是一种用于解决缓存与数据库数据一致性问题的策略&#xff0c;通常在高并发场景下使用。以下是其核心内容&#xff1a; 1. 问题背景 当更新数据库时&#xff0c;如果未及时删除或更新缓存&#xff0c;可能导致后续读请求仍从缓存中读取旧数据&#xff0c;造成数…...

大语言模型中的幻觉现象深度解析

一、幻觉的定义及出现的原因 1. 基本定义 ​​幻觉(Hallucination)​​ 指大语言模型在自然语言处理过程中产生的与客观事实或既定输入相悖的响应&#xff0c;主要表现为信息失准与逻辑矛盾。 2. 幻觉类型与机制 2.1 事实性幻觉 ​​定义​​&#xff1a;生成内容与可验证…...

App的欢迎页,以及启动黑屏的问题

1、在styles.xml文件中配置&#xff1a;<style name"WelcomePageStyle" parent"style/Theme.AppCompat.Light.NoActionBar"><item name"android:windowBackground">mipmap/icon_welcome_bg</item><item name"android:…...

各种颜色空间的相互转换方法(RGB,HSV,CMYK,灰度)

各个颜色空间原始值的取值范围&#xff1a; RGB&#xff1a;[0,255] H&#xff1a;[0,360]&#xff0c;S&#xff1a;[0,1]&#xff0c;V&#xff1a;[0,1] CMYK&#xff1a;[0,1] 灰度&#xff1a;[0,255] 以下给出各个颜色空间转换的伪代码。 RGB转HSV rR/255 gG/255 b…...

详解如何从零用 Python复现类似 GPT-4o 的多模态模型

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...

大模型训练关键两步

大模型的核心原理是基于深度学习&#xff0c;通过多层神经网络进行数据建模和特征提取。目前大部分的大模型采用的是Transformer架构&#xff0c;它采用了自注意力机制&#xff0c;能够处理长距离依赖关系&#xff0c;从而更好地捕捉文本的语义和上下文信息。大模型还结合了预训…...

当算力遇上脑科学:破解意识上传的算力密码

目录 一、人脑复刻面临的三座大山 二、自然科学之外的三大麻烦 三、未来发展的三种可能结局 ​​没有人的文明还是文明吗? 最近,全球首例"数字永生"官司闹得沸沸扬扬——美国富豪家属指控科技公司造假,而马斯克却宣布脑机接口芯片升级到第9代。科学家们算了一…...

前端面试宝典---创建对象的配置

Object.create 对整个对象的多个属性值进行配置 创建对象 不可更改属性值 // 创建对象 不可更改属性值 let obj Object.create({}, {name: {value: lisi,writable: false,},age: {value: 20,writable: true,} })console.log(初始化obj, obj) obj.name wangwu console.log(…...

【设计模式】创建型 -- 单例模式 (c++实现)

文章目录 单例模式使用场景c实现静态局部变量饿汉式&#xff08;线程安全&#xff09;懒汉式&#xff08;线程安全&#xff09;懒汉式&#xff08;线程安全&#xff09; 智能指针懒汉式(线程安全)智能指针call_once懒汉式(线程安全)智能指针call_onceCRTP 单例模式 单例模式是…...

共享内存(与消息队列相似)

目录 共享内存概述 共享内存函数 &#xff08;1&#xff09;shmget函数 功能概述 函数原型 参数解释 返回值 示例 结果 &#xff08;2&#xff09;shmat函数 功能概述 函数原型 参数解释 返回值 &#xff08;3&#xff09;shmdt函数 功能概述 函数原型 参数解释…...