M1 MacでJettyのDockerコンテナを試す
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/
とルートに設定されます。
よって今回は以下の戦略でやります。
- ビルドしたファイルが
ROOT.war
になるようにpom.xmlを設定 - 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