Tomcat を実行しているコンテナー内で Java Web アプリケーションをデプロイしてデバッグする
Docker コンテナーを使用して、Java Web アプリケーションをデプロイおよびデバッグするためのアプリケーションサーバーを実行できます。 これは、さまざまな環境を再現するさまざまなバージョンのアプリケーションサーバーで Web アプリケーションをテストおよびデバッグするための優れた方法です。
このチュートリアルでは、Docker Compose ファイルを使用して Docker コンテナーを実行し、Tomcat アプリケーションサーバーにデプロイされた Web アプリケーションと、デバッグに必要なすべての設定 (デバッガーポートの公開、コンテナー内の Tomcat への WAR ファイルの出力ディレクトリのバインドマウント、およびデバッガーソケットのオープン) を行う方法を説明します。
サンプルプロジェクトのクローンを作成する
アプリケーションのソースコードは https://github.com/IdeaUJetBrains/Tomcat_docker_debug の GitHub でホストされています
メインメニューで へ移動します。
リポジトリの URL を指定して、 クローン をクリックします。
必要に応じて、クローンプロジェクトを新しいウィンドウで開くことに同意します。

WAR アーティファクトをビルドする
メインメニューで に移動します
tomcat_docker_debug:war が展開しました を選択してビルドします。

ビルドされたアーティファクトは、 target/ のプロジェクトルートに表示されます。
Docker Compose を使用してアプリケーションを実行する
docker-compose.yml を開きます。
servicesの横のガターでをクリックします。
これにより、 docker-compose.yml で定義された別の Docker Compose サービスとしてコンテナー内のアプリケーションを実行する Docker Compose 実行構成が作成されます。
- イメージ
このチュートリアルでは、
tomcat:10.0-jdk17イメージを使用する。これは Jakarta EE 9.1 と互換性がある。 アプリケーションが 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に設定する。
アプリケーションが実行されていることを確認する
コンテナーログを開き、Tomcat が開始したというメッセージで終了していることを確認します。
ブラウザーで次の URL を開きます: http://localhost:8888/Tomcat_docker_debug-1.0-SNAPSHOT/api/hello-world。
Hello, World!を含むページを返す必要があります

デバッガーをアタッチする
デバッガーをリモート接続する
remote_tomcat_debugという名前の リモートJVM デバッグ 構成を実行します。src/main/java/com/example/tomcat_docker_debug/HelloResource.java を開き、
return "Hello, World!";のある行のhello()メソッドにブレークポイントを設定します。
RESTエンドポイントを再度リフレッシュするか、開きます: http://localhost:8888/Tomcat_docker_debug-1.0-SNAPSHOT/api/hello-world. 今回は、前述のメソッド内のブレークポイントにヒットするはずです。