M1 MacでJettyのDockerコンテナを試す

2023/07/02に公開

Jettyは起動が早くJava製のWebアプリの動作確認をするのに使い勝手が良いと思っています。
動作確認だけでなく本番環境への使用にも耐える実績もあり、一回は試してみたいところです。

Jettyの公式Dockerイメージがあったので、とりあえず動くまでにやったことを共有します。
M1 macもJettyも癖があるので、その辺を押さえれば動くと思います。

とにかく試す目的なので各所ガバガバ設定がありますがご容赦下さい。細かいところは各自で微調整いただければと思います。

開発環境

OS: macOS Monterey
CPU: Apple M1
RAM: 16GB

Java:

$ java -version
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment 18.9 (build 11.0.10+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.10+9, mixed mode, sharing)

ビルドツール: Maven 3.6.3

やろうとしていること

Javaプロジェクトをwarファイルにビルドし、Jetty DockerコンテナにDeployします。

コンテナのバージョン選び

M1 MacはCPUの命令セットがarm64なので、arm64に対応しているイメージを選びましょう(重要)。 対応していないTagを選ぶとうまく動かないと思います。

当然ですが、Javaのバージョンがあっていることも確認しましょう。

今回はJava11なので、jetty:9.4.51-jdk11-amazoncorrettoを採用してみました。

実際の設定方法

Jetty Dockerの公式Documentに

Deployment

Webapps can be deployed under /var/lib/jetty/webapps in the usual ways (WAR file, exploded WAR directory, or context XML file). To deploy your application to the / context, use the name ROOT.war, the directory name ROOT, or the context file ROOT.xml (case insensitive).
For older EOL'd images based on Jetty 7 or Jetty 8, please follow the legacy instructions on the Eclipse Wiki and deploy under /usr/local/jetty/webapps instead of /var/lib/jetty/webapps.

とあります。つまりWARファイルをアップロードする方針の場合、コンテナ内に/var/lib/jetty/webapps/ROOT.warを突っ込んであげるのが一番シンプルです。こうするとWebアプリのエントリーポイントがhttp://<ipアドレス>:8080/とルートに設定されます。

よって今回は以下の戦略でやります。

  1. ビルドしたファイルがROOT.warになるようにpom.xmlを設定
  2. ROOT.warをdockerコンテナにマウント

pom.xml

pom.xmlに以下を追加します。

<project>
  ...略
  <packaging>war</packaging>
  ...略
  <build>
    <directory>${project.basedir}/target</directory>
    <finalName>ROOT</finalName>
    ...略
  </build>
  ...略
</project>

こうすると、mvn claen packageとかした時に<project.basedir>/target/ROOT.warが生成されます。
略の部分はご自身のプロジェクトに合わせてください。

docker設定

今回はdocker composeでやります。コマンドでも可能です。

version: "3"
services:
  jetty:
    image: jetty:9.4.51-jdk11-amazoncorretto 
    environment:
      JAVA_OPTIONS: "-Djetty.port=8989"
    ports:
      - 8989:8989
    volumes:
      - <project.basedir>/target/ROOT.war:/var/lib/jetty/webapps/ROOT.war

ポートを変更したければ環境変数-Djetty.portを好きな値に変更してください。

動作確認

ターミナルなら

curl localhost:8989

を叩いて正しい応答があればOK。

ブラウザならlocalhost:8989で正しいページが表示されればOKです。

Discussion