码头图片-类型。苗条与苗条-拉伸与拉伸与高山

我希望挑选一个 Docker 映像来构建一个 Java 应用程序,并查看可用的 OpenJDK 映像的变体。 我在这里看 https://github.com/docker-library/openjdk/tree/master/8/jdk,看到高山,纤细和窗户。 这些变体之间有什么区别? 每个变体给出了什么?

103041 次浏览

每个 docker 库文档(下面的引用和链接) ,这里有一个摘要:

  • openjdk:<version>

事实上的影像,如果不确定就用它。

  • openjdk:<version>-busteropenjdk:<version>-stretchopenjdk:<version>-jessie

busterjessiestretchDebian发行版的套件代码名称,表明图像是基于哪个 释放

  • openjdk:<version>-alpine

类似地,这个图像是基于 高山 Linux的,因此是一个非常小的基础图像。如果您需要的图像尺寸是尽可能小,这是建议。需要注意的是,它使用了一些不同寻常的库,但对于大多数软件来说应该不是问题。如有疑问,请查看下面的官方文件。

  • openjdk:<version>(由12岁起)、 openjdk:<version>-oracleopenjdk:<version>-oraclelinux7

openjdk:12开始,默认图像以及 -oracle-oraclelinux7变体都基于官方的 Oracle Linux 7映像。 默认映像中的 OpenJDK 二进制文件以及 -oracle-oraclelinux7变体都是由 Oracle 构建的,并且来自 OpenJDK 社区

  • openjdk:<version>-slim

此映像只包含运行 Java 所需的最小包(例如,缺少许多与 UI 相关的 Java 库)。除非您的工作环境中的 只有openjdk映像将被部署,并且您有空间限制,否则建议使用默认映像。

  • openjdk:<version>-windowsservercore

此图像基于 Windows 服务器核心(microsoft/windowsservercore)



完整文件(版本如下:最新版本) :

图像变体

openjdk图像有多种风格,每一种都是为 特定用例。

openjdk:<version>

如果你不确定自己需要什么,这就是事实上的图像 是,你可能想用这个。它被设计成既可以用 作为一个抛弃容器(挂载源代码并启动 容器来启动你的应用程序) ,以及基础来构建其他 图像关闭。

这些标签中的一些可能有像 Jessie 这样的名字。 这些是发布版本的套件代码名称 并指出是哪一个 释放图像是基于。

openjdk:<version>-alpine

这张图片是基于流行的高山 Linux 项目 ,可在 < a href = “ https://hub.docker.com/_/alpine”rel = “ noReferrer”> alpine官方 Alpine Linux 要小得多 比大多数分布式基本图像(约5MB) ,因此导致很多 一般来说,图像较为清晰。

当最终图像大小为 需要注意的主要问题是,它确实需要尽可能小 使用 [拉丁语]而不是 < a href = “ http://www.etalabs.net/ゑ _ libcs.html”rel = “ noReferrer”> glibc 和 朋友,如此确定 根据 libc 的深度,软件可能会遇到问题 然而,大多数软件都没有这个问题, 所以这种变体通常是一个非常安全的选择 评论线程 for 更多关于可能出现的问题的讨论和一些赞成或反对意见 使用阿尔卑斯山图像的比较。

为了最小化图像大小,不常用其他相关工具 (例如 gitbash) ,以包括在阿尔卑斯山的图像。使用 将此图像作为基础,添加您自己的 Dockerfile 中所需的内容 (见图片: http://hub.docker.com/_/alpine/rel = “ noReferrer”> alpine image 说明 的示例 如果你不熟悉安装软件包)。

openjdk:<version>-windowsservercore

该图像基于 Windows Server Core (microsoft/windowsservercore) . 因此,它只能在那个图像所做的地方工作,例如 Windows10专业/企业版(周年版)或 Windows 服务器2016。

有关如何在 Windows 上运行 Docker 的信息,请参见 微软提供的相关“快速入门”指南:

openjdk:<version>-slim

这个映像安装 OpenJDK 的 -headless包,因此 缺少许多与 UI 相关的 Java 库和一些常见的包 包含在默认标记中。它只包含最小的包 需要运行 Java。除非你工作的环境 只有 openjdk映像将被部署,并且您有空间限制,我们强烈建议使用这个的默认映像 储存库。

选择一个符合您需要的基本码头图像 ,请记住,图像大小也是 重要的方面

可以将 Image 视为关于如何创建容器的一组指令。在 Docker 中,可以从(或基于)另一个图像继承一个图像,在基本图像之上添加额外的指令。每个图像由多个层组成,这些层实际上是不可变的。

请阅读 构建完美的 Java Docker 构建流程文章。

码头图像的大小实际上是非常重要的。大小有一个影响 关于:

  • 网络延迟 : 需要在网络上传输 Docker 图像
  • 存储 : 需要将所有这些位存储在某个地方
  • 服务可用性和弹性 : 当使用 Docker 调度程序时,如 Kubernetes、 Swarm、诺马德、 DC/OS 或其他(调度程序可以 在主机之间移动容器)
  • Security : 我的意思是,您真的需要针对 Java 应用程序的包含所有 CVE 漏洞的 libpng 包吗?
  • 开发敏捷性 : small Docker images = = 更快的构建时间和更快的部署


要运行一个 java 应用程序,你至少需要 JRE。例如,对于一个春季项目,你的图像可以基于 slim Alpine Linux with OpenJDK JRE:

#simple dockerFile for java app:


#here we are using Base Alpine Linux based image with OpenJDK JRE only
#For Java 8, try this
FROM openjdk:8-jre-alpine


#For Java 11, try this
#FROM adoptopenjdk/openjdk11:alpine-jre


#copy application WAR/JAR (with libraries inside)
COPY target/spring-boot-*.war/jar yourName.war/jar
# specify default command
CMD ["/usr/bin/java", "-jar", "/yourName.war/jar"]

你也可以使用 docker history yourImageName来查看所有的图层(和它们的大小) ,使您的形象。