Docker 映像 - 类型。苗条 vs 苗条伸展 vs 伸展 vs 高山图像变体

2022-08-31 07:01:51

我希望拿起一个docker映像来构建一个java应用程序,并查看可用的OpenJDK映像的变体。我在这里看 https://github.com/docker-library/openjdk/tree/master/8/jdk,看到高山,苗条和窗户。它们之间有什么区别,每个变体都给出了什么?


答案 1

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

  • openjdk:<version>

事实上的图像。如果不确定,请使用它。

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

buster,或者是 Debian 发行版的套件代号,并指示映像基于哪个发行版jessiestretch

  • openjdk:<version>-alpine

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

  • openjdk:<version>(从12岁起),以及openjdk:<version>-oracleopenjdk:<version>-oraclelinux7

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

  • openjdk:<version>-slim

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

  • openjdk:<version>-windowsservercore

此映像基于 Windows Server Core (microsoft/windowsservercore)。



完整文档(此处显示的版本如下所示此处为最新版本):

图像变体

这些图像有多种风格,每种风格都是为特定的用例设计的。openjdk

openjdk:<version>

这是事实上的形象。如果您不确定您的需求是什么,则可能需要使用这个。它被设计为既可以用作丢弃的容器(挂载源代码并启动容器以启动应用),也可以用作构建其他映像的基础。

其中一些标签可能有像jessie或拉伸这样的名字。这些是 Debian 发行版的套件代号,并指示映像基于哪个发行版。

openjdk:<version>-alpine

此映像基于流行的 Alpine Linux 项目,可在 alpine 官方映像中找到。Alpine Linux比大多数发行版基础映像(~5MB)小得多,因此通常会导致更薄的映像。

当最终图像尺寸尽可能小时,强烈建议使用此变体。需要注意的主要警告是,它确实使用musl libc而不是glibc和朋友,因此某些软件可能会遇到问题,具体取决于其libc要求的深度。但是,大多数软件都没有问题,因此此变体通常是一个非常安全的选择。请参阅此黑客新闻评论线程,以获取有关可能出现的问题的更多讨论以及使用基于Alpine的图像的一些利弊比较。

为了最小化图像大小,在基于 Alpine 的图像中包含其他相关工具(如 或 )的情况并不常见。使用此映像作为基础,在您自己的 Dockerfile 中添加所需的内容(如果您不熟悉,请参阅 alpine 映像描述,了解如何安装软件包的示例)。gitbash

openjdk:<version>-windowsservercore

此映像基于 Windows Server Core (microsoft/windowsservercore)。因此,它仅适用于该映像可以工作的地方,例如Windows 10 Professional/Enterprise(周年纪念版)或Windows Server 2016。

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

openjdk:<version>-slim

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


答案 2

选择适合您需求的基本 Docker 映像,请记住,映像大小也是一个重要方面

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

请阅读制作完美的 Java Docker 构建流程一文。

Docker 镜像大小其实非常重要。大小对以下方面有影响:

  • 网络延迟:需要通过 Web 传输 Docker 映像
  • 存储:需要将所有这些位存储在某个地方
  • 服务可用性和弹性:当使用 Docker 调度程序时,如 Kubernetes、Swarm、Nomad、DC/OS 或其他(调度程序可以在主机之间移动容器)
  • 安全性:你真的,我的意思是真的需要libpng包及其所有CVE漏洞用于你的Java应用程序吗?
  • 开发敏捷性:小型 Docker 映像 == 更快的构建时间和更快的部署


要运行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


推荐