前回までで、アプリケーションの品質を保証するためのテスト技法を習得しました。これで、堅牢なSpring Bootアプリケーションが完成したと言えます。
次に重要なのは、開発したアプリケーションを**本番環境にデプロイ(配置)**し、安定稼働させることです。このデプロイにおいて、現代のITインフラでデファクトスタンダードになっているのが、コンテナ技術、特に Docker です。
今回は、Dockerとは何か、そしてSpring Bootアプリケーションをコンテナ化するために必要なDockerfileの基本的な書き方を学びます。
1. Dockerとコンテナの概念
アプリケーションをデプロイする際、「開発環境では動いたのに、本番環境では動かない」という問題がよく発生します。これは、OSのバージョン、ライブラリ、Javaのバージョンなど、実行環境の違いが原因です。
Docker(ドッカー)は、この実行環境をコンテナという形でパッケージングし、どこでも同じように動作させることを可能にします。
1-1. 仮想マシンとの違い
従来の**仮想マシン(VM)**は、OS全体を仮想化するため、起動が遅く、リソース消費が大きいという欠点がありました。
一方、コンテナは、ホストOSのカーネルを共有し、アプリケーションとその実行に必要な最小限のファイルだけを隔離して動作させます。
- コンテナの利点: 軽量で高速に起動し、リソース消費が少ないため、デプロイやスケーリング(拡張)が非常に容易です。
2. Dockerfileの役割と基本コマンド
**Dockerfile(ドッカーファイル)**は、コンテナイメージを作成するための設計図となるテキストファイルです。コンテナの中で実行する環境、ファイル、設定などを記述します。
2-1. Dockerfileの基本的な書き方
Spring Bootアプリケーション(JARファイル)をコンテナ化するDockerfileの基本構成を見てみましょう。
| コマンド | 役割 | 説明 |
| FROM | ベースイメージの指定 | コンテナの土台となるOSや実行環境(例:Javaランタイム)を指定します。 |
| ARG | ビルド引数の定義 | ビルド時に外部から渡す変数(例:JARファイルのバージョン)を定義します。 |
| COPY | ファイルのコピー | ホストOS(ローカル)のファイルをコンテナ内にコピーします。 |
| WORKDIR | 作業ディレクトリの設定 | コンテナ内でコマンドを実行する際の基準ディレクトリを設定します。 |
| ENTRYPOINT | コンテナ起動時のコマンド | コンテナが起動したときに常に実行されるメインコマンドを指定します。 |
2-2. Spring Bootアプリケーション向けDockerfileの例
Dockerfile
# 1. ベースイメージの指定 (FROM)
# Java実行環境のみを含む軽量なOpen JREイメージを使用
FROM eclipse-temurin:17-jre-focal
# 2. ビルド引数の定義
ARG JAR_FILE=target/demo-0.0.1-SNAPSHOT.jar
# 3. コンテナ内の作業ディレクトリを設定 (WORKDIR)
WORKDIR /app
# 4. JARファイルをコンテナ内にコピー (COPY)
# ホスト側のJAR_FILEを変数名app.jarとしてコンテナの/appディレクトリにコピー
COPY ${JAR_FILE} app.jar
# 5. アプリケーションのポートを公開(情報として)
EXPOSE 8080
# 6. コンテナ起動時の実行コマンド (ENTRYPOINT)
# app.jarを実行するJavaコマンドを指定。コンテナを起動するとこれが実行される
ENTRYPOINT ["java", "-jar", "app.jar"]
3. Dockerイメージのビルドと実行
3-1. イメージのビルド(docker build)
Dockerfileが配置されているディレクトリで、以下のコマンドを実行し、コンテナイメージを作成します。
Bash
# イメージ名: spring-app、タグ: latest を付けてビルド
docker build -t spring-app:latest .
このコマンドを実行すると、Dockerfileに書かれた手順が上から順に実行され、再利用可能な spring-app:latest というイメージがローカルに作成されます。
3-2. コンテナの実行(docker run)
作成したイメージを使って、実際にコンテナを起動します。
Bash
# -d: バックグラウンドで実行
# -p 8080:8080: ホストOSの8080ポートをコンテナの8080ポートにマッピング
docker run -d -p 8080:8080 spring-app:latest
これで、Spring Bootアプリケーションがコンテナ内で起動し、ホストOSのブラウザから http://localhost:8080 にアクセスして、アプリケーションに接続できるようになります。
4. まとめ:環境差異の解消
Dockerを利用することで、開発、テスト、本番のどの環境であっても、常に**同じ環境(同じコンテナイメージ)**でアプリケーションを実行できます。これにより、「環境の違いによる不具合」の問題を根本的に解消し、デプロイと運用の効率を劇的に向上させます。
✅ 本日のまとめ
- Dockerは、アプリケーションとその実行環境をコンテナという形でパッケージ化し、環境差異の問題を解消する。
- コンテナはVMと異なり、軽量で高速に起動する。
- Dockerfileは、コンテナイメージを作成するための設計図であり、FROM、COPY、ENTRYPOINTなどのコマンドで構成される。
- Spring Bootアプリケーションは、
java -jar app.jarを ENTRYPOINT に設定することでコンテナ内で実行される。 docker buildでイメージを作成し、docker runでコンテナを起動する。
🔔 次回予告
Dockerでコンテナ化されたアプリケーションは、単独でデプロイされることは稀です。通常、データベース、外部キャッシュ、他のマイクロサービスなど、複数のコンテナと連携して動作します。
次回は、複数のコンテナを一括で定義・管理するためのツール Docker Compose の使い方を学びます。
次回:【第42回】複数コンテナの統合管理!〜Docker Composeの活用〜 にご期待ください!


コメント