既存のJakarta EE アプリケーション(WAR)を JBoss EAP でコンテナ化

Red Hat で Java 関連の製品を担当している伊藤ちひろです。

この記事では、すでにビルドされた WAR ファイルを用いて、JBoss EAP 8.0 のコンテナを作成する方法を紹介します。

みなさんのシステムには、WARファイルをビルドする手順がすでにあるでしょう。 そのような場合、その環境を生かしてJakarta EEアプリケーションをコンテナ化できます。 Jakrta EEアプリケーションのコンテナ化するに当たり以下のような不安があるかもしれません。

  • 難しいツールを使わないといけないかもしれない
  • CI/CD を構築しないといけない

実際はそのようなことはなく、Jakarta EEアプリケーションのコンテナ化は次の 3 ステップだけで完了します。

  1. コンテナファイルを作成
  2. コンテナイメージを作成
  3. コンテナを起動

今回のアプリケーションは my-app.war を使用します。

1. コンテナファイルを作成

コンテナイメージを作成するにはコンテナファイル (Containerfile, Dockerfile) が必要です。

JBoss EAPのコンテナファイルは公式ドキュメントにサンプルがあります。 このサンプルには、アプリのデプロイ方法などがコメントとして記載されています。 以下は公式ドキュメントからコピーしたコンテナファイルに対して以下を実施しました。

  • コメントを削除
  • アプリケーションをデプロイするコードを1行追加

3.4. OpenShift へのサードパーティーアプリケーションのデプロイ | Red Hat Product Documentation

FROM registry.redhat.io/jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8:latest AS builder

ENV GALLEON_PROVISION_FEATURE_PACKS org.jboss.eap:wildfly-ee-galleon-pack,org.jboss.eap.cloud:eap-cloud-galleon-pack
ENV GALLEON_PROVISION_LAYERS cloud-default-config
ENV GALLEON_PROVISION_CHANNELS org.jboss.eap.channels:eap-8.0
RUN /usr/local/s2i/assemble

FROM registry.redhat.io/jboss-eap-8/eap8-openjdk17-runtime-openshift-rhel8:latest AS runtime

COPY --from=builder --chown=jboss:root $JBOSS_HOME $JBOSS_HOME
$JBOSS_HOME/standalone/configuration
# my-app.warをデプロイ(サンプルに以下の1行だけを追加)
COPY --chown=jboss:root my-app.war $JBOSS_HOME/standalone/deployments
RUN chmod -R ug+rwX $JBOSS_HOME

コンテナファイルの作成はこれで完了です。Containerfileという名前で保存しましょう。

2. コンテナイメージを作成

WARファイルに加え、Containerfileも準備ができました。 それではコンテナイメージを作成します。

作業ディレクトリは以下のようになっています。

# ls -l
total 8
-rwxrwxrwx 1 root root 1767 Jun 28 15:20 Containerfile
-rwxrwxrwx 1 root root 2078 Jun 27 16:01 my-app.war

コンテナイメージの作成は、コマンドを1つ実行するだけです。

この実行には registry.redhat.io へのログインが必要となります。まだログインされてない場合は、以下のリンクをごらん下さい。

Red Hat コンテナーレジストリーの認証 - Red Hat Customer Portal

それでは、コンテナイメージを作成します。

> podman build -t my-app .

しばらく時間がかかりますが、以下のようなログが出れば成功です。

Successfully tagged localhost/my-app:latest
bec890e0bcf64d43b8193b6cc16a7469e03be81983923022ca5cf9c529a468c5

コンテナイメージが作成されたことを確認しましょう。今回作成したコンテナイメージはlocalhost/my-app として保存されます。

> podman images
REPOSITORY                                                                                   TAG         IMAGE ID      CREATED        SIZE
localhost/my-app                                                                             latest      bec890e0bcf6  2 minutes ago  869 MB
<none>                                                                                       <none>      6d564a55140f  2 minutes ago  910 MB
registry.redhat.io/jboss-eap-8/eap8-openjdk17-builder-openshift-rhel8                        latest      d381ac3b8535  5 weeks ago    424 MB
registry.redhat.io/jboss-eap-8/eap8-openjdk17-runtime-openshift-rhel8                        latest      801b9cf38b51  5 weeks ago    409 MB

ここまでで、コンテナイメージの作成は完了です。

3. コンテナを起動

最後に、コンテナを起動してみましょう。

コンテナの起動もコマンドを1つ実行するだけです。

> podman run -d -p 8080:8080 localhost/my-app      
bd33f23fc9181286ee52c929f8fb8badbe5ff670f3758babff4de14bb7eec039

コンテナが起動したことを確認してみましょう。

> podman ps
CONTAINER ID  IMAGE                    COMMAND               CREATED         STATUS         PORTS                   NAMES
bd33f23fc918  localhost/my-app:latest  sh -c ${JBOSS_CON...  25 seconds ago  Up 26 seconds  0.0.0.0:8080->8080/tcp  great_liskov

アプリケーションにアクセスしてみましょう。 今回のアプリケーションは、WARの中でコンテキストパスは変更していないためmy-appが使われます。 そのため、アクセスするURLはlocalhost:8080/my-app/<アプリ内のパス>です。 コンテキストパスを変更している場合は、my-appの部分をそちらのパスへ変更してください。 アクセスするツールは Servlet/JSP であればブラウザ、JAX-RS であれば REST Client を用います。 今回のアプリケーションは JSP なため、ブラウザでアクセスしてみます。

無事に JSP が表示されました。

いかがでしたでしょうか。 既存アプリケーションのWARファイルがあれば簡単にコンテナイメージが作成できました。 Jakarta EEアプリケーションのコンテナ化は、難しそうなイメージがあるかもしれませんが、興味のある方はぜひ試してみてください。

参考

3.4. OpenShift へのサードパーティーアプリケーションのデプロイ | Red Hat Product Documentation

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。