Docker镜像类型:Slim vs slim-stretch vs stretch vs alpine。

189

可能是Python 3.7 Docker镜像的重复问题。 - David Maze
阅读您提供的链接中Dockerfile的FROM行也是有益的。Alpine镜像比基于Debian的镜像要小得多,但在各种方面也可能遇到兼容性问题。 - David Maze
2
这也在图像README中有解释(来自图像Docker Hub页面)。 - David Maze
2个回答

194
根据 Docker 库文档(以下引用和链接),这是一个摘要:
- `openjdk:<version>` 是事实上的镜像。如果不确定,使用它。 - `openjdk:<version>-buster`、`openjdk:<version>-stretch` 和 `openjdk:<version>-jessie` 中的 `buster`、`jessie` 或 `stretch` 是 Debian 发布的套件代码名称,表示镜像基于哪个版本。 - 同样地,此镜像基于 Alpine Linux,因此是一个非常小的基础镜像。如果需要尽可能小的镜像大小,则建议使用它。缺点是它使用了一些不寻常的库,但对于大多数软件来说不应该是问题。如有疑问,请查看下面的官方文档。 - `openjdk:<version>`(从 12 开始)、`openjdk:<version>-oracle` 和 `openjdk:<version>-oraclelinux7`
openjdk:12开始,默认镜像以及-oracle-oraclelinux7变体都基于官方Oracle Linux 7 image。默认镜像中的OpenJDK二进制文件以及-oracle-oraclelinux7变体是由Oracle构建并来自OpenJDK community
  • openjdk:<version>-slim

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

  • openjdk:<version>-windowsservercore

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



完整文档(下面显示的版本最新版本在此处):

镜像变体

openjdk镜像有许多不同的变体,每个变体都是为特定的用例而设计的。

openjdk:<version>

这是事实上的标准镜像。如果您不确定自己的需求,那么您可能想使用这个。它既可以作为一次性容器(挂载源代码并启动容器以启动应用程序),也可以作为构建其他镜像的基础。

其中一些标签可能会带有像jessie或stretch之类的名称。这些是Debian版本的套件代码名称,表示该镜像基于哪个发行版。

openjdk:<version>-alpine

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

当需要使最终镜像大小尽可能小时,强烈推荐使用此变体。要注意的主要注意事项是它确实使用musl libc而不是glibc和朋友们,因此某些软件可能会遇到问题,具体取决于其libc要求的深度。但是,大多数软件都没有这个问题,因此这个变体通常是一个非常安全的选择。请参见此Hacker News评论线程以获取更多讨论可能出现的问题以及使用基于Alpine的映像的一些赞成/反对比较。

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

openjdk:<version>-windowsservercore

此镜像基于Windows Server Core (microsoft/windowsservercore)。因此,它仅适用于那个镜像可以使用的地方,例如Windows 10 Professional/Enterprise(Anniversary Edition)或Windows Server 2016。

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

openjdk:<version>-slim

此镜像安装了OpenJDK的-headless包,因此缺少默认标签中包含的许多与UI相关的Java库和一些常见软件包。它只包含运行Java所需的最小软件包。除非您在仅部署openjdk映像并且有空间限制的


7
请选择适合您需求的基础 Docker 镜像,并请记住镜像大小也是一个重要方面。
镜像可以被视为创建容器的一组指令。在 Docker 中,一个镜像可以继承(或基于)另一个镜像,在基础指令上添加额外的指令。每个镜像都由多个层组成,这些层实际上是不可变的。
请阅读 打造完美的 Java Docker 构建流程 文章。
Docker镜像的大小非常重要。大小对以下方面产生影响:
- 网络延迟:需要通过网络传输Docker镜像。 - 存储:需要将所有这些位存储在某个地方。 - 服务可用性和弹性:当使用Docker调度器(如Kubernetes、Swarm、Nomad、DC/OS或其他)时,可以在主机之间移动容器。 - 安全性:你真的需要libpng包及其所有CVE漏洞来运行Java应用程序吗? - 开发敏捷性:小型Docker镜像==更快的构建时间和更快的部署。
要运行Java应用程序,至少需要JRE。例如,对于Spring项目,可以基于“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查看构建镜像所使用的所有层(以及它们的大小)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接