如何在 Docker 容器中运行 Java?



Docker 允许您设置可在生产和开发服务器中使用的 Java 环境。它提高了执行 Java 程序的效率和可管理性。无论底层配置、环境和依赖项如何,Docker 都允许您在所有平台上可靠且一致地运行 Java 程序。它也大大简化了部署过程,并解决了“它只在我的机器上有效”的问题。

您可以使用下面讨论的两种主要方法在 Docker 容器中运行 Java -

  • 您可以使用 Oracle 或 AdoptOpenJDK 提供的官方 Java Docker 基础镜像。
  • 您可以使用 Dockerfile 创建自己的 Docker 镜像,其中包含专门为 Java 应用程序定制的依赖项。

在本章中,我们将通过分步说明、命令和示例来解释这两种创建和运行 Docker 容器内 Java 应用程序的方法。

使用 Docker 容器运行 Java 应用程序的好处

在 Docker 容器内运行 Java 应用程序有许多好处。它们增强了开发和部署工作流程,并提高了可扩展性和可靠性。以下是将 Docker 容器用于 Java 应用程序的一些主要优势。

  • 隔离 - 确保独立运行。
  • 一致性 - 保持统一的运行时环境。
  • 可移植性 - 便于在环境之间轻松迁移。
  • 资源效率 - 最大限度地利用资源。
  • 可扩展性 - 允许无缝调整以满足工作负载需求。

如何使用 Java 基础镜像在 Docker 中运行 Java?

在 Docker 中运行 Java 的最简单方法之一是使用 Oracle 或 AdoptOpenJDK 等可信组织提供的现有 Java 基础镜像。为此,请执行以下步骤和命令。

步骤 1:拉取 Java 基础镜像

您可以使用 Docker pull 命令从 Docker Hub 开始拉取 Java 基础镜像。例如,如果您想从 AdoptOpenJDK 拉取 OpenJDK 11 镜像,可以使用以下命令。

docker pull adoptopenjdk/openjdk11

步骤 2:运行 Docker 容器

现在您已将基础镜像拉取到本地,您可以使用拉取的镜像运行 Docker 容器。您可以指定要在容器内运行的 Java 应用程序 JAR,并将其复制到容器中。为此,可以使用以下命令。

docker run -d --name my-java-container -v 
   /path/to/your/jar:/usr/src/app/my-java-app.jar adoptopenjdk/openjdk11

在此命令中 -

  • -d - 此标志可帮助您分离容器,并可在后台运行它。
  • --name my-java-container - 您可以使用此标志为正在运行的容器分配一个名称以供参考。
  • -v /path/to/your/jar:/usr/src/app/my-java-app.jar - 此标志可帮助您将包含 Java 应用程序 JAR 的目录挂载到容器中的 /usr/src/app/my-java-app.jar。
  • adoptopenjdk/openjdk11 - 这是您要拉取的基础镜像的名称。

步骤 3:访问容器的 Bash

如果您想检查是否已在使用 Docker 镜像创建的容器中安装 Java,则可以访问容器的 bash shell。为此,可以使用以下命令。

docker exec -it my-java-container /bin/bash

在此命令中 -

  • docker exec - 它允许您在正在运行的容器内执行命令。
  • -it - 它分配一个伪终端,并帮助保持 stdin 打开。这使您可以与容器的 bash shell 交互。
  • my-java-container - 这是正在运行的容器的名称。
  • /bin/bash - 这指定了要在容器内执行的命令。此命令在容器内打开一个 bash shell。

步骤 4:检查 Java 安装

现在您已可以访问容器的 bash shell,可以通过运行以下命令检查 Java 是否已安装。

java -version

此命令用于显示已在容器中安装的 Java 和 JDK 的版本。运行此命令后,如果看到与 Java 版本相关的信息,则表示 Java 已在容器中正确安装。

现在您已验证 Java 在容器中成功安装,可以通过键入“exit”并按 Enter 键退出容器的 bash。

如何使用 Dockerfile 创建自定义 Java 镜像?

您可以使用 Dockerfile 定义 Java 应用程序的特定环境和运行配置,以创建和构建 Docker 镜像。以下是可以按照创建使用 Dockerfile 的自定义 Docker 镜像的步骤。

步骤 1:创建 Dockerfile

首先,在 Java 应用程序的目录中创建一个 Dockerfile。在 Dockerfile 中,我们将提及构建镜像层的说明。以下是一个预装 Java 的 Docker 镜像的 Dockerfile -

# Use a base Java image
FROM adoptopenjdk/openjdk11:latest

# Set the working directory inside the container
WORKDIR /usr/src/app

# Copy the Java application JAR file into the container
COPY target/my-java-app.jar .

# Expose the port on which your Java application runs (if applicable)
EXPOSE 8080

# Command to run the Java application
CMD ["java", "-jar", "my-java-app.jar"]

在此 Dockerfile 中 -

  • FROM - 您可以使用 FROM 指定要使用的基础镜像。在本例中,我们使用 AdoptOpenJDK 中的 OpenJDK 11 作为基础镜像。
  • WORKDIR - 此指令可帮助您设置 Docker 容器内的默认工作目录,所有后续命令都将在其中运行。
  • COPY - 它可以帮助您将 Java 应用程序 JAR 文件从本地目录复制到容器中。
  • EXPOSE - 此指令可以帮助您公开 Docker 容器的特定端口。您可以根据应用程序的配置调整端口号。
  • CMD - 您可以使用此指令定义容器启动时要运行的默认命令。在本例中,我们将执行 Java 应用程序 JAR 文件。

步骤 2:构建 Docker 镜像

现在您已准备好 Dockerfile,请导航到 Dockerfile 所在的路径,并运行以下 Docker build 命令以创建 Docker 镜像。

docker build -t my-custom-java-image .

在此命令中 -

  • -t my-custom-java-image - -t 标志使用自定义名称标记 Docker 镜像,以便将来有意义地引用。
  • - 此处的点指定构建上下文。在本例中,它是包含 Dockerfile 的当前目录。

步骤 3:运行 Docker 容器

您可以使用“docker images”命令检查镜像是否已成功构建。如果镜像已成功构建,则可以使用以下命令为该镜像运行容器。

docker run -d --name my-java-container my-custom-java-image

在此命令中 -

  • -d - 此选项分离容器,这有助于在后台运行它。
  • --name my-java-container - 类似于为镜像提供名称,您可以使用它为容器提供有意义的名称。
  • my-custom-java-image - 这是您要创建并为其运行容器的镜像的名称。

如果您想验证 Java 应用程序是否按预期运行,则可以运行前面方法中提到的“docker exec”命令以访问容器的 bash shell。然后,您可以验证日志或检查容器内正在运行的活动进程。

在 Docker 中设置 Java 的关键提示

毫无疑问,Docker 可以帮助您无缝设置、开发和部署 Java 应用程序。以下是一些可以增强您在 Docker 中运行 Java 体验的技巧。

  • 在选择合适的 Java 基础镜像和其他依赖项之前,请考虑应用程序的要求和安全性。
  • 通过有效管理环境变量来优化 Java 运行时。这包括内存设置、时区等。
  • 您可以通过利用 Docker 镜像构建的缓存层机制来最大限度地减少依赖项的冗余镜像拉取和安装。
  • 确保定期更新 Docker 镜像,包括 Java 版本、修复漏洞、错误修复等。
  • 尝试最小化镜像大小以减少攻击面,这进一步增强了安全性并降低了维护成本。

常见问题

Q1. 如何调试在 Docker 容器中运行的 Java 应用程序?

您可以通过设置 Java 虚拟机 (JVM) 以接受远程调试连接来调试在 Docker 容器中运行的 Java 应用程序。要允许远程调试,您可以在 Docker 容器内设置 `JAVA_OPTS` 环境变量并提供 JVM 调试选项(例如,`-agentlib:jdwp`)。此外,您必须在使用 `-p` 或 `-P` 标志(默认为 5005)启动 Docker 容器时公开调试端口。

配置完成后,您可以通过从命令行调试器或集成开发环境 (IDE) 连接到远程调试器来单步执行代码、设置断点和检查变量。这使得识别和修复在 Docker 容器内运行的 Java 应用程序的问题变得更加容易。

Q2. 如何优化在 Docker 容器中运行的 Java 应用程序的性能?

为了保证有效的资源利用并减少开销,有多种技术用于优化在 Docker 容器中运行的 Java 应用程序的性能。一种方法是根据可用的内存和 CPU 资源仔细调整 Java 虚拟机 (JVM) 的垃圾回收和堆大小。要分别调整最大和初始堆大小,您可以使用诸如 `-Xmx` 和 `-Xms` 之类的 JVM 选项。

您还可以根据应用程序的内存使用模式选择垃圾回收器(例如 G1GC)。此外,可以通过利用 Docker 的资源限制(例如内存和 CPU 限制)并使用容器编排系统(例如 Kubernetes)隔离容器工作负载来避免资源争用并保证 Docker 容器中 Java 应用程序的一致性能。

Q3. 如何管理在 Docker 容器中运行的 Java 应用程序的日志记录和监控?

使用日志框架(如 Log4j、Logback)和监控工具(如 Prometheus 和 Grafana)收集和检查应用程序指标和日志是管理在 Docker 容器中运行的 Java 应用程序的日志记录和监控的一部分。

可以将 Java 应用程序设置为将日志写入标准错误或输出流,然后 Docker 会捕获这些日志并将其发送到日志驱动程序(如 syslog 或 JSON 文件)进行集中式日志记录。此外,您可以使用 Dropwizard Metrics 或 Micrometer 等库为您的 Java 应用程序添加指标,然后通过 JMX 或 HTTP 端点公开这些指标以进行监控。

广告