我正在寻找一个docker映像来构建一个Java应用程序,并查看可用的OpenJDK映像的变体。 我在这里https://github.com/docker-library/openjdk/tree/master/8/jdk看,看到高山,苗条的窗户。 这些之间有什么区别,每个变体都有什么?
答案 0 :(得分:15)
每个Docker库文档(下面的引用和链接),下面是一个摘要:
openjdk:<version>
事实上的图像。如果不确定,请使用它。
openjdk:<version>-stretch
和openjdk:<version>-jessie
jessie
或stretch
是Debian发行版的套件代码名称,并指示图像所基于的发行版。
openjdk:<version>-alpine
类似地,该图像基于Alpine Linux,因此是非常小的基础图像。如果您需要图像尺寸尽可能小,建议您这样做。需要注意的是,它使用了一些不寻常的库,但是对于大多数软件来说应该不是问题。如有疑问,请查看下面的官方文档。
openjdk:<version>-slim
此图像仅包含运行Java所需的最少软件包(例如,缺少许多与UI相关的Java库)。除非您在仅部署{em> openjdk
映像且有空间限制的环境中工作,否则建议在此映像上使用默认映像。
openjdk:<version>-windowsservercore
此图片基于Windows Server Core (microsoft/windowsservercore
)。
完整文档(version shown below here,latest version here):
图片变体
openjdk
图像有多种口味,每种口味都是为了 特定的用例。
openjdk:<version>
这是实际图像。如果不确定您的需求 是的,您可能要使用这个。设计用于 作为扔掉的容器(装入源代码并启动 容器来启动您的应用),以及构建其他应用的基础 图片。
其中一些标签的名称可能像jessie或stretch。 这些是发布的套件代码名称 Debian并指出 释放图像基于。
openjdk:<version>-alpine
此图片基于Alpine Linux project中流行的the
alpine
official image。 Alpine Linux小得多 比大多数分发基础映像(约5MB)要多,因此导致 图像通常更苗条。当最终图像尺寸为 希望尽可能小。需要注意的主要警告是 使用musl libc而不是glibc and friends,所以一定要 根据libc的深度,软件可能会出现问题 要求。但是,大多数软件对此没有问题, 因此,此变体通常是非常安全的选择。有关详情,请参见this Hacker News comment thread 有关可能出现的问题的更多讨论以及一些优点/缺点 基于高山的图像的比较。
为最小化图像大小,其他相关工具并不常见 (例如
git
或bash
)包含在基于Alpine的图像中。使用 以该映像为基础,在自己的Dockerfile中添加所需的东西 (有关如何操作的示例,请参见alpine
image description 如果不熟悉,请安装软件包。)
openjdk:<version>-windowsservercore
此图像基于Windows Server Core (
microsoft/windowsservercore
)。 因此,它仅在该图像起作用的地方起作用,例如 Windows 10专业版/企业版(周年纪念版)或Windows Server 2016。有关如何在Windows上运行Docker的信息,请参阅 Microsoft提供的相关“快速入门”指南:
openjdk:<version>-slim
此图像将安装OpenJDK的
-headless
软件包,因此 缺少许多与UI相关的Java库和一些常见的软件包 包含在默认标记中。它仅包含最小的软件包 需要运行Java。除非您在以下环境中工作 仅openjdk
映像将被部署,并且您有空间限制,我们强烈建议使用此映像的默认映像 存储库。
答案 1 :(得分:1)
选择适合您需求的基础docker镜像,请记住镜像大小也是重要方面。
图像可以被视为有关如何创建容器的一组说明。在Docker中,一个映像可以继承(或基于)另一个映像,在基本映像的基础上添加其他指令。每个图像都由多层组成,这些层实际上是不可变的。
请阅读Crafting the perfect Java Docker build flow文章。
Docker映像大小实际上非常重要。大小有影响 上:
- 网络延迟:需要通过网络传输Docker映像
- 存储:需要将所有这些位存储在某个地方
- 服务可用性和弹性:使用Docker调度程序时,例如Kubernetes,Swarm,Nomad,DC / OS或其他(调度程序可以 在主机之间移动容器)
- 安全性:您真的是真的需要Java应用程序具有其所有CVE漏洞的libpng软件包吗?
- 开发敏捷性:小型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
来查看构成图像的所有图层(及其大小)。