Dev ContainersとTestcontainers Cloudによるローカル開発の効率化

今日のペースの速い開発の世界では、すべてのチームメンバーに一貫性のある効率的な開発環境を設定することは、全体的な生産性にとって非常に重要です。 Docker自体は開発者の効率を向上させる強力なツールですが、ローカル開発環境の構成は依然として複雑で時間がかかる場合があります。 ここで、 開発コンテナ (または開発コンテナ)の出番です。

2400x1260 testcontainers クラウド エバーグリーン

開発コンテナは、包括的なソリューションを提供し、機能に取り組み、アプリケーションをシームレスに実行するために必要なすべてを提供します。 具体的には、開発コンテナは、統合開発環境(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)。

dev containers プラグインの概要を示すスクリーンショット。
図 1: Dev Containers プラグインをインストールします。

次に、要件を含む .devcontainer/devcontainer.json ファイルをプロジェクトに追加します。 プロジェクト ルートのコンテキスト メニューで、 [新しい > .devcontainer] を選択します (図 2)。

「new」と「. Devcontainer」
図 2: 新しい .devcontainerの選択。

Java 21が必要になるので、Java Dev Container Templateを使用してみましょう。 次に、 Java バージョン 21 を選択し、 Maven のインストール を有効にします (図 3)。

開発コンテナ テンプレート オプションを表示し、インストール Maven が選択された開発コンテナ設定ページのスクリーンショット。
図 3: Dev コンテナテンプレートのオプション。

[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)。

新しい開発コンテナウィンドウのスクリーンショットで、docker、git repository、git branch のオプションが表示されます。
図 4: [新しい開発コンテナ] ウィンドウ。

[新しい開発コンテナー] ウィンドウで、Git ブランチを選択し、開発コンテナーを作成する場所を指定できます。既定では、ローカルの Docker インスタンスが使用されますが、省略記号 (...) を選択して、クラウドまたは WSL から Docker サーバーを追加し、SSH 経由で接続を構成できます。

ビルド プロセスが成功すると、目的の IDE バックエンドを選択でき、コンテナ内にインストールおよび起動されます (図 5)。

開発コンテナのビルドウィンドウのスクリーンショットで、コンテナのビルドの進行状況と詳細を示しています。 コンテナIDやコンテナ名など。
図 5: 開発コンテナのビルドプロセス。

「続行」を選択すると、新しいIDEウィンドウが開き、通常どおりコーディングできます。実行中の開発コンテナの詳細を表示するには、ホストのターミナルで docker ps を実行します(図 6)。

「docker ps」コマンドの結果を示すスクリーンショット、コンテナID、イメージ、ステータス、ポートなどを一覧表示します。
図 6: 開発コンテナの詳細の表示。

TestApplication クラスを実行すると、アプリケーションは Testcontainers によって管理されるすべての必要な依存関係で開始されます。 (実装の詳細については、GitHub の「Testcontainers を使用したローカル開発環境」の手順 を参照してください。 コンテナで実行されているサービスを確認するには、IDEターミナル(コンテナ内)で docker ps を実行します。 図 7を参照してください。

「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)。

testcontainer の [新しいサービス アカウントの作成] ウィンドウのスクリーンショットで、アクセス トークンの生成を示しています。
図 8: Testcontainers Cloud アクセス トークンの生成。

トークン値を使用するには、 .env ファイル。 .devcontainer/devcontainer.envの下に環境ファイルを作成し、新しく生成されたトークン値を追加します(図9)。.gitignoredevcontainer.env を追加して、リモートリポジトリにプッシュされないようにしてください。

devcontainer へのトークン値の追加を示すプロジェクトメニューのスクリーンショット。 環境
図 9: トークン値を devcontainer.envに追加します。

devcontainer.json ファイルに、次のオプションを含めます。

  • コンテナが .envrunArgs .devcontainer/devcontainer.envにあるファイル。 
  • コンテナ内の環境変数 (TC_CLOUD_TOKENTCC_PROJECT_KEY) を設定するcontainerEnvTC_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)。

testcontainersクラウドエージェントが正常にインストールされたことを確認するための、「リスニングアドレス」行を含むログ出力のスクリーンショット。
図 10: Testcontainers Cloud エージェントが正常にインストールされたことを確認します。

これで、テストを実行できます。 ProductControllerTest クラスには、アプリケーションの Testcontainers ベースの統合テストが含まれています。(実装の詳細については、GitHub の 「テストを書こう」の手順 を参照してください。

テストサイクル中に実行中のコンテナを表示するには、 Testcontainers Cloud ダッシュボード に移動し、最新のセッションを確認します(図 11)。 以前に作成したサービスアカウントの名前がアカウント行に表示され、プロジェクト名はcontainerEnvセクションで定義されたTCC_PROJECT_KEYに対応します。プロジェクトまたはワークフローごとにセッションにタグを付ける方法の詳細については、ドキュメントを参照してください。

4コンテナと緑色の接続ボタンをリストしたtestcontainersクラウドダッシュボードのスクリーンショット。
図 11: Testcontainers Cloud ダッシュボード。

アプリケーションを実行し、コンテナをデバッグする場合は、Cloud VM ターミナル に接続し 、CLI を使用してコンテナにアクセスできます(図 12)。

コマンドラインを介したコンテナアクセスを示すtestcontainersクラウドのスクリーンショット。
図 12: CLI を使用したコンテナへのアクセス。

まとめ

この記事では、開発コンテナーを使用して Testcontainers ベースのローカル開発環境を効率化する利点について説明しました。 Testcontainers Cloudを使用すると、Docker-in-Dockerアプローチの潜在的なセキュリティ上の懸念とリソース制限に対処することにより、Testcontainersベースのコンテナを実行するための安全でスケーラブルなソリューションが提供され、このセットアップがさらに強化されます。 この強力な組み合わせにより、ワークフローが簡素化され、プロジェクト全体の生産性と一貫性が向上します。

開発用コンテナをクラウドで実行すると、ローカル リソースの負荷をさらに軽減し、パフォーマンスを向上させることができます。 この機能をさらに強化する Docker の今後のイノベーションにご期待ください。

さらに詳しく