Docker コンテナで Java EE アプリケーションの起動コマンドを設定する方法

DockerBeginner
オンラインで実践に進む

はじめに

Docker は、Java EE (エンタープライズ・エディション) アプリケーションを含む、アプリケーションの開発、パッケージ化、デプロイ方法を革命的に変えました。このチュートリアルでは、Docker コンテナ内で実行される Java EE アプリの起動コマンドを設定する手順を案内し、Web アプリケーションのシームレスなデプロイと実行を保証します。

Docker コンテナの概要

Docker は、開発者がアプリケーションを一貫性があり再現可能な方法でパッケージ化およびデプロイできるようにする、人気のコンテナ化プラットフォームです。コンテナは、アプリケーション、その依存関係、必要な実行環境をカプセル化する軽量、スタンドアロン、自己完結型のユニットです。

Docker コンテナとは?

Docker コンテナは、アプリケーションのコード、依存関係、設定を単一の、移植可能で実行可能なパッケージにまとめた、標準化されたソフトウェアユニットです。コンテナはホストオペレーティングシステムや他のコンテナから隔離されているため、一貫性があり信頼性の高いアプリケーションデプロイを保証します。

Docker コンテナを使用する利点

  • 一貫した環境: コンテナは、アプリケーションとその依存関係をまとめてパッケージ化するため、「私のマシンでは動作する」という問題を解消します。
  • スケーラビリティと柔軟性: コンテナは簡単にスケールアップまたはスケールダウンでき、効率的なリソース利用と迅速なアプリケーションデプロイを可能にします。
  • 移植性: コンテナ化されたアプリケーションは、基盤となるインフラストラクチャに関係なく、Docker をサポートするあらゆるシステムで実行できます。
  • 効率の向上: コンテナは軽量で、ホストオペレーティングシステムのカーネルを共有するため、起動時間が短縮され、リソース消費が削減されます。

Docker アーキテクチャ

Docker はクライアント - サーバーアーキテクチャを使用しており、Docker クライアントは Docker デーモンと通信します。Docker デーモンは、Docker コンテナの構築、実行、管理を担当します。

graph LD
    subgraph Docker アーキテクチャ
        client([Docker クライアント])
        daemon([Docker デーモン])
        client -- API --> daemon
        daemon -- イメージ/コンテナ --> storage([Docker ストレージ])
    end

Docker のインストールと設定

Docker を始めるには、システムに Docker エンジンをインストールする必要があります。インストール手順はオペレーティングシステムによって異なります。このチュートリアルでは、Ubuntu 22.04 を例として使用します。

## Ubuntu 22.04 で Docker をインストール
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

Docker がインストールされたら、次のコマンドを実行してインストールを確認できます。

docker version

これにより、Docker クライアントとデーモンのバージョン情報が表示されます。

Java EE アプリケーションの起動コマンドの設定

Docker コンテナ内で Java EE アプリケーションを実行する際には、アプリケーションがコンテナ内で適切に起動および管理されるように、起動コマンドを設定する必要があります。

起動コマンドについて

Docker コンテナ内の Java EE アプリケーションの起動コマンドは、通常、Dockerfile 内の CMD または ENTRYPOINT 指令を使用して定義されます。CMD 指令は、コンテナ起動時に実行されるデフォルトのコマンドを指定し、ENTRYPOINT 指令はコンテナの基本コマンドを設定します。

以下は、Java EE アプリケーションの起動コマンドを設定する Dockerfile の例です。

FROM openjdk:11-jdk-slim
COPY target/my-java-ee-app.war /app/
WORKDIR /app
CMD ["java", "-jar", "my-java-ee-app.war"]

この例では、CMD 指令により、java -jar my-java-ee-app.war コマンドを実行することで Java EE アプリケーションが起動されるように指定されています。

起動コマンドのカスタマイズ

場合によっては、Java EE アプリケーションの起動コマンドをカスタマイズする必要がある場合があります。これは、Dockerfile 内の CMD または ENTRYPOINT 指令を変更することで実現できます。

たとえば、Java EE アプリケーションが追加のコマンドライン引数または環境変数が必要な場合、CMD 指令を次のように変更できます。

FROM openjdk:11-jdk-slim
COPY target/my-java-ee-app.war /app/
WORKDIR /app
CMD ["java", "-Xmx512m", "-Dmy.app.env=production", "-jar", "my-java-ee-app.war"]

この例では、CMD 指令に、コンテナ起動時に Java コマンドに渡される追加の JVM オプション (-Xmx512m) とカスタム環境変数 (-Dmy.app.env=production) が含まれています。

起動コマンドのオーバーライド

docker run コマンドを使用して、Docker コンテナの起動コマンドをオーバーライドすることもできます。これは、コンテナ内で異なるコマンドまたはスクリプトを実行する必要がある場合、またはアプリケーションにさらに引数を渡したい場合に便利です。

docker run -d -p 8080:8080 my-java-ee-app-image java -jar /app/my-java-ee-app.war --spring.profiles.active=dev

この例では、docker run コマンドは Dockerfile で定義された起動コマンドをオーバーライドし、特定の Spring プロファイル (--spring.profiles.active=dev) を使用して Java EE アプリケーションを実行します。

Docker での Java EE アプリケーションのデプロイ

Java EE アプリケーションの起動コマンドを設定したら、Docker イメージの構築とデプロイに進みます。

Docker イメージの構築

Java EE アプリケーションの Docker イメージを構築するには、docker build コマンドを使用します。現在のディレクトリに Dockerfile があると仮定すると、以下のコマンドを実行できます。

docker build -t my-java-ee-app .

これにより、Dockerfile の指示に基づいて、タグ my-java-ee-app の新しい Docker イメージが作成されます。

Docker コンテナの実行

Docker イメージを構築したら、docker run コマンドを使用して Docker コンテナ内で Java EE アプリケーションを実行できます。

docker run -d -p 8080:8080 my-java-ee-app

このコマンドは、my-java-ee-app イメージに基づいて新しいコンテナを起動し、ホストのポート 8080 をコンテナのポート 8080 にマッピングします。

デプロイの検証

Docker コンテナ内で Java EE アプリケーションが正しく実行されていることを確認するには、以下のコマンドを使用できます。

## 実行中のコンテナ一覧

## 実行中のコンテナのログ表示

## Web ブラウザでアプリケーションにアクセス

docker ps コマンドは、Java EE アプリケーションを実行しているコンテナを含む、すべての実行中のコンテナをリストします。その後、docker logs コマンドを使用してアプリケーションログを表示し、アプリケーションが正しく起動したことを確認できます。

最後に、Web ブラウザで http://localhost:8080 にアクセスして、実行中のアプリケーションにアクセスできます。

アプリケーションのスケーリング

Docker で Java EE アプリケーションを実行する主な利点の 1 つは、アプリケーションを簡単にスケーリングできることです。トラフィックまたは負荷が増加した場合、Docker コンテナの複数のインスタンスを実行できます。

アプリケーションをスケーリングするには、Docker Compose や Kubernetes などのコンテナオーケストレーションプラットフォームを使用できます。これらのツールを使用すると、必要なコンテナインスタンス数を定義し、アプリケーションのデプロイとスケーリングを自動的に管理できます。

以下は、Java EE アプリケーションのスケーラブルなデプロイを定義する Docker Compose ファイルの例です。

version: "3"
services:
  app:
    image: my-java-ee-app
    ports:
      - 8080:8080
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        order: rolling-update

この例では、deploy セクションで、アプリケーションを 3 つのレプリカでデプロイし、更新をローリングアップデート戦略で実行するように指定しています。

まとめ

このチュートリアルで説明した手順に従うことで、Docker コンテナ内で実行される Java EE アプリケーションの起動コマンドを適切に設定する方法を学習できます。この知識は、Docker コンテナの力と柔軟性を活用して、Web アプリケーションの円滑なデプロイと実行を確実にするのに役立ちます。