【问题标题】:Docker images - types. Slim vs slim-stretch vs stretch vs alpineDocker 图像 - 类型。修身vs修身弹力vs弹力vs高山
【发布时间】:2019-03-02 00:50:42
【问题描述】:

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

【问题讨论】:

标签: java docker dockerfile


【解决方案1】:

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

  • openjdk:<version>

事实上的形象。如果不确定,请使用它。

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

busterjessiestretchDebian 版本的套件代号,并指明图像基于哪个版本

  • openjdk:<version>-alpine

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

  • openjdk:<version>(从 12 点开始)、openjdk:<version>-oracleopenjdk:<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)



完整文档(version shown below herelatest version here):

图片变体

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

openjdk:<version>

这是事实上的图像。如果您不确定自己的需求 是,你可能想用这个。它被设计为同时使用 作为一个扔掉的容器(安装你的源代码并启动 容器来启动您的应用程序),以及构建其他应用程序的基础 图像关闭。

其中一些标签可能包含像 jessie 或拉伸这样的名称。 这些是版本的套件代号 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 更多讨论可能出现的问题和一些赞成/反对 使用基于 Alpine 的图像的比较。

为了最小化图像大小,额外的相关工具并不常见 (例如 gitbash)将包含在基于 Alpine 的图像中。使用 以此图像为基础,在自己的 Dockerfile 中添加你需要的东西 (请参阅alpine image description 了解如何 如果您不熟悉,请安装软件包。

openjdk:<version>-windowsservercore

此图片基于Windows Server Core (microsoft/windowsservercore)。 因此,它仅适用于该图像的位置,例如 Windows 10 专业版/企业版(周年纪念版)或 Windows 服务器 2016。

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

openjdk:<version>-slim

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

【讨论】:

    【解决方案2】:

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

    图像可以被认为是关于如何创建容器的一组指令。在 Docker 中,一个镜像可以继承自(或基于)另一个镜像,在基础镜像之上添加额外的指令。每个图像由多个层组成,它们实际上是不可变的。

    请阅读Crafting the perfect Java Docker build flow 文章。

    Docker 镜像大小其实很重要。大小有影响 上:

    • 网络延迟:需要通过网络传输 Docker 映像
    • 存储:需要将所有这些位存储在某个地方
    • 服务可用性和弹性:当使用 Docker 调度程序时,如 Kubernetes、Swarm、Nomad、DC/OS 或其他(调度程序可以 在主机之间移动容器)
    • 安全性:你真的,我的意思是你的 Java 应用程序真的需要 libpng 包及其所有 CVE 漏洞吗?
    • 开发敏捷性:小型 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 查看构成图像的所有图层(及其大小)。

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2016-10-07
      • 2017-04-08
      • 2018-05-07
      • 1970-01-01
      相关资源
      最近更新 更多