JavaアプリケーションのDockerコンテナ化: イメージ構築と実行

このガイドでは、Mavenとdocker-maven-pluginを使用してJavaウェブアプリケーションのDockerイメージを構築し、コンテナとして実行する手順を解説します。主にSpring Bootアプリケーションを想定していますが、他のJavaアプリケーションにも適用可能です。

1. Maven設定: pom.xmlへのプラグイン追加

まず、プロジェクトのpom.xmldocker-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

タグ: Docker Java Spring Boot Maven Dockerfile

7月2日 22:51 投稿