# 在运行 Tomcat 的容器内部署和调试 Java Web 应用程序

> For the complete documentation index, see [llms.txt](https://www.jetbrains.com/zh-cn/help/idea/llms.txt).

您可以使用 Docker 容器来运行应用服务器，以部署和调试您的 Java Web 应用程序。 这是测试和调试网络应用程序的好方法，可在各种版本的应用服务器上重现各种环境。

本教程介绍了如何使用 Docker Compose 文件来运行部署到 Tomcat 应用服务器的 Web 应用程序的 Docker 容器，并进行调试所需的所有配置：公开调试器端口，将包含 WAR 文件的输出目录绑定挂载到容器中的 Tomcat，并打开调试器套接字。

> **Note:**
> 在开始之前，请 [安装并运行 Docker](docker.html#install_docker)、 [启用 Docker 插件](docker.html#enable_docker_plugin)，并 [在 IntelliJ IDEA 中连接到 Docker 守护进程](docker.html#connect_to_docker)。

Procedure: 克隆示例项目

该应用程序的源代码托管在 GitHub 上 [https://github.com/IdeaUJetBrains/Tomcat_docker_debug](https://github.com/IdeaUJetBrains/Tomcat_docker_debug)

1. 在主菜单中，前往  `文件 | 新建 | 从版本控制创建项目…` 。

2. 指定仓库的 URL，然后点击   克隆  。

3. 如有必要，请同意在新窗口中打开克隆的项目。

![克隆包含示例项目的仓库](https://resources.jetbrains.com/help/img/idea/2026.3/docker_compose_tomcat_debug_tutorial_step1.png)

Procedure: 构建 WAR 工件

1. 在主菜单中，进入  `构建 | 构建工件…`

2. 请选择   tomcat_docker_debug：war exploded  并构建它。

![构建 WAR 工件](https://resources.jetbrains.com/help/img/idea/2026.3/docker_compose_tomcat_debug_tutorial_step2.png)

生成的构建工件出现在项目根目录下  `target/` 。

Procedure: 使用 Docker Compose 运行应用程序

1. 打开  `docker-compose.yml` 。

2. 点击 ![docker compose up](https://resources.jetbrains.com/help/img/idea/2026.3/app.runConfigurations.testState.run_run.svg)，位于  `服务` 旁边的标尺。

此操作会创建一个 Docker Compose 运行配置，将应用程序作为单独的 Docker Compose 服务运行，并定义在  `docker-compose.yml` 中。

图像
: 本教程使用了兼容 Jakarta EE 9.1 的图像  `tomcat:10.0-jdk17` 。 如果您的应用程序使用 Jakarta EE 10，请在 Tomcat 10.1 上运行。 对于 Java EE 8，请使用 Tomcat 9 及更早版本。

端口
: 要从您的主机访问该应用程序，Docker Compose 将容器中的端口 8080 暴露为主机上的端口 8888。 它还会将容器中的端口 5005 映射为主机上的端口 5005 以供调试器使用。

卷
: 而不是将 WAR 工件复制到容器中，Docker Compose 将应用程序输出目录  `./target` 绑定挂载到容器中的 Tomcat 目录：  `/usr/local/tomcat/webapps` 。

环境变量
: 要附加调试器，Docker Compose 将  `JAVA_OPTS`  环境变量设置为以下内容：
:
:
: ```
: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
: ```

命令
: Docker Compose 会重写 Tomcat 镜像声明的默认命令，并将其设置为  `catalina.sh run` 。

Procedure: 检查应用程序是否正在运行

1. 打开容器日志，并确保其以 Tomcat 已启动的消息结束。

2. 请在浏览器中打开以下 URL： [http://localhost:8888/Tomcat_docker_debug-1.0-SNAPSHOT/api/hello-world](http://localhost:8888/Tomcat_docker_debug-1.0-SNAPSHOT/api/hello-world)。 它应该返回一个页面  `您好，世界！`

![您好，世界！ 来自 Java web 应用程序的响应](https://resources.jetbrains.com/help/img/idea/2026.3/docker_compose_tomcat_debug_tutorial_step3.png)

Procedure: 附加调试器

1. 运行名为   远程 JVM 调试  的  `remote_tomcat_debug` 配置，该配置远程附加调试器。

2. 打开  `src/main/java/com/example/tomcat_docker_debug/HelloResource.java` 并在  `hello()` 方法中带  `return "Hello, World!";` 的行上设置断点

![为端点设置断点](https://resources.jetbrains.com/help/img/idea/2026.3/docker_compose_tomcat_debug_tutorial_step4.png)

3. 请刷新或再次打开 REST 端点： [http://localhost:8888/Tomcat_docker_debug-1.0-SNAPSHOT/api/hello-world](http://localhost:8888/Tomcat_docker_debug-1.0-SNAPSHOT/api/hello-world)。 这次，它应该在所述方法内触发断点。

> **Note:**
> 为了方便，您可以在  `remote_tomcat_debug` 运行配置中配置一个  `启动前` 任务，使其首先启动  `docker_compose` 配置。 然而，Docker Compose 需要一些时间来启动服务，而远程 JVM 调试不会等待服务。 对此有一个修复程序，将在下一个主要版本中提供：2023.3。 有关更多信息，请参阅 [IDEA-172781](https://youtrack.jetbrains.com/issue/IDEA-172781)。

