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


109

我正在寻找一个docker映像来构建一个Java应用程序,并查看可用的OpenJDK映像的变体。我在这里https://github.com/docker-library/openjdk/tree/master/8/jdk,看到高山,薄型和窗户。这些之间有什么区别,每个变体都有什么区别?



FROM在您提供的链接中读取Dockerfile的各行也很有帮助。Alpine映像比基于Debian的映像要小得多,但是也会遇到各种兼容性问题。
David Maze

1
映像README(来自映像Docker Hub页面)中也对此进行了说明。
David Maze

Answers:


105

每个Docker库文档(下面的引号和链接)为摘要:

  • openjdk:<version>

实际图像。如果不确定,请使用它。

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

busterjessie或者stretchDebian发行版的套件代码名称,并指示该映像所基于的发行版

  • openjdk:<version>-alpine

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

  • openjdk:<version>(从12开始),openjdk:<version>-oracle以及openjdk:<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 Server Core(microsoft/windowsservercore



完整文档(版本如下所示最新版本位于此处):

图像变体

openjdk图像有许多种,每一个设计用于特定的使用情况。

openjdk:<version>

这是实际图像。如果不确定自己的需求,则可能要使用这一需求。它既可以用作一次性容器(装入源代码并启动容器以启动应用程序),也可以用作构建其他图像的基础。

其中一些标签的名称可能像jessie或在其中拉伸。这些是Debian发行版的套件代码名称 ,指示该映像所基于的发行版。

openjdk:<version>-alpine

该图像是基于流行的高山Linux项目,可用alpine官方图片。Alpine Linux比大多数分发基础映像小得多(约5MB),因此通常导致更苗条的映像。

当希望最终图像尺寸尽可能小时,强烈建议使用此变体。需要注意的主要警告是,它确实使用了musl libc而不是glibc和friends,因此某些软件可能会遇到问题,具体取决于其libc要求的深度。但是,大多数软件对此没有问题,因此,此变体通常是非常安全的选择。请参阅此Hacker News评论主题,以获取有关可能出现的问题的更多讨论以及使用基于Alpine的图像的一些优缺点。

为了最大程度地减小图像大小,通常不会在基于Alpine的图像中包含其他相关工具(例如gitbash)。以该映像为基础,在自己的Dockerfile中添加所需的内容(如果不熟悉,请参阅alpine映像说明以获取有关如何安装软件包的示例)。

openjdk:<version>-windowsservercore

该映像基于Windows Server Core(microsoft/windowsservercore。因此,它仅在该映像可以运行的位置工作,例如Windows 10专业版/企业版(周年纪念版)或Windows Server 2016。

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

openjdk:<version>-slim

该映像安装了-headlessOpenJDK 的软件包,因此缺少许多与UI相关的Java库以及默认标记中包含的一些常见软件包。它仅包含运行Java所需的最少软件包。除非你是在一个环境中工作,其中 openjdk图像将被部署,你有空间的限制,我们强烈建议您使用此库的默认图像。


1

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

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

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

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用来查看构成图像的所有图层(及其大小)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.