JAVA

JavaアプリをDocker化する手順とベストプラクティス | Maven/Gradle対応

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

1. Java アプリケーションの準備

このセクションでは、ローカルでビルドが成功している前提として Maven または Gradle を使った標準的な手順と、JDK バージョン選定のポイントを整理します。ローカルとコンテナ環境で同一 JDK を使用することで「動くはずがローカルだけ」問題を防げます。

1‑1. ビルドツール別セットアップ手順

Maven と Gradle はどちらも公式にサポートされているビルドシステムです。以下では、プロジェクトの雛形作成から依存関係定義、テスト実行までを具体的に示します。

Maven プロジェクトの雛形作成

Gradle (Groovy DSL) プロジェクトの雛形作成

依存関係の定義例(Spring Boot 3.2 系)

ビルドツール ファイル名 主要依存関係サンプル
Maven pom.xml xml<br><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.2.0</version></dependency><br>
Gradle build.gradle groovy<br>implementation 'org.springframework.boot:spring-boot-starter-web:3.2.0'<br>

テストの実行

ビルド時に自動で単体テストが走ります。失敗した場合は ローカルで必ず修正 し、CI に流す前にグリーン状態を確保してください。

ポイント:テストが成功していることはコンテナ化後のトラブル防止に直結します。

1‑2. JDK バージョン選定と環境変数設定

長期サポート (LTS) が保証された OpenJDK 17(または Oracle JDK 17)を推奨します。Docker イメージでも同一バージョンを使用すれば、ローカルと本番での動作差異がほぼゼロになります。

注意JAVA_HOMEPATH の設定はシェルのプロファイル(例: ~/.bashrc)に永続化しておくと便利です。


2. マルチステージ Dockerfile の作成

この章では、ビルドステージとランタイムステージを分離した マルチステージ Dockerfile を作り、不要ファイルの除外や非 root ユーザー設定によるセキュリティ向上手法を解説します。

2‑1. .dockerignore のベストプラクティス

Docker ビルド時にコンテナへコピーされるファイルは 最小限 に抑えるべきです。以下は一般的な Java プロジェクトで推奨する .dockerignore の例です。

  • target/ / build/:ビルド成果物はステージングで生成するため除外
  • .git/ 系:リポジトリ情報は不要
  • IDE 関連ファイル (.idea/, *.iml):コンテナサイズを増やすだけ

ポイント.dockerignore が適切に設定されていれば、ビルドキャッシュのヒット率が上がり、CI の実行時間も短縮できます。

2‑2. マルチステージ Dockerfile(完全版)

ヘルスチェックの条件付き説明

  • Spring Actuator が導入済み/actuator/health が推奨エンドポイントです。
  • Actuator 未導入の場合:上記 Dockerfile では curl http://localhost:8080/health にフォールバックします(標準的な /health エンドポイントを自前で実装するか、単にステータスコード 200 を返すシンプルなサーブレットでも可)。

このように 2 段階のチェック を入れることで、ヘルスチェックが原因でコンテナが再起動するリスクを低減できます。


3. ローカルでのイメージビルドとテスト

ローカル環境でイメージが期待通りに動くか確認した後にレジストリへプッシュします。タグ付けやヘルスチェック結果の取得方法を具体例と共に示します。

3‑1. ビルドコマンドとタグ戦略

  • 1.2.3:セマンティックバージョニングで明示的に管理
  • latest:常に最新イメージとして参照できるエイリアス

3‑2. コンテナ起動とヘルスチェック確認

期待される出力例

ポイントcurl http://localhost:8080/actuator/health200 を返すことをローカルで手動確認できれば、本番環境でも同様に機能する可能性が高いです。


4. コンテナレジストリへのプッシュと管理

安全にイメージを共有・デプロイできるよう、Docker HubGitHub Container Registry (GHCR) の両方でプッシュ手順を示します。シークレットは必ず GitHub Secrets 等で暗号化して扱います。

4‑1. Docker Hub へのプッシュ

  • 公式情報:Docker Hub の無料プランはパブリックレポジトリ 1 GB、プライベートレポジトリ 1 GB が上限です(2024 年 5 月時点)。最新の制限は Docker Hub Pricing を参照してください。

4‑2. GitHub Packages / GHCR へのプッシュ例

ポイントGHCR_TOKENwrite:packages, delete:packages 権限を持つ Personal Access Token を使用してください。


5. 本番環境へのデプロイ

ここでは、Back4App ContainersAWS EC2(Docker Run) の二つの代表的なデプロイ先について、設定手順と注意点を詳述します。

5‑1. Back4App Containers のデプロイ手順

Back4App はサーバーレスに近いコンテナホスティングサービスで、無料プランでも 1 CPU・2 GB RAM(2024 年 5 月時点)を利用可能です。公式情報は以下のページをご確認ください。
👉 https://www.back4app.com/pricing

※ 本記事執筆時点の情報です。最新プランは必ず公式サイトでご確認ください。

デプロイフロー(UI 操作中心)

  1. コンテナプロジェクト作成
  2. Back4App ダッシュボード → New Container Project → 名前と対象レジストリ(Docker Hub または GHCR)を指定。

  3. 環境変数・シークレット設定

  4. DATABASE_URL, API_KEY など機密情報は UI の Secrets タブで登録し、コンテナ起動時に自動注入します。

  5. ポートとヘルスチェックの定義

  6. 公開ポート:8080(Spring Boot デフォルト)
  7. ヘルスエンドポイント:/actuator/health か、前述のフォールバック先 /health を選択。

  8. 自動デプロイ設定

  9. Deploy on push オプションを有効化すると、GitHub のリポジトリに新しいタグがプッシュされた瞬間に Back5App が最新イメージを取得し再起動します。

重要なベストプラクティス

項目 推奨設定
CPU/メモリ上限 無料枠の 1 CPU・2 GB RAM を超えないように、JVM オプションでヒープサイズを -Xmx768m 程度に抑える
ログ出力先 標準出力 (System.out) に集約し、Back4App のログビューアで確認できる形にする
スケールアウト 必要に応じて有料プランへアップグレードし、水平スケーリングを利用

5‑2. AWS EC2(Docker Run)での本番構成

AWS 上で従来型の VM に Docker コンテナを直接走らせるケースです。インスタンスは t3.medium (2 vCPU・4 GB RAM) を最低ラインとし、必要に応じてスケールアウトします。

手順概要

  1. EC2 インスタンス作成
  2. Amazon Linux 2023 AMI → t3.medium 推奨(無料枠対象外の場合は t3.nano でも可)

  3. Docker のインストールと起動

  1. イメージ取得と実行

  1. systemd ユニットで永続的に管理(再起動時の自動復旧)

AWS での追加安全策

項目 推奨設定
セキュリティグループ インバウンドは 80443 のみ許可、他ポートは遮断
IAM ロール EC2 に最小権限のロールを付与し、ECR からプライベートイメージを取得できるようにする
モニタリング CloudWatch メトリクスと docker logs を組み合わせてヘルスチェック結果も可視化

6. CI/CD パイプライン構築とトラブルシューティング

自動化は手作業ミスを防ぎ、デプロイ速度を劇的に向上させます。以下では GitHub Actions を例に、ビルド・テスト・Docker イメージ生成・レジストリプッシュ・Back4App デプロイまでのフローを示します。

6‑1. 完全版 GitHub Actions ワークフロー

ワークフローのポイント

  • ビルドキャッシュdocker build の前に actions/cache@v3 を入れると Maven と Docker レイヤーが再利用でき、実行時間が 30 % 程度短縮します。
  • シークレット管理DOCKERHUB_PASSRead‑only の Personal Access Token(レジストリへのプッシュ権限のみ)を使用し、漏洩リスクを最小化。

6‑2. よくあるエラーと対処法チェックリスト

エラーシナリオ 原因例 推奨対策
Port already allocated(ポート競合) 同一ホスト上で別コンテナが 8080 を占有 docker ps で確認し、-p 8081:8080 のようにマッピング変更
OutOfMemoryError(メモリ不足) コンテナに割り当てた RAM が JVM デフォルトより小さい -e JAVA_OPTS="-Xmx512m" をコンテナ起動時に追加、または EC2 のインスタンスタイプを上位へ
ヘルスチェックが失敗する アプリ起動遅延や Actuator 未導入 HEALTHCHECK--start-period=30s を付与し、フォールバックエンドポイント /health を実装
CI で Docker Hub ログイン失敗 シークレット名ミスマッチ、トークン権限不足 GitHub Secrets → 正しいキー名かつ write:packages, delete:packages 権限を持つ PAT を再作成
ビルドキャッシュが無視される .dockerignore が不適切で頻繁にコピー対象が変わる 必要最小限のファイルだけ COPY し、pom.xml のみ先行コピーして依存関係レイヤーを固定化

トラブルシューティングのコツ:エラーは「ローカル再現できるか」→「CI 環境変数・シークレットの有無」→「コンテナ起動オプション」の順に切り分けて調査すると、原因特定が格段に速くなります。


7. まとめ

1️⃣ ローカルビルドは Maven/Gradle + JDK 17 で統一し、テストを必ずパスさせる
2️⃣ マルチステージ Dockerfile によりイメージサイズ ≤ 100 MB、.dockerignore と非 root ユーザーでセキュリティ強化
3️⃣ ヘルスチェックは Actuator 有無に応じたフォールバック を組み込み、本番環境の自動復旧を保証
4️⃣ レジストリは Docker Hub / GHCR 両方で管理し、タグ付け戦略(バージョン + latest)でロールバックも容易に
5️⃣ Back4App の無料プランは 1 CPU・2 GB RAM が上限。最新情報は公式ページ(https://www.back4app.com/pricing)を必ず確認
6️⃣ AWS EC2 でも systemd ユニットと --restart unless-stopped を併用 すれば、インフラ障害時の二重保護が実現
7️⃣ GitHub Actions による CI/CD がビルド・テスト・デプロイを自動化し、エラーはチェックリストで迅速に解決

以上の手順とベストプラクティスを踏めば、Java アプリケーションを Docker コンテナとして 安全・高速・低コスト に本番環境へ展開できます。ぜひ実際にサンプルリポジトリ(例: github.com/your-org/java-docker-sample)をクローンし、手順どおりに試してみてください。質問や改善点があれば、GitHub Issues でお気軽にフィードバックいただけると嬉しいです。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-JAVA