このガイドでは、Mavenとdocker-maven-pluginを使用してJavaウェブアプリケーションのDockerイメージを構築し、コンテナとして実行する手順を解説します。主にSpring Bootアプリケーションを想定していますが、他のJavaアプリケーションにも適用可能です。
1. Maven設定: pom.xmlへのプラグイン追加
まず、プロジェクトのpom.xmlにdocker-maven-pluginを追加して、Dockerイメージのビルドプロセスを自動化します。以下の設定例では、プロジェクトのJARファイルをDockerイメージ内にコピーし、イメージ名を指定しています。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 単体テストをスキップしてパッケージングを高速化 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<!-- Dockerイメージ構築のためのMavenプラグイン設定 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version> <!-- 必要に応じてバージョンを更新してください -->
<configuration>
<!-- Dockerデーモンが稼働しているホストのアドレス -->
<!-- ローカルのUnixソケットを使用。リモートデーモンの場合は tcp://HOST:PORT 形式で指定 -->
<dockerHost>unix:///var/run/docker.sock</dockerHost>
<!-- 構築するDockerイメージの名前とタグ -->
<imageName>${project.artifactId}:${project.version}</imageName>
<!-- 同じタグのイメージが存在する場合に上書きを許可 -->
<forceTags>true</forceTags>
<!-- Dockerfileが配置されているディレクトリ -->
<dockerDirectory>src/main/docker</dockerDirectory>
<!-- ビルド成果物 (JARファイル) をDockerイメージのルートディレクトリにコピー -->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
2. Dockerfileの作成
次に、src/main/dockerディレクトリ内にDockerfileを作成します。このファイルは、Dockerイメージの構築方法を定義します。ここでは、Java 17の軽量版をベースイメージとして使用し、アプリケーションのJARファイルをコンテナにコピーし、起動コマンドを設定しています。
# ベースイメージとしてOpenJDK 17の軽量版 (slim) を使用
FROM openjdk:17-jdk-slim
# アプリケーションが一時ファイルを書き込む可能性のあるボリュームを定義
VOLUME /tmp
# コンテナ内で使用する環境変数を設定
# コンテナ起動時に -e オプションでこれらの値を上書き可能
ENV SERVER_PORT=8080
ENV APP_CONTEXT_ROOT=/
# ホストからビルドされたJARファイルをコンテナのルートディレクトリにコピーし、app.jarとしてリネーム
ADD *.jar app.jar
# コンテナが起動したときに実行されるコマンド
# Javaアプリケーションを起動し、環境変数からポートとコンテキストルートを読み込む
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "-Dserver.port=${SERVER_PORT}", "-Dserver.servlet.context-path=${APP_CONTEXT_ROOT}", "/app.jar"]
3. Dockerイメージの構築とコンテナの実行
設定が完了したら、以下のMavenコマンドでアプリケーションをパッケージングし、Dockerイメージを構築できます。
mvn clean package docker:build
イメージが正常に構築されたら、以下のコマンドでDockerコンテナとしてアプリケーションを起動します。この例では、ホストの8081ポートをコンテナの8080ポートにマッピングし、コンテナの環境変数APP_CONTEXT_ROOTを/apiに設定しています。
docker run -d --name my-java-service -p 8081:8080 -e SERVER_PORT=8080 -e APP_CONTEXT_ROOT=/api my-artifact-id:1.0.0
コンテナのログを確認するには、以下のコマンドを使用します。
docker logs -f my-java-service