Skip to content

弃用通知

此图像已正式弃用,建议所有用户尽快找到并使用合适的替代品。其他官方图像替代方案的一些示例(按字母顺序列出,无有意或暗示的偏好):

有关更多信息,请参阅 docker-library/openjdk#505。

在 2022 年 7 月之后唯一将继续接收更新的标签将是早期访问构建(其源自 jdk.java.net),因为这些不是由上述任何项目发布/支持的。

快速参考

  • 由……维护
    Docker 社区

  • 何处获取帮助:
    Docker 社区 Slack、服务器故障、Unix & Linux 或 Stack Overflow

支持的标签及相应的 Dockerfile 链接

(见常见问题解答中“‘共享’和‘简单’标签之间的区别是什么?”)

简单标签

共享标签

快速参考(续)

什么是 OpenJDK?

OpenJDK(开放 Java 开发工具包)是 Java 平台标准版(Java SE)的一个免费且开源的实现。自版本 7 起,OpenJDK 是 Java SE 的官方参考实现。

wikipedia.org/wiki/OpenJDK

Java 是甲骨文公司和/或其关联公司的注册商标。

logo

如何使用此图像

在你的应用中启动一个 Java 实例

使用此图像最直接的方法是使用 Java 容器作为构建和运行时环境。在你的 Dockerfile 中,编写类似于以下内容的东西将编译并运行你的项目:

FROM openjdk:11
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]

然后你可以运行并构建 Docker 镜像:

$ docker build -t my-java-app .
$ docker run -it --rm --name my-running-app my-java-app

在 Docker 容器内编译你的应用程序

可能存在一些不适合在容器内运行你的应用程序的情况。要在 Docker 实例内编译但不运行你的应用程序,你可以编写如下内容:

$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp openjdk:11 javac Main.java

这将把你当前的目录作为一个卷添加到容器中,将工作目录设置为该卷,并运行命令 javac Main.java ,该命令将告诉 Java 在 Main.java 中编译代码,并将 Java 类文件输出到 Main.class

使 JVM 遵守 CPU 和 RAM 限制

在启动时,JVM 会尝试检测可用的 CPU 核心数量和 RAM,以相应地调整其内部参数(如要生成的垃圾收集器线程的数量)。当容器在有限的 CPU/RAM 下运行时,JVM 用于探测的标准系统 API 将返回主机范围的值。这可能会导致旧版本的 JVM 出现过度的 CPU 使用和内存分配错误。

在 Linux 容器内部,OpenJDK 8 及更高版本能够正确检测容器限制的 CPU 内核数量和可用 RAM。对于所有当前受支持的 OpenJDK 版本,默认情况下此功能是开启的。

在 Windows Server(非 Hyper-V)容器内部,可用 CPU 内核数量的限制不起作用(被主机计算服务忽略)。要手动设置限制,可以如下启动 JVM:

$ start /b /wait /affinity 0x3 path/to/java.exe ...

在此示例中,CPU 关联十六进制掩码 0x3 将把 JVM 限制为 2 个 CPU 内核。

Windows Server 容器支持 RAM 限制,但当前 JVM 无法检测到它。为防止过度内存分配,必须使用不大于容器 RAM 限制的值指定 -XX:MaxRAM=... 选项。

名称中带有句点的环境变量

一些 shell(特别是 Alpine Linux 中包含的 BusyBox /bin/sh )不支持名称中带有句点的环境变量(从技术上讲不符合 POSIX 标准),因此会删除它们而不是传递它们(就像 Bash 所做的那样)。如果你的应用程序需要这种形式的环境变量,要么直接使用 CMD ["java", ...] (没有 shell),要么(安装并)明确使用 Bash 而不是 /bin/sh

图像变体

openjdk 图像有多种类型,每种都针对特定的用例而设计。

openjdk:<version>

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

其中一些标签可能包含诸如“书虫”或“靶心”之类的名称。这些是 Debian 发行版的套件代号,表明该镜像基于哪个发行版。如果你的镜像需要安装除镜像自带的软件包之外的任何其他软件包,你可能希望明确指定其中之一,以便在 Debian 有新版本发布时最大程度地减少损坏。

openjdk:<version> (从 12 起), openjdk:<version>-oracleopenjdk:<version>-oraclelinux8

openjdk:12 默认镜像以及 -oracle-oraclelinux8 变体开始,它们基于官方 Oracle Linux 8 镜像,该镜像根据 Oracle Linux 最终用户协议(EULA)在 GPLv2 下提供。

-oraclelinux7 变体基于根据 Oracle Linux 最终用户协议(EULA)在 GPLv2 下提供的官方 Oracle Linux 7 映像。

OpenJDK 二进制文件由 Oracle 构建,且源自 OpenJDK 社区。这些二进制文件根据 GPLv2 许可证(带有类路径异常)进行授权。

openjdk:<version>-windowsservercore

此图像基于 Windows Server Core( microsoft/windowsservercore )。因此,它仅在该图像适用的地方起作用,例如 Windows 10 专业版/企业版(周年纪念版)或 Windows Server 2016。

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

许可证

查看此映像中包含的软件的许可证信息。

与所有 Docker 镜像一样,这些镜像可能还包含其他可能受其他许可证约束的软件(例如来自基础发行版的 Bash 等,以及所包含的主要软件的任何直接或间接依赖项)。

一些能够自动检测到的额外许可证信息可能会在 repo-info 存储库的 openjdk/ 目录中找到。

对于任何预构建镜像的使用,镜像用户有责任确保对此镜像的任何使用都符合其中包含的所有软件的任何相关许可证。