百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

按这个方法打java17的镜像,直接减少70%

gudong366 2025-04-03 20:48 50 浏览


不知道大家平时在打java项目镜像的时候用的基础镜像是啥,反正这么多年我遇到的java项目基础镜像基本都是基于jdk的,因为业务开发很少会注意镜像大小以及镜像优化这一点,导致一个镜像好几百兆大小,但是我们运行Java项目其实只需要运行时环境就可以了,其他的好多软件根本没啥用,它唯一的作用就是拖慢你的部署速度。那么我们以java 8,和java17为例,一步步来进行镜像的优化。

为什么选择java8和java17:

因为这两个版本是比较典型的长期支持版本,java8可以说是最牛钉子户,没有之一(不多说,懂的都懂),在这个节点上,如果java8的开发者要升级,第一选择就是java17, 性能强悍免费又稳定,官方力推。

我们在打镜像之前得先简单了解一下JDK,JRE的区别,那么我们从如下几个内容出发。

  1. 了解一下JDK、JRE的简单区别。
  2. Java8 版本Dockerfile的镜像优化
  3. Java17 JRE版本Dockerfile的编写。

了解一下JDK、JRE的简单区别

JDK: Java Development Kit,是Java的标准开发工具包(普通用户只需要安装 JRE来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序)。它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环境JRE,以及常用的Java基础类库等,是整个JAVA的核心。

JRE: Java Runtime Environment,是java运行时的环境,包含了java虚拟机,java基础类库,是使用java语言编写的程序运行所需要的软件环境。

简单来讲JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。而JDK不仅仅提供了运行环境,还提供了Java的全套开发工具(如编译器和调试器等)。

Java8 版本Dockerfile的镜像优化

想要打包Java8版本的基础镜像,那么首先就需要下载对应系统的java版本,然后编写Dockerfile, 最后打包镜像测试。我们按流程来看一下,由于我们是在LInux版本上用的,所以需要选Linux版本的。

Java8基础镜像的打包流程

  1. 下载Java版本

我们先到Oracle的官网(
www.oracle.com/java/techno…

  1. 编写Dockerfile
dockerfile复制代码FROM centos:7
# 作者
MAINTAINER todocoder.com
# 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建该目录
WORKDIR /servers
# 将jdk安装包复制到镜像中(ADD与COPY的区别:ADD复制并解压,COPY仅复制)
ADD jdk-8u381-linux-x64.tar.gz .
#配置环境变量
ENV JAVA_VERSION=8u381
ENV JAVA_HOME=/servers/jdk1.8.0_381
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

注意:Dockerfile需要和下载的JDK压缩包在同一个目录下

  1. 打包

docker build -t todocoder/jdk:8u381 .

打包完后我们查看一下镜像大小: docker images | grep jdk

可以看到这个版本的镜像下来 547M

这个大小确实也有点大了,那么我们如果要优化的话,从哪几个方面入手呢?

Java8镜像简单优化

我们先考虑一下占用量大的都哪些? 1. 基础镜像。2. JDK的大小。3. Dockerfile脚本的复杂度。

所以如果要优化的话也是从这三个方面入手:

  1. 基础镜像我们看看能否换成小点的。
  2. 如果我只是运行jar包的项目,是否需要JDK这么全量的工具包,理论上我们换成jre就可以了。
  3. Dockerfile 脚本的话,其实我们的并不是很复杂暂时先不用考虑。

替换表如下:

替换前

替换后

centos:7(72MB)

ubuntu(28.17MB)

jdk-8u381(解压后328MB)

jre-8u381(解压后258M)

注意:这里的基础镜像如有兴趣可以用 alpine 镜像(alpine镜像比ubuntu的还要小,5M以内),这个在JDK环境没怎么在生产上用过,Go语言环境用的比较多。

还是到Oracle的官网(
www.oracle.com/java/techno…

对应的Dockerfile 如下:

dockerfile复制代码FROM ubuntu
# 作者
MAINTAINER todocoder.com
# 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建该目录
WORKDIR /servers
# 将jdk安装包复制到镜像中(ADD与COPY的区别:ADD复制并解压,COPY仅复制)
ADD jre-8u381-linux-x64.tar.gz .
# 删除一些运行jar包不用的一些特性
RUN rm -rf jre1.8.0_381/lib/plugin.jar \
           jre1.8.0_381/lib/ext/jfxrt.jar \
           jre1.8.0_381/bin/javaws \
           jre1.8.0_381/lib/javaws.jar \
           jre1.8.0_381/lib/desktop \
           jre1.8.0_381/plugin \
           jre1.8.0_381/lib/deploy* \
           jre1.8.0_381/lib/*javafx* \
           jre1.8.0_381/lib/*jfx* \
           jre1.8.0_381/lib/amd64/libdecora_sse.so \
           jre1.8.0_381/lib/amd64/libprism_*.so \
           jre1.8.0_381/lib/amd64/libfxplugins.so \
           jre1.8.0_381/lib/amd64/libglass.so \
           jre1.8.0_381/lib/amd64/libgstreamer-lite.so \
           jre1.8.0_381/lib/amd64/libjavafx*.so \
           jre1.8.0_381/lib/amd64/libjfx*.so
#配置环境变量
ENV JAVA_VERSION=8u381
ENV JAVA_HOME=/servers/jre1.8.0_381
ENV PATH=$JAVA_HOME/bin:$PATH

打包

docker build -t todocoder/jre:8u381 .

打包完后我们查看一下镜像大小: docker images | grep jre

看到剩余347M了,当然了这不是极限,有兴趣可以把基础镜像换成 alpine的,jre里面的一些包再精简一下。

至此Java8版本的镜像生成也聊的差不多了,接下来我们看看jre17的要怎么打。

jre17没有独立下载的地方,是和JDK17在同一个包中,我们需要基于JDK单独的生产jre包

Java17 JRE版本Dockerfile的编写

Java17没有独立的JRE版本,我们先下载JDK17版本,到Oracle的官网(
www.oracle.com/java/techno…

jre制作

jdk1.8及以前的版本,都是有jre的,但是jdk9以后的版本不在提供jre需要自己制作。jlink是通过按模块打包的,但是由于目前很多库还不是按模块打包的,所以我们无法知道项目里面都用了那些模块。只好将所有的模块进行打包。这样避免以后出现缺失模块导致应用报错的问题。

解压 tar.gz后的目录在 jdk-17.0.8 目录下执行命令生成 jre17

shell复制代码 bin/jlink --module-path jmods --add-modules ALL-MODULE-PATH  --compress=2 --strip-debug --output jre

可以看到jdk目录下多了一个jre的文件夹,那么我们可以基于这个文件夹生成镜像:

bash复制代码FROM ubuntu:latest
MAINTAINER todocoder.com

COPY ./jre /usr/local/jre17
#授执行权限
RUN chmod -R 750 /usr/local/jre17/bin

#setup java env
ENV JAVA_HOME=/usr/local/jre17
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CALSSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

打包

docker build -t todocoder/jre:17.0.8 .

打包完后我们查看一下镜像大小: docker images | grep jre

可以看到,只有167M。

从开始的JDK 547M 到现在的jre 167M ,节省了 70%的空间,当然了你还可以继续的基于alpine 优化,并且继续的删减jre中没用的工具。

总结

本文主要通过介绍JDK和JRE的简单区别,并从Java1.8 和Java17两个重要的版本来切入,帮助各位业务开发者以及运维人员来了解Java基础镜像的构建过程。希望能给各位开发者带来帮助。

感谢各位能看到这里,觉得文章有用的话记得关注一下,别忘了点赞收藏哦,最后打个小广告

相关推荐

使用再生龙工具远程克隆Linux服务器

大家好,之前给大家介绍一个一款可以用来备份还原、远程克隆、P2V、V2V的工具--再生龙,今天就来给大家演示如何用该工具来远程克隆一台linux服务器。使用此方法,可以将一台物理服务器远程克隆到虚拟...

Linux 下用 SSH 登录远程服务器后把远程服务器文件传本地电脑

在Linux下,使用SSH命令登录远程服务器后,可以使用scp命令将远程服务器上的文件复制到本地电脑。以下是scp命令的基本用法:scp[用户名]@[远程服务器地址]:[远程文件路径][本地存放路...

一文掌握怎么利用Shell+Python实现Linux系统数据异地备份程序

简介:在当今的信息化时代,数据安全已成为企业和个人运维的重中之重。无论是服务器宕机、硬盘损坏,还是遭遇勒索病毒,数据丢失都可能带来巨大损失。为了最大程度保障数据安全,异地备份成为了最佳实践之一。本文将...

如何在Linux上搭建本地Docker Registry并实现远程连接

在Linux上搭建本地DockerRegistry并实现远程连接,可以按照以下步骤操作:一、安装Docker确保Linux系统上已经安装了Docker。如果尚未安装,可以使用以下命令进行安装(以Ub...

服务器连接方法教程(服务器地址怎么连接)

连接服务器的方式多种多样,具体取决于服务器的类型、操作系统以及你的使用需求。以下是几种常见的服务器连接方法,包含详细步骤和注意事项:一、远程桌面连接(适用于Windows服务器)适用场景:需要图形...

自动化测试学习:使用python库Paramiko实现远程服务器上传和下载

前言测试过程中经常会遇到需要将本地的文件上传到远程服务器上,或者需要将服务器上的文件拉到本地进行操作,以前安静经常会用到xftp工具。今天安静介绍一种python库Paramiko,可以帮助我们通过代...

手把手教你安装、远程连接Ubuntu 22.04

Ubuntu分为桌面版和服务器版本,我们选择服务器版本1下载Ubuntu22.04Ubuntu22.04下载地址:https://releases.ubuntu.com/22.04/ubuntu...

Windows服务器怎么连接?远程连接服务器命令

服务器操作系统可以实现对计算机硬件与软件的直接控制和管理协调,任何计算机的运行离不开操作系统,服务器也一样,服务器操作系统主要分为四大流派:WindowsServer、Netware、Unix和Li...

如何使用JuiceSSH实现手机端远程连接Linux服务器

在当今数字化时代,远程连接到服务器成为了许多人工作和生活中的必需品。JuiceSSH是一款比较强大的Android应用程序,它可以让您在手机上轻松地远程连接到Linux服务器。下面简单的向您介绍如何使...

本地电脑如何远程连接服务器(电脑如何远程桌面连接服务器)

下面就来说说如何远程登录服务器。服务器一般有两大类系统,一种是windows系统,一种是Linux系统。下面以Windows系统为例1、Windows系统有自带的登录系统,点击“运行”(或者windo...

如何用CHAT配置linux的远程连接?(chattr linux)

问CHAT:配置linux的远程连接1.下载ssh2.启动ssh服务3.查看ssh服务状态4.设置ssh服务开机自启动5.设置windows的cmd下ssh6.通过cmd的ssh命令远程到...

服务器怎么远程连接控制(服务器远程桌面连接设置方法)

我是艾西,还是有很多小白同学问我服务器怎么远程连接。那么今天我们重点来教教大家如何用电脑远程服务器配上图文教程,让不懂的新手小白一看就会,分分钟上手教程远程服务器需要一台电脑俗称“PC”就是我们自己平...

如何远程管理Linux服务器(linux远程登录管理)

在当今数字化的时代,Linux服务器凭借其稳定性和高效性,成为众多企业和开发者的首选。然而,很多时候我们无法直接在服务器前操作,这就需要掌握远程管理Linux服务器的技巧啦。别担心,今天就来给大家分享...

Linux系统无法启动?别慌!这可能是全网最全的故障排查攻略

当Linux系统罢工时,盲目重装只会浪费时间!本文整理8种常见故障的解决方案,涵盖从引导修复到硬件检测全流程,建议收藏备用。一、引导阶段故障排查1.GRUB引导丢失现象:黑屏显示"grub&...

Linux进程管理(linux进程管理实验报告)

原作者:Linux教程,原文「链接」:https://mp.weixin.qq.com/s/39rQMl3V2Egot9cZ14NCLg【获得原作者转载授权】每个计算机系统都包含一个核心软件集合,即操...