1. 概述

在这个教程中,我们将了解如何在 IntelliJ 中调试 Docker 容器。我们假设已经有一个待测试的 Docker 镜像。构建 Docker 镜像的方法有多种,可以参考此处

IntelliJ 可以从其官方网站下载。

对于本文,我们将引用这个基于单个类的 Java 应用程序。它可以轻松地进行 Docker 化、构建和测试

在开始测试之前,我们需要确保 Docker 引擎已在我们的计算机上启动并运行。

2. 使用 Dockerfile 配置

使用 Dockerfile 配置时,我们只需选择我们的 Dockerfile 并提供适当的镜像名称、镜像标签、容器名称和配置名称。如果需要,我们还可以添加端口映射:

保存此配置后,可以从调试选项中选择此配置并点击调试。它会首先构建镜像,将镜像注册到 Docker 引擎,然后运行 Docker 化的应用程序。

3. 使用 Docker 镜像配置

使用 Docker 镜像配置时,我们需要提供已预先构建的应用程序的镜像名称、镜像标签和容器名称。我们可以使用标准 Docker 命令来构建镜像并在 Docker 引擎中注册容器。如果需要,也可以添加端口映射:

保存此配置后,可以从调试选项中选择此配置并点击调试。它会选择预构建的 Docker 镜像和容器并运行它。

4. 使用远程 JVM 调试配置

远程 JVM 配置会连接到任何预先运行的 Java 进程。因此,我们需要先单独运行 Docker 容器。

以下是使用 Java 8 的 Docker 镜像运行的命令:

docker run -d -p 8080:8080  -p 5005:5005 -e JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" docker-java-jar:latest

如果我们使用的是 Java 11,则使用以下命令:

docker run -d -p 8080:8080  -p 5005:5005 -e JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n" docker-java-jar:latest

其中 docker-java-jar 是我们的镜像名称,latest 是它的标签。除了正常的 HTTP 端口(8080)外,我们还映射了一个额外的端口 5005用于使用 -p 扩展进行远程调试。我们使用 -d 扩展以脱机模式运行 Docker,并使用 -eJAVA_TOOL_OPTIONS 作为环境变量传递给 Java 进程。

JAVA_TOOL_OPTIONS 中,我们传递了值 -agentlib:jdwp=transport=dt_shmem,address=,server=y,suspend=n,以便让 Java 进程启动一个JDB 调试会话,并指定 5005 作为我们的远程调试端口。

因此,上述命令启动我们的 Docker 容器,现在我们可以配置远程调试配置来连接到它:

在配置中,我们指定了通过 5005 端口连接到远程 JVM。

现在,如果我们在调试选项中选择此配置并点击调试,它将通过附加到已运行的 Docker 容器开始调试会话。

5. 总结

在这篇文章中,我们学习了在 IntelliJ 中调试 Docker 化应用的不同配置选项。