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,并使用 -e
将 JAVA_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 化应用的不同配置选项。