今日のペースの速い開発の世界では、すべてのチームメンバーに一貫性のある効率的な開発環境を設定することは、全体的な生産性にとって非常に重要です。 Docker自体は開発者の効率を向上させる強力なツールですが、ローカル開発環境の構成は依然として複雑で時間がかかる場合があります。 ここで、 開発コンテナ (または開発コンテナ)の出番です。
開発コンテナは、包括的なソリューションを提供し、機能に取り組み、アプリケーションをシームレスに実行するために必要なすべてを提供します。 具体的には、開発コンテナは、統合開発環境(IDE)、特定のソフトウェア、ツール、ライブラリ、事前設定されたサービスなど、特定のプロジェクトのソフトウェア開発に必要なすべてのものをカプセル化するDockerコンテナ(ローカルまたはリモートで実行)です。
この分離された環境の説明は、任意のコンピューターやクラウドインフラストラクチャに簡単に転送して起動できるため、開発者やチームはオペレーティングシステムの詳細を抽象化できます。 開発コンテナーの設定は、特定のプロジェクト内にある devcontainer.json
ファイルで定義され、異なる環境間での一貫性が確保されます。
ただし、開発は開発者のワークフローの一部にすぎません。 もう 1 つの重要な側面は、コードの変更が期待どおりに機能し、新たな問題が発生しないことを確認するためのテストです。 統合テストに Testcontainers を使用する場合、または Testcontainers ベースのサービスに依存してアプリケーションをローカルで実行する場合は、開発コンテナー内から Docker を使用できる必要があります。
この投稿では、開発コンテナ内からTestcontainersベースのテストまたはサービスを実行する方法と、開発コンテナ内で Testcontainers Cloud を安全かつ効率的に活用して、Dockerとの対話をさらに簡単にする方法を紹介します。
開発コンテナーの概要
このチュートリアルを使用してコンピューター上の開発コンテナーの使用を開始するには、次のものが必要です。
- Git 2.25+
- Docker
- IntelliJ IDE
開発コンテナをサポートするためにプロジェクトを事前設定する必要はありません。IDEがそれを行います。 ただし、開発コンテナで実行するにはいくつかのTestcontainersの使用例が必要になるため、既存の Java Local Developmentワークショップ リポジトリを使用しましょう。 これには、製品のカタログを管理するためのSpring Bootベースのマイクロサービスアプリケーションの実装が含まれています。 demo-state
ブランチには、ローカル開発用のTestcontainersベースの統合テストとサービスの実装が含まれています。
このプロジェクトでは通常、Java 21 と Maven をローカルにインストールする必要がありますが、代わりに dev コンテナを使用して、開発コンテナ内で必要なすべてのツールと依存関係を事前設定します。
最初の開発コンテナーの設定
まず、プロジェクトをクローンします。
git clone https://github.com/testcontainers/java-local-development-workshop.git
次に、ローカルの IntelliJ IDE でプロジェクトを開き、Dev Containers プラグインをインストールします (図 1)。
次に、要件を含む .devcontainer/devcontainer.json
ファイルをプロジェクトに追加します。 プロジェクト ルートのコンテキスト メニューで、 [新しい > .devcontainer] を選択します (図 2)。
Java 21が必要になるので、Java Dev Container Templateを使用してみましょう。 次に、 Java バージョン 21 を選択し、 Maven のインストール を有効にします (図 3)。
[OK] を選択すると、新しく生成された devcontainer.json
ファイルが表示されます。では、もう少し調整してみましょう。
Testcontainers は Docker へのアクセスを必要とするため、開発コンテナー内で Docker へのアクセスを提供する必要があります。 これを行うには、既存の 開発コンテナフィーチャー を使用してみましょう。 機能は、インストール手順、環境変数、その他の設定など、特定のコンテナ構成の自己完結型ユニットを提供することで、開発コンテナ内の開発機能を強化します。
Docker-in-Docker 機能を devcontainer.json
に追加して、Docker を開発コンテナー自体にインストールし、Testcontainers テストに Docker 環境を利用できるようにすることができます。
devcontainer.json
ファイルは次のようになります。
{
"name": "Java Dev Container TCC Demo",
"image": "mcr.microsoft.com/devcontainers/java:1-21-bullseye",
"features": {
"ghcr.io/devcontainers/features/java:1": {
"version": "none",
"installMaven": "true",
"installGradle": "false"
},
"docker-in-docker": {
"version": "latest",
"moby": true,
"dockerDashComposeVersion": "v1"
}
},
"customizations" : {
"jetbrains" : {
"backend" : "IntelliJ"
}
}
}
これで、コンテナを実行できます。 devcontainer.json
に移動してDev Containersプラグインをクリックし、[Create Dev Container and Clone Sources]を選択します。[新しい開発コンテナ] ウィンドウが開きます (図 4)。
[新しい開発コンテナー] ウィンドウで、Git ブランチを選択し、開発コンテナーを作成する場所を指定できます。既定では、ローカルの Docker インスタンスが使用されますが、省略記号 (...) を選択して、クラウドまたは WSL から Docker サーバーを追加し、SSH 経由で接続を構成できます。
ビルド プロセスが成功すると、目的の IDE バックエンドを選択でき、コンテナ内にインストールおよび起動されます (図 5)。
「続行」を選択すると、新しいIDEウィンドウが開き、通常どおりコーディングできます。実行中の開発コンテナの詳細を表示するには、ホストのターミナルで docker ps
を実行します(図 6)。
TestApplication クラスを実行すると、アプリケーションは Testcontainers によって管理されるすべての必要な依存関係で開始されます。 (実装の詳細については、GitHub の「Testcontainers を使用したローカル開発環境」の手順 を参照してください。 コンテナで実行されているサービスを確認するには、IDEターミナル(コンテナ内)で docker ps
を実行します。 図 7を参照してください。
開発コンテナでのTestcontainers Cloudの設定
ローカルリソースの負荷を軽減し、Testcontainersベースのコンテナの可観測性を強化するために、Docker-in-Docker機能からTestcontainers Cloud(TCC)機能に切り替えましょう: ghcr.io/eddumelendez/test-devcontainer/tcc:0.0.2
。
この機能は、開発コンテナ内にTestcontainers Cloudエージェントをインストールして実行し、Testcontainersテスト用のリモートDocker環境を提供します。
この機能を有効にするには、Testcontainers Cloud エージェントが接続を確立するために使用する有効な TC_CLOUD_TOKEN
を取得する必要があります。 Testcontainers Cloudのアカウントをまだお持ちでない場合は、 無料アカウントにサインアップできます。 ログインしたら、必要なトークンを生成するための サービスアカウントを作成できます (図 8)。
トークン値を使用するには、 .env
ファイル。 .devcontainer/devcontainer.env
の下に環境ファイルを作成し、新しく生成されたトークン値を追加します(図9)。.gitignore
に devcontainer.env
を追加して、リモートリポジトリにプッシュされないようにしてください。
devcontainer.json
ファイルに、次のオプションを含めます。
- コンテナが
.env
runArgs
.devcontainer/devcontainer.env
にあるファイル。 - コンテナ内の環境変数 (
TC_CLOUD_TOKEN
とTCC_PROJECT_KEY
) を設定するcontainerEnv
。TC_CLOUD_TOKEN
変数は、ローカル環境変数から動的に設定されます。
結果の devcontainer.json
ファイルは次のようになります。
{
"name": "Java Dev Container TCC Demo",
"image": "mcr.microsoft.com/devcontainers/java:21",
"runArgs": [
"--env-file",
".devcontainer/devcontainer.env"
],
"containerEnv": {
"TC_CLOUD_TOKEN": "${localEnv:TC_CLOUD_TOKEN}",
"TCC_PROJECT_KEY": "java-local-development-workshop"
},
"features": {
"ghcr.io/devcontainers/features/java:1": {
"version": "none",
"installMaven": "true",
"installGradle": "false"
},
"ghcr.io/eddumelendez/test-devcontainer/tcc:0.0.2": {}
},
"customizations": {
"jetbrains": {
"backend": "IntelliJ"
}
}
}
開発コンテナを再構築して、もう一度起動しましょう。 devcontainer.json
に移動し、Dev Containers プラグインを選択し、次に [Create Dev Container and Clone Sources] を選択して、前の例のような手順に従います。 ビルド プロセスが完了したら、必要な IDE バックエンドを選択し、コンテナ内でインストールして起動します。
Testcontainers Cloud エージェントが開発コンテナに正常にインストールされたことを確認するには、開発コンテナ IDE ターミナルで次のコマンドを実行します。
cat /usr/local/share/tcc-agent.log
エージェントが正常に開始された場合は、 Listening address=
のようなログ行が表示されます (図 10)。
これで、テストを実行できます。 ProductControllerTest
クラスには、アプリケーションの Testcontainers ベースの統合テストが含まれています。(実装の詳細については、GitHub の 「テストを書こう」の手順 を参照してください。
テストサイクル中に実行中のコンテナを表示するには、 Testcontainers Cloud ダッシュボード に移動し、最新のセッションを確認します(図 11)。 以前に作成したサービスアカウントの名前がアカウント行に表示され、プロジェクト名はcontainerEnv
セクションで定義されたTCC_PROJECT_KEY
に対応します。プロジェクトまたはワークフローごとにセッションにタグを付ける方法の詳細については、ドキュメントを参照してください。
アプリケーションを実行し、コンテナをデバッグする場合は、Cloud VM ターミナル に接続し 、CLI を使用してコンテナにアクセスできます(図 12)。
まとめ
この記事では、開発コンテナーを使用して Testcontainers ベースのローカル開発環境を効率化する利点について説明しました。 Testcontainers Cloudを使用すると、Docker-in-Dockerアプローチの潜在的なセキュリティ上の懸念とリソース制限に対処することにより、Testcontainersベースのコンテナを実行するための安全でスケーラブルなソリューションが提供され、このセットアップがさらに強化されます。 この強力な組み合わせにより、ワークフローが簡素化され、プロジェクト全体の生産性と一貫性が向上します。
開発用コンテナをクラウドで実行すると、ローカル リソースの負荷をさらに軽減し、パフォーマンスを向上させることができます。 この機能をさらに強化する Docker の今後のイノベーションにご期待ください。
さらに詳しく
- Docker Newsletter を購読してください。
- Testcontainers Cloud アカウントにサインアップします。
- Testcontainers のベスト プラクティスについて説明します。
- Testcontainers を使用した Spring Boot アプリケーションのテストと開発について学習します。
- Testcontainers ガイドから開始します。
- Testcontainers Slack で接続します。
- 質問がありますか? Docker コミュニティがお手伝いします。
- ドッカーは初めてですか? 始めましょう。