其它注意事项 - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

其它注意事项

本节介绍有关 Java 容器化的一般注意事项,这些注意事项并不特定于 Java EE 应用程序。

使用较小的基本映像

我们建议您创建一个较小(小于 500 MB)且维护良好的基本映像。减小基本映像大小可以降低网络和运营成本。较小的基本映像还可以通过减少可被利用的组件数量来提高安全性。您可以使用基于 Debian 的 Distroless 映像中的一个。这些映像上安装的工具数量最少,并且不包含包管理器或 Shell。这些 Distroless 映像还减少了整体的攻击面。Distroless 映像可以小于 150 MB。有关更多信息,请参阅“Distroless”容器映像 GitHub 存储库。

最佳实践是遵循一次性原则,为容器映像设置快速启动时间。通过使用诸如提前编译(OpenJDK 文档)或应用程序类数据共享(OpenJDK 文档)等技术,您可以在启动虚拟机之前将 Java 类编译为本机代码,以及允许将一组类预处理为共享存档文件,从而缩短总体启动时间。您也可以使用 GraalVM 为 Java 应用程序构建最小的 Docker 映像。有关更多信息,请参阅使用 GraalVM 为 Java 应用程序构建最小的 Docker 映像AWS博客文章。

升级到容器感知型 JDK 版本

在 JDK 8u131 之前,JVM 无法使用标志识别 Docker 引擎设置的内存或 CPU 限制。这意味着,每当您在容器中运行应用程序时,JVM 能“看到”系统上可用的处理器总数,如果是虚拟机,则是虚拟系统。默认内存限制也是如此:JVM 将查看主机的总内存并使用该内存来设置其默认值。因此,JVM 可以占用比容器平台允许的更多的内存,这会导致容器平台(Docker)终止 Java 进程。解决此问题的一种方法是在容器化之前将 Java 应用程序迁移到 Java 9 或 8u131+。Java 10 及更高版本具有完整的容器感知和支持。