Docker 環境で Java JAX-RS Webサービスを起動する
こんにちは、@studio_meowtoon です。今回は、WSL Ubuntu 22.04 の Docker 環境で Java JAX-RS Web アプリケーションをコンテナとして起動する方法を紹介します。
目的
Windows 11 の Linux でクラウド開発します。
こちらから記事の一覧がご覧いただけます。
実現すること
ローカル環境の Ubuntu の Docker 環境で、Dockerfile からビルドした Java JAX-RS Web サービスのカスタムコンテナを起動します。
WAR ファイル形式のアプリをコンテナとして起動
実行環境
要素 | 概要 |
---|---|
terminal | ターミナル |
Ubuntu | OS |
Docker | コンテナ実行環境 |
Web サービス コンテナ
要素 | 概要 |
---|---|
app-hello-jaxrs | カスタムコンテナ |
JVM | Java 実行環境 |
jetty | Web サーバー |
app.war | Java アプリケーション |
技術トピック
Dockerfile とは?
こちらを展開してご覧いただけます。
Dockerfile
Dockerfile は、Docker コンテナを構築するためのテキストファイルです。Docker コンテナはアプリケーションやサービスを実行するための環境を含む軽量でポータブルな仮想化ユニットです。
キーワード | 内容 |
---|---|
スクリプト形式 | Dockerfile はシンプルなスクリプト形式で記述されるため、コンテナのビルドプロセスを自動化することが容易です。 |
レイヤー構造 | Docker イメージは Dockerfile の各命令が実行される際にレイヤーとして生成され、再利用やキャッシュが可能な構造となっています。 |
バージョン管理 | Dockerfile はテキストベースであるため、コードと同様にバージョン管理システムで管理しやすいです。 |
ポータビリティ | Dockerfile により、アプリケーションとその依存関係が1つのコンテナイメージにパッケージ化されるため、異なる環境間での移植性が高まります。 |
自動化と効率化 | Dockerfile を使用することで、アプリケーションのビルドや環境構築を自動化できます。これにより、手動での作業時間やヒューマンエラーが減り、開発・デプロイプロセスが効率的になります。 |
再現性 | Dockerfile はビルド手順を完全に定義するため、異なる環境で同じアプリケーションを再現できます。これにより、開発、テスト、本番環境間での一貫性が確保されます。 |
環境の分離 | Docker コンテナはホストシステムから分離されるため、アプリケーションの依存関係やライブラリの衝突を回避し、より安全な環境で実行できます。 |
拡張性 | Dockerfile を使用することで、カスタムイメージを作成することができます。このため、特定のニーズに合わせてカスタマイズされたコンテナイメージを容易に作成できます。 |
開発環境
- Windows 11 Home 22H2 を使用しています。
WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
WSL (Microsoft Store アプリ版) ※ こちらの関連記事からインストール方法をご確認いただけます
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
Ubuntu ※ こちらの関連記事からインストール方法をご確認いただけます
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Java JDK ※ こちらの関連記事からインストール方法をご確認いただけます
$ java -version
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
Maven ※ こちらの関連記事からインストール方法をご確認いただけます
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.18, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Docker ※ こちらの関連記事からインストール方法をご確認いただけます
$ docker --version
Docker version 23.0.1, build a5ee5b1
この記事では基本的に Ubuntu のターミナルで操作を行います。Vim を使用してコピペする方法を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。
作成する Web アプリケーションの仕様
No | エンドポイント | HTTPメソッド | MIME タイプ |
---|---|---|---|
1 | /api/data | GET | application/json |
/api/data というエンドポイントに対して HTTP GET リクエストを送信すると、JSON データがレスポンスされるシンプルな Web サービスを実装します。
{"message":"Hello World!"}
Hello World を表示する手順
Java JAX-RS Web サービスの作成
こちらの関連記事で手順がご確認いただけます。
アプリケーションのメインコード
package com.example.jaxrs;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("api")
public class HelloResource {
@GET
@Path("data")
@Produces(MediaType.APPLICATION_JSON)
public Map<String, String> getData() {
Map<String, String> map = Map.of("message", "Hello World!");
return map;
}
}
プロジェクトフォルダに移動
プロジェクトフォルダに移動します。
※ ~/tmp/hello-jaxrs をプロジェクトフォルダとします。
$ cd ~/tmp/hello-jaxrs
アプリのビルド
Java アプリをビルドします。
※ target/app.war が作成されます。
$ mvn clean package
ここまでの手順で、ローカル環境の Ubuntu に WAR ファイル形式のアプリをビルドすることができました。
コンテナイメージの作成
Dockerfile を作成します。
$ vim Dockerfile
ファイルの内容
# set up the container.
FROM jetty:10.0.15-jre11-alpine
# copy the app as context root.
COPY target/*.war /var/lib/jetty/webapps/ROOT.war
# expose the port.
EXPOSE 8080
# command to run the app using jetty.
CMD ["java","-jar","/usr/local/jetty/start.jar"]
Docker デーモンを起動します。
$ sudo service docker start
* Starting Docker: docker [ OK ]
Docker 環境をお持ちでない場合は、以下の関連記事から Docker Engine のインストール手順をご確認いただけます。
コンテナイメージをビルドします。
$ docker build \
--no-cache \
--tag app-hello-jaxrs:latest .
コンテナイメージを確認します。
$ docker images | grep app-hello-jaxrs
app-hello-jaxrs latest a810eb763163 9 seconds ago 185MB
ここまでの手順で、ローカル環境の Docker にアプリのカスタムコンテナイメージをビルドすることができました。
コンテナを起動
ローカルでコンテナを起動します。
※ コンテナを停止するときは ctrl + C を押します。
$ docker run --rm \
--publish 8080:8080 \
--name app-local \
app-hello-jaxrs:latest
ここまでの手順で、ローカル環境の Docker でアプリのカスタムコンテナを起動することができました。
コンテナの動作確認
別ターミナルから curl コマンドで確認します。
$ curl -v http://localhost:8080/api/data -w '\n'
出力
* Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api/data HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json
< Content-Length: 26
< Server: Jetty(10.0.15)
<
* Connection #0 to host localhost left intact
{"message":"Hello World!"}
ここまでの手順で、ターミナルに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
コンテナの状態を確認してみます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81f317bf4f61 app-hello-jaxrs:latest "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp app-local
コンテナに接続
別ターミナルからコンテナに接続します。
$ docker exec -it app-local /bin/sh
コンテナに接続後にディレクトリを確認します。
※ コンテナから出るときは ctrl + D を押します。
$ pwd
/var/lib/jetty
$ cd webapps
$ ls -lah
total 6M
drwxr-xr-x 1 jetty jetty 4.0K Aug 1 06:59 .
drwxr-sr-x 1 jetty jetty 4.0K Aug 1 07:04 ..
-rw-r--r-- 1 root root 6.2M Aug 1 06:05 ROOT.war
top コマンドで状況を確認します。
Mem: 4677204K used, 3409432K free, 2032K shrd, 182556K buff, 1859192K cached
CPU: 0% usr 0% sys 0% nic 99% idle 0% io 0% irq 0% sirq
Load average: 0.00 0.02 0.07 1/569 113
PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND
1 0 jetty S 3576m 44% 4 0% /opt/java/openjdk/bin/java -Djetty.home=/usr/local/jetty -Djetty.base=/var/lib/jetty --class-path /var/lib/jet
106 0 jetty S 1672 0% 5 0% /bin/sh
113 106 jetty R 1600 0% 6 0% top
コンテナの情報を表示してみます。
$ cat /etc/*-release
3.18.2
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.18.2
PRETTY_NAME="Alpine Linux v3.18"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
このコンテナは Alpine Linux をベースに作成されています。つまり、Linux と同じように扱うことができます。
まとめ
WSL Ubuntu の Docker 環境で、Dockerfile からビルドした Java JAX-RS Web サービスのカスタムコンテナを起動することができました。
クラウド開発においては、Dockerfile の理解は重要です。自動ビルドツールもありますが、手動で書く必要があるケースもあります。Ubuntu を使うと Linux の知識も身に付きます。最初は難しく感じるかもしれませんが、徐々に進めていけば自信を持って書けるようになります。
どうでしたか? WSL Ubuntu で、Java JAX-RS Web アプリケーションを Docker 環境でコンテナとして手軽に起動することができます。ぜひお試しください。今後も Java の開発環境などを紹介していきますので、ぜひお楽しみにしてください。
推奨コンテンツ
関連記事