如何将java项目打包成docker 镜像并且可运行

java 项目打包成 Docker 可运行的镜像,其目的是便于运用docker容器来管理项目。下面是具体的步骤,如果大家遇到啥问题可以留言有空会逐一回复。

目录

[1. 确保项目已经打包成 JAR 文件](#1. 确保项目已经打包成 JAR 文件)

[2. 编写 Dockerfile](#2. 编写 Dockerfile)

[3. 构建 Docker 镜像](#3. 构建 Docker 镜像)

[4. 运行 Docker 容器](#4. 运行 Docker 容器)

[5. 验证](#5. 验证)


1. 确保项目已经打包成 JAR 文件

首先,确保已经使用 Maven 或 Gradle 等工具将项目打包成 JAR 文件。如果使用的是 Maven,可以通过以下命令打包:

复制代码
mvn clean package

这会在 target/ 目录下生成一个可执行的 JAR 文件。

2. 编写 Dockerfile

在项目的根目录下创建一个 Dockerfile,内容大致如下:

复制代码
# 使用 OpenJDK 8 基础镜像
FROM openjdk:8-jdk-alpine

# 设置工作目录
WORKDIR /app

# 将所需文件和文件夹复制到容器的 /app 目录
COPY target/lib /app/lib
COPY target/resources /app/resources
COPY target/monitor-api.jar /app/monitor-api.jar
COPY target/license.json /app/license.json
COPY target/license.md5 /app/license.md5

# 设置 Spring Profile 激活 dev 配置
ENV SPRING_PROFILES_ACTIVE=dev

# 暴露端口 20001 和 2000
EXPOSE 20001 2000

# 启动 JAR 文件
ENTRYPOINT ["java", "-jar", "/app/monitor-api.jar", "--spring.config.name=application-dev"]

FROM openjdk:17-jdk-slim:选择一个合适的 OpenJDK 镜像作为基础镜像。比如openjdk:8-jdk-alpine只是需要确保你的docker里已经有这个image.。如果没有可直接拉去镜像:

复制代码
docker pull openjdk:8-jdk-alpine

COPY target/your-project-name.jar /app/your-project-name.jar:将打包好的 JAR 文件复制到 Docker 容器中。

ENTRYPOINT ["java", "-jar", "/app/your-project-name.jar"]:设置容器启动时运行的命令,这里是启动 JAR 文件。

EXPOSE 8080:暴露应用的端口,确保容器外部可以访问应用。

3. 构建 Docker 镜像

在项目根目录下,打开终端并运行以下命令构建 Docker 镜像:

复制代码
docker build -t your-image-name .

这将基于 Dockerfile 文件构建镜像,并将其命名为 your-image-name

4. 运行 Docker 容器

构建完成后,可以运行你的 Java 应用容器:

复制代码
docker run -d -p 8080:8080 your-image-name

5. 验证

现在,你应该可以通过访问 http://localhost:8080 来访问你的 Java 应用。

下面是拓展内容,可各自选择是否使用Multi-stage Build 来优化镜像。比如说有镜像大小限制的可以参考一下进行操作:

复制代码
# 第一阶段:构建阶段
FROM maven:3.8.6-openjdk-17-slim AS build

WORKDIR /app

COPY pom.xml .
COPY src ./src

RUN mvn clean package -DskipTests

# 第二阶段:运行阶段
FROM openjdk:8-jdk-alpine

WORKDIR /app

COPY --from=build /app/target/your-project-name.jar .

ENTRYPOINT ["java", "-jar", "your-project-name.jar"]
EXPOSE 8080

Maven 和其他构建工具只存在于构建阶段,最终镜像只包含运行 JAR 所需的内容。这样镜像将更加轻量。

相关推荐
隐积2 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
都叫我大帅哥5 小时前
Java JJWT 完全指南:从入门到生产级实践
java
名字还没想好☜5 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
初级代码游戏6 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
前端开发张小七6 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
酷在前行7 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言
ThsPool7 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
cxr8287 小时前
Graphify vs GitNexus vs CodeGraph — 三工具架构深度对比
开发语言·架构·知识图谱
赤壁小虾7 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
废弃的小码农8 小时前
功能测试--Day07--Python编程基础
开发语言·python