Dev Containers と Testcontainers Cloud でローカル開発の効率化を実現

目まぐるしいスピードで開発が行われる今昨では、一貫性のある効率的な開発環境を構築することは、全体的な生産性向上のために非常に重要です。Docker 自体は開発者の効率を向上させる強力なツールですが、ローカル開発環境の構成は、依然として複雑で時間がかかる場合があります。ここで、 dev containers (development containers) の出番です。

dev containers は、機能の開発、修正、改善作業や、アプリケーションをシームレスに実行するために必要なすべてを含む包括的なソリューションを提供します。具体的には、dev containers は、統合開発環境 (IDE)、特定のソフトウェア、ツール、ライブラリ、事前設定されたサービスなど、特定のプロジェクトのソフトウェア開発に必要なすべてのものをカプセル化する Docker コンテナー (ローカルまたはリモートで実行) です。 

この分離された環境は、どのコンピュータやクラウド インフラストラクチャにでも簡単に移行して起動できるため、開発者やチームがそれぞれのオペレーティング システムの違いを意識する必要がなくなります。dev container の設定は、特定のプロジェクト内にある devcontainer.json ファイルで定義され、異なる環境間で一貫性が確保されます。

ただし、開発は開発者のワークフローの一部にすぎません。もう 1 つの重要な側面は、コードを変更した際にそれが期待どおりに機能し、新たな問題が発生しないことを確認するためのテストです。統合テストに Testcontainers を使用する場合、または Testcontainers ベースのサービスに依存してアプリケーションをローカルで実行する場合は、dev container 内から Docker を使用する必要があります。 

この投稿では、dev container 内から Testcontainers ベースのテストまたはサービスを実行する方法と、dev containers 内で Testcontainers Cloud を安全かつ効率的に活用して、Docker とのやり取りをさらに簡単にする方法を紹介します。 

dev container の概要

このチュートリアルを使用してコンピューター上の dev container の使用を開始するには、次が必要です。

  • Git 2.25+
  • Docker 
  • IntelliJ IDE 

dev container をサポートするためにプロジェクトを事前設定する必要はなく、IDE がそれを行います。ただし、dev container で実行するにはいくつかの Testcontainers の使用例が必要になるため、既存の Java Local Development ワークショップ リポジトリを使用しましょう。これには、製品のカタログを管理するための Spring Boot ベースのマイクロサービス アプリケーションの実装が含まれています。demo-state ブランチには、ローカル開発用の Testcontainers ベースの統合テストとサービスの実装が含まれています。 

このプロジェクトでは通常、Java 21 と Maven をローカルにインストールする必要がありますが、代わりに dev container を使用して、開発コンテナー内で必要なすべてのツールと依存関係を事前設定します。 

最初の dev container の設定

まず、プロジェクトをクローンします。

git clone https://github.com/testcontainers/java-local-development-workshop.git

次に、ローカルの IntelliJ IDE でプロジェクトを開き、Dev Containers プラグインをインストールします (図 1)。

図 1: Dev Containers プラグインをインストールします。

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

図 2: 新しい .devcontainer の選択。

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

図 3: Dev コンテナー テンプレートのオプション。

[OK] を選択すると、新しく生成された devcontainer.json ファイルが表示されます。では、もう少し調整してみましょう。 

Testcontainers は Docker へのアクセスを必要とするため、dev container 内で Docker へのアクセスしなければいけません。これには、既存の dev container フィーチャーを使用してみましょう。機能は、インストール手順、環境変数、その他の設定など、特定のコンテナー構成の自己完結型ユニットを提供することで、dev container 内の開発機能を強化します。 

Docker-in-Docker 機能を devcontainer.json に追加して、Docker を dev container 自体にインストールし、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] を選択します。[New Dev Container] ウィンドウが開きます (図 4)。

図 4: [New Dev Container] ウィンドウ。

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

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

図 5: dev container のビルドプロセス。

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

図 6: dev container の詳細の表示。

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

図 7: コンテナーで実行されているサービスの表示。

dev container での Testcontainers Cloud の設定

ローカル リソースの負荷を軽減し、Testcontainers ベースのコンテナーの可観測性を強化するために、Docker-in-Docker 機能から Testcontainers Cloud (TCC) 機能に切り替えましょう。

ghcr.io/eddumelendez/test-devcontainer/tcc:0.0.2

この機能は、dev container 内に Testcontainers Cloud エージェントをインストールして実行し、Testcontainers テスト用のリモート Docker 環境を提供します。

この機能を有効にするには、Testcontainers Cloud エージェントが接続を確立するために使用する有効な TC_CLOUD_TOKEN を取得する必要があります。Testcontainers Cloud のアカウントをまだお持ちでない場合は、無料アカウントにサインアップできます。ログインしたら、必要なトークンを生成するための サービス アカウントを作成できます (図 8)。

図 8: Testcontainers Cloud アクセス トークンの生成。

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

図 9: トークン値を devcontainer.envに追加します。

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

  • コンテナーが .envrunArgs .devcontainer/devcontainer.env にある .env を使用するように指定する runArgs 
  • コンテナー内の環境変数 (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"
    }
  }
}

dev container を再構築して、もう一度起動しましょう。 devcontainer.json に移動し、Dev Containers プラグインを選択し、次に [Create Dev Container and Clone Sources] を選択して、前の例のような手順に従います。ビルド プロセスが完了したら、必要な IDE バックエンドを選択し、コンテナー内でインストールして起動します。

Testcontainers Cloud エージェントが dev container に正常にインストールされたことを確認するには、dev container IDE ターミナルで次のコマンドを実行します。 

cat /usr/local/share/tcc-agent.log

エージェントが正常に開始された場合は、Listening address= のようなログ行が表示されます (図 10)。

図 10: Testcontainers Cloud エージェントが正常にインストールされたことを確認します。

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

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

図 11: Testcontainers Cloud ダッシュボード。

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

図 12: CLI を使用したコンテナーへのアクセス。

まとめ

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

dev container をクラウドで実行すると、ローカル リソースの負荷をさらに軽減し、パフォーマンスを向上させることができます。

現在 Testcontainers は Docker コンテナー上で利用できます

2023 年 12 月、Docker 社が Testcontainers の開発会社である AtomicJar を買収し、現在、Atomic Jar は Docker の一部として Testcontainers を提供しています。Docker は、Docker Desktop や Docker Scout などにより、すでにソフトウェア開発の「インナーループ」のステップであるビルドや検証、実行、デバッグ、共有の加速をサポートしていますが、Testcontainers により、「テスト」の信頼性向上と加速のサポートを追加しました。これにより、Docker を使用する開発者は、より品質の高いソフトウェアをより速く提供できるようになります。


エクセルソフトは Docker の Preferred Reseller として、Docker Business を販売しています。Docker 製品のライセンスや機能に関するご質問、製品デモのご要望を承っています。お問い合わせはこちらから。


*本記事は、Docker 社が提供している以下の記事から抜粋・転載したものです。

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

Docker の最新情報をお届けするエクセルソフトのメールニュース登録はこちら

タイトルとURLをコピーしました