5个构建第一个Java镜像的小窍门

简介: 本文讲的是5个构建第一个Java镜像的小窍门【编者的话】Arun Gupta是《Docker for Java Developers》一书的作者,本文介绍了构建Java镜像的五个小窍门,从而以超越基本概念和框架的方式开启Docker容器之旅。
本文讲的是5个构建第一个Java镜像的小窍门【编者的话】Arun Gupta是 《Docker for Java Developers》 一书的作者,本文介绍了构建Java镜像的五个小窍门,从而以超越基本概念和框架的方式开启Docker容器之旅。

如果你是一个热切期待在你的组织内部迁移到容器技术的企业级软件开发人员,那么你会有更多的兴趣来学习Docker背后的基础概念以及围绕Docker的常用的编排框架。在本文中,我将就这些基本概念进行扩展并提供一些简单而使用的小窍门来构建你的第一个使用Java编程语言的Docker镜像。

选择一个小的基础JDK镜像

Docker镜像是通过从Dockerfile读取指令来构建的,在这里你可以发现构建你的第一个镜像的基础指令。

在应用程序中一个常见的包含了JDK的基础镜像是默认的openjdk:latest镜像,这是基于Debian操作系统构建的。该镜像的大小是640.9MB,可以通过运行镜像看到JDK版本:
docker run -it openjdk java -version

如果你想使用Oracle JDK,那么 正常理由 Docker Hub上是没有可用的官方Docker镜像的,所以,你需要下载 Oracle JDK 并打包到镜像里。在 https://github.com/arun-gupta/ ... e-jdk 上有一个可用的简单的展示如何打包Oracle JDK的Dockerfile,以这种方式构建的镜像是536.3MB。

Alpine Linux 是基于 musl libc BusyBox 构建的精简的Linux发行版,Docker Hub上有基于Alpine的OpenJDK镜像,可以以openjdk:alpine下载,这个镜像的大小是144.9MB,这是不到默认的openjdk:latest镜像大小的25%。

为什么说更小的镜像体积很重要呢?这与磁盘空间没有关系,而是一旦容器在不同的宿主机上启动并且镜像需要通过网络下载,那么镜像大小就变得至关重要了。一个更大的镜像也就意味着需要更高的延迟来启动镜像。

同样的,openjdk:8-jre是309MB,而openjdk:8-jre-alpine是107.8MB。
这里我还想提供一些建议。确保选择JDK或者JRE哪一个是合适的基础镜像,这会让你的镜像变小。为了进一步减少体积,你也许可以考虑使用基于Alpine的镜像而不是默认的基于Debian的镜像。如果你想要一个商业版本支持的JDK,那么你也许需要构建你自己的镜像。下面会讨论该镜像需要的底层操作系统。

选择最佳的底层操作系统

通常是从一个底层的操作系统来开始构建一个Docker镜像的,也就是Dockerfile的FROM指令提及的。在某些情况下,你也许会从一个已有的基础镜像开始,这时你已经选择了底层操作系统镜像。但是如果你需要选择一个底层操作系统镜像,那么常用的镜像和对应的大小如下所示:
  • Ubuntu:127.2MB
  • CentOS:196.8MB
  • Debian:123MB
  • Alpine:4.803MB
  • BusyBox:1.093MB

仔细选择你的底层操作系统,因为它将添加到您的镜像里,确保将操作系统更新到发行包的最新版本,同样也包括依赖项。

在某些情况下,您可能需要选择一个商业支持的操作系统。比如Red Hat Enterprise Linux或者Windows Server 2016。这些通常是由供应商提供的。

清理构建上下文

Docker CLI是由给定一个目录或者URL作为构建上下文的,在镜像构建之前会将该上下文发送到Docker Daemon。建议在一个新的目录里创建Dockerfile,然后在该目录里只添加镜像包含的文件。这为docker build命令提供了一个更加清洁的上下文并且允许更快地构建镜像。否则,扫描带有多个文件的目录将不必要地减慢构建速度。

如果无法创建一个新目录或者执行命令的目录里存在着其他文件,那么可以考虑.dockerignore文件,该文件的语法类似于.gitignore文件,允许您从构建中排除一些文件和目录。举例来说,如果Dockerfile放在了Maven工程的根目录里,那么该文件是需要的。然后这个文件可以用来从target目录里指定生成的特定组件。

创建你自己的镜像

你经常需要创建一个镜像,在这里基础镜像会启动一个组件然后你的镜像将对其作配置。举例来说,jboss/wildfly基础镜像将会启动WildFly应用服务器,然后你的镜像会在其中创建一些JDBC资源。另外一个例子就是couchbase镜像启动了Couchbase服务器,在这种情况下,数据库需要对于内存配额、管理凭证和其它选项进行手动配置。一个新的提供了预配置的Couchbase服务器的Docker镜像是非常实用的,这个已经在couchbase/server:sandbox镜像里实现了,该镜像使用了couchbase作为基础镜像,它使用了Couchbase Restful API来配置数据库,正如在Dockerfile中说明的。

调试镜像文件系统陈列

你可能还需要查看容器内的文件系统是如何陈列的,这将主要用于调试目的。

如果容器正在运行,那么你可以使用如下命令来attach到镜像文件系统:
docker exec -it {cid} bash

如果容器没有运行,那么可以使用下面的命令:
docker run -it <image> bash

在这两种情况下,将会使用镜像的文件系统来打开一个Bash Shell,如果需要的话,这会允许你深入容器/镜像文件系统并进行必要的更新。
你是否已经准备好容器化你的第一个Java应用了呢?我的新书 《Docker for Java Developer》 ,解释了如何使用Docker打包、部署和扩展应用,此外,Github上的Docker for Java Developers教程提供了一个自学及动手实验来构建你的第一个Java应用程序。

原文链接:5 simple tips for building your first Docker image with Java (翻译:胡震)

原文发布时间为:2017-01-23

本文作者:胡震

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:5个构建第一个Java镜像的小窍门

相关文章
|
15天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
28天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
1月前
|
Java API 数据处理
探索 Java 8 中的 Stream 流:构建流的多种方式
探索 Java 8 中的 Stream 流:构建流的多种方式
|
22天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第24天】 在移动开发领域,性能优化一直是开发者关注的重点。随着Kotlin的兴起,许多Android开发者开始从传统的Java转向Kotlin进行应用开发。本文将深入探讨Kotlin与Java在Android平台上的性能表现,通过对比分析两者在编译效率、运行时性能和内存消耗等方面的差异。我们将基于实际案例研究,为开发者提供选择合适开发语言的数据支持,并分享一些提升应用性能的最佳实践。
|
2天前
|
消息中间件 存储 Java
深度探索:使用Apache Kafka构建高效Java消息队列处理系统
【4月更文挑战第17天】本文介绍了在Java环境下使用Apache Kafka进行消息队列处理的方法。Kafka是一个分布式流处理平台,采用发布/订阅模型,支持高效的消息生产和消费。文章详细讲解了Kafka的核心概念,包括主题、生产者和消费者,以及消息的存储和消费流程。此外,还展示了Java代码示例,说明如何创建生产者和消费者。最后,讨论了在高并发场景下的优化策略,如分区、消息压缩和批处理。通过理解和应用这些策略,可以构建高性能的消息系统。
|
16天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
30天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【2月更文挑战第28天】 在Android开发领域,Kotlin作为一种现代编程语言,逐渐取代了传统的Java语言。本文通过深入分析Kotlin和Java在Android平台上的性能差异,揭示两者在编译效率、运行速度以及内存消耗等方面的比较结果。我们将探讨Kotlin协程如何优化异步编程,以及Kotlin Extensions对提升开发效率的贡献。同时,文中还将介绍一些性能优化的实践技巧,帮助开发者在Kotlin环境下构建更加高效的Android应用。
|
1月前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第27天】 在Android开发领域,Kotlin和Java一直是热门的编程语言选择。尽管两者都可以用于创建高质量的Android应用程序,但它们在性能方面的差异一直是开发者关注的焦点。本文通过深入分析Kotlin与Java在Android平台上的运行效率、编译时间及内存消耗等方面的表现,揭示两种语言在实际应用中的性能差异,帮助开发者根据项目需求做出更明智的选择。
|
1月前
|
Cloud Native Java 开发者
Spring Boot 4.0:构建云原生Java应用的前沿工具
Spring Boot 4.0:构建云原生Java应用的前沿工具