DockerとDocker Compose
要旨
DockerとDocker Composeの使用は、開発では非常に推奨されており、プロダクション環境でも良い解決策となります。
- 説明
- 前提条件
- アプリケーションのDockerイメージを構築する
- 複数のアプリケーション用のカスタムDocker-Compose設定の生成
- データベースの操作
- Elasticsearch
- Sonar
- Keycloak
- 共通コマンド
- メモリの調整
Description
注意:このDocker設定は、生成されたアプリケーションをコンテナイメージ内で実行するために使用されます。これは、JHipsterが提供するDocker setupとはまったく異なります。これは、コンテナ_内でJHipsterジェネレータを実行するためのものです。
JHipsterは、次の目的のために、完全なDockerサポートを提供します。
- 開発が容易になります。複雑なマイクロサービスアーキテクチャを使用している場合でも、1つのコマンドで完全なインフラストラクチャを開始できます。
- Docker Swarmを使用しているユーザであれば、同じDocker Compose設定を使用するため、プロダクション環境に直接デプロイできます。
Docker Composeの優れた機能の1つは、docker-compose scale
コマンドを使用してコンテナをスケールできることです。これは、マイクロサービスアーキテクチャでJHipsterを使用する場合に非常に興味深いことです。
アプリケーションを生成するとき、JHipsterは、データベースなどのサードパーティサービスでアプリケーションを実行するのに役立ついくつかのDocker Compose構成を生成します。これらのファイルは、フォルダsrc/main/docker/
内にあります。
前提条件
DockerとDocker Composeをインストールする必要があります。
Docker for MacとDocker for Windowsをダウンロードするには、Dockerストアのアカウントを作成する必要があります。今回はこれを回避します。
WindowsとMac OS Xにおいては、KitematicはDocker Toolboxで提供される使いやすいグラフィカルインタフェースであり、Dockerをより簡単に使用できます。
:::注意
MacまたはWindowsでDocker Machineを使用している場合、DockerデーモンはOS XまたはWindowsファイルシステムへのアクセスが制限されています。Docker Machineは、/Users(OS X)やC:\Users<username>(Windows)ディレクトリを自動共有しようとします。そのため、問題を回避するには、このディレクトリの下にプロジェクトフォルダを作成する必要があります。
:::
JHipster UML(またはバンドルされていないパッケージ)のインストール時にエラーnpm ERR! Error: EACCES: permission denied
が発生した場合は、コンテナにsudo
がインストールされていない可能性があります(たとえば、sudoはUbuntu Xenialにバンドルされていません)。
手順 1
NPMのドキュメントでは、NPMパッケージをルートとしてインストールしないことを推奨しています。これを修正するには、公式ドキュメントに従ってください。
手順 2
docker container exec -u root -it jhipster bash
,npm install -g YOUR_PACKAGE
,- exitしてから
docker container exec -it jhipster bash
でコンテナにログインします。
アプリケーションのDockerイメージの構築と実行
Jibを使用してアプリケーションのDockerイメージを構築するために、ローカルのDockerデーモンに接続します。
- NPM:
npm run java:docker
を実行。Apple Siliconの場合はnpm run java:docker:arm64
となります。 - Maven:
./mvnw package -Pprod verify jib:dockerBuild
- Gradle:
./gradlew -Pprod bootJar jibDockerBuild
Dockerを使用せずにアプリケーションのDockerイメージを構築し、Dockerレジストリに直接プッシュするには、次のコマンドを実行します。
- Maven:
./mvnw package -Pprod verify jib:build -Djib.to.image=<dockerhub-username>/<artifact-id>
- Gradle:
./gradlew -Pprod bootJar jib -Djib.to.image=<dockerhub-username>/<artifact-id>
これがそのままではうまくいかない場合、Jibのドキュメントを参照して、設定の詳細、特にDockerレジストリへの認証の設定方法に関する詳細を確認してください。
Jibの動作原理として、Jibはまず、設定されたDockerレジストリからベースDockerイメージの最新バージョンをプルしようとします。CI環境では、常に最新のパッチが適用されたベースイメージの上に構築する必要があるため、これは意図的な動作です。
ただしローカル環境では、jibがDockerレジストリにアクセスできない場合ビルドに失敗する可能性があります。この回避策は、--offline
フラグを使用することであり、jibがキャッシュ内のベースDockerイメージをすでにプルしている限り、この問題を修正します。
Mavenでは
./mvnw -Pprod package verify jib:dockerBuild --offlineとします。 Gradleでは
./gradlew -Pprod bootJar jibDockerBuild --offlineとします。
jibがキャッシュ内のベースDockerイメージをまだプルしていない場合、それを行うには、pom.xml(Mavenの場合)またはdocker.gradle(Gradleの場合)を修正して、ベースイメージのプレフィックスとしてdocker://
を追加する必要があります("from"タグにネストされた"image"タグの位置に該当します)。
例:
docker://imagename:latestこのようにして、jibはローカルのdockerデーモンにあるイメージをキャッシュに入れます。
このイメージを実行するには、アプリケーションのsrc/main/docker
フォルダにあるDocker Compose設定を使用します。
docker-compose -f src/main/docker/app.yml up
このコマンドによって、アプリケーションとそれに依存するサービス(データベース、検索エンジン、Consul、JHipster Registryなど)が起動されます。
認証にOAuth 2.0を選択した場合は、このドキュメントのKeycloakセクションを必ずお読みください。
複数のアプリケーション用のカスタムDocker-Compose設定の生成
アーキテクチャが複数のJHipsterアプリケーションで構成されている場合は、docker-compose
サブジェネレータを使用して、選択したすべてのアプリケーションに対してグローバルなDocker Compose設定を生成できます。これにより、1つのコマンドでアーキテクチャ全体をデプロイし、スケーリングできます。
docker-compose
サブジェネレータを使用するには以下のようにします。
- すべてのモノリス、ゲートウェイ、マイクロサービスを同じディレクトリに置く必要があります。
mkdir docker-compose
で、別のディレクトリを作成します。cd docker-compose
で、ディレクトリに移動します。- サブジェネレータ
jhipster docker-compose
を実行します。 - サブジェネレータは、アーキテクチャにどのアプリケーションを含めるか、 また、ELKまたはPrometheusを使用して監視を設定するかどうかを尋ねます。
これにより、グローバルなDocker Compose設定が生成され、docker-compose up
と入力して実行すると、すべてのサービスが一度に実行されます。
マイクロサービスアーキテクチャの場合、この設定によりConsulまたはJHipster Registryも事前設定され、サービスも自動的に設定されます。
- これらのサービスは、Consul(またはJHipsterレジストリ)が起動するまで待機します。これは、
spring.cloud[.consul].config.fail-fast
およびspring.cloud[.consul].config.retry
キーを使用して、bootstrap-prod.yml
ファイルで設定できます。 - レジストリーはアプリケーションを構成します。例えば、すべてのサービス間でJWTシークレットトークンを共有します。
- 各サービスのスケーリングはDocker Composeを使用して行われます。たとえば、
docker-compose scale test-app=4
と入力すると、アプリケーション"test"の4つのインスタンスが実行されます。これらのインスタンスはゲートウェイによって自動的にロードバランシングされ、同じHazelcastクラスタに自動的に参加します(HazelcastがHibernateの第2レベルのキャッシュである場合)。