IoT Edge モジュールのコンテナー作成オプションを構成する方法

適用対象:IoT Edge 1.6 チェックマーク IoT Edge 1.6

重要

サポートされているリリースはIoT Edge 1.6 LTSです。 IoT Edge 1.5 LTSのサポートは2026年11月10日に終了します。IoT Edge 1.4 LTSは2024年11月12日にサービス終了を迎えました。 以前のリリースを使用している場合は、「Update IoT Edgeを参照してください。

実行時にモジュール コンテナーを構成するには、配置マニフェストの createOptions パラメーターを使用します。 このパラメーターを使用すると、モジュールのアクセスをホスト デバイスのリソースに制限したり、ネットワークを構成したりできます。

IoT Edgeモジュールは、IoT Edge デバイス上で Docker と互換性のあるコンテナーとして実行されます。 Docker にはコンテナーを作成するための多くのオプションが用意されており、これらのオプションはIoT Edgeモジュールにも適用されます。 詳細については、Docker コンテナーの作成オプションに関するページを参照してください。

作成オプションの書式設定

IoT Edge配置マニフェストは、JSON 形式の作成オプションを受け入れます。 たとえば、すべての edgeHub モジュールに自動的に含まれる作成オプションを見てみましょう。

"createOptions": {
  "HostConfig": {
    "PortBindings": {
      "5671/tcp": [
        {
          "HostPort": "5671"
        }
      ],
      "8883/tcp": [
        {
          "HostPort": "8883"
        }
      ],
      "443/tcp": [
        {
          "HostPort": "443"
        }
      ]
    }
  }
}

この edgeHub の例では、 HostConfig.PortBindings パラメーターを使用して、コンテナー上の公開されているポートをホスト デバイス上のポートにマップします。

Visual StudioまたはVisual Studio Codeに Azure IoT Edge 拡張子を使用する場合は、json 形式の作成オプションを deployment.template.json ファイルに記述します。 次に、拡張機能を使用してIoT Edge ソリューションをビルドしたり、配置マニフェストを生成したりすると、IoT Edge ランタイムが想定する形式で JSON が文字列化されます。 次に例を示します。

"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"

重要

Azure IoT Edge Visual Studio Code拡張機能は、メンテナンスモードです。 iotedgedev ツールは、IoT Edge モジュールを開発するための推奨ツールです。

docker inspect コマンドを使用して、作成オプションを記述します。 開発プロセスの一部として docker run <container name> を使用して、モジュールをローカルで実行します。 モジュールを目的の方法で動作させたら、 docker inspect <container name>実行します。 このコマンドは、モジュールの詳細を JSON 形式で出力します。 構成したパラメーターを見つけて、JSON をコピーします。 次に例を示します。

Docker inspect edgeHub コマンドの結果のスクリーンショット。

一般的なシナリオ

コンテナー作成オプションは、さまざまなシナリオをサポートします。 IoT Edge ソリューションを構築するための最も一般的なものを次に示します。

ホスト ポートをモジュール ポートにマップする

モジュールがIoT Edge ソリューションの外部のサービスと通信する必要があり、それにメッセージ ルーティングを使用していない場合は、ホスト ポートをモジュール ポートにマップします。

ヒント

同じデバイス上のモジュール間通信には、ポート マッピングは必要ありません。 モジュール A がモジュール B でホストされている API に対してクエリを実行する必要がある場合は、ポート マッピングなしで実行できます。 モジュール B は、dockerfile 内のポートを公開する必要があります。 たとえば、EXPOSE 8080 が公開されます。 その後、モジュール A はモジュール B の名前を使用して API にクエリを実行できます。たとえば、 http://ModuleB:8080/api

まず、接続を受け入れるためにモジュール内のポートが公開されていることを確認します。 これを行うには、dockerfile の EXPOSE 命令を使用します。たとえば、 EXPOSE 8080。 プロトコルを指定しない場合、または UDP を指定できる場合、公開命令は既定で TCP プロトコルに設定されます。

次に、PortBindingsHostConfig グループの設定を使用して、モジュール内の公開されているポートをホスト デバイス上のポートにマップします。 たとえば、モジュール内でポート 8080 を公開し、そのポートをホスト デバイスのポート 80 にマップする場合、template.json ファイルの作成オプションは次の例のようになります。

"createOptions": {
  "HostConfig": {
    "PortBindings": {
      "8080/tcp": [
        {
          "HostPort": "80"
        }
      ]
    }
  }
}

配置マニフェストに文字列化すると、構成は次のようになります。

"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8080/tcp\":[{\"HostPort\":\"80\"}]}}}"

モジュールのメモリと CPU の使用量を制限する

モジュールが使用できるホスト リソースの量を宣言します。 この制御により、1 つのモジュールがメモリや CPU を消費しすぎないようにし、他のプロセスがデバイスで実行されないようにします。 これらの設定は、 グループの HostConfigを使用して管理できます。次に例を示します。

  • Memory: メモリの制限 (バイト単位)。 たとえば、268435456バイト = 256 MB になります。
  • MemorySwap: 合計メモリ制限 (メモリ + スワップ)。 たとえば、536870912 バイト = 512 MB になります。
  • NanoCpus: CPU クォータ (10 ~ 9 (10 億) CPU 単位)。 たとえば、250000000 nanocpus = 0.25 CPU です。

template.json 形式では、これらの値は次の例のようになります。

"createOptions": {
  "HostConfig": {
    "Memory": 268435456,
    "MemorySwap": 536870912,
    "NanoCpus": 250000000
  }
}

最終的な配置マニフェストに文字列化されると、これらの値は次の例のようになります。

"createOptions":"{\"HostConfig\":{\"Memory\":268435456,\"MemorySwap\":536870912,\"NanoCpus\":250000000}}"

IOT EDGE モジュールの GPU 最適化

GPU 最適化仮想マシンで IoT Edge モジュールを実行する場合は、IoT Edge モジュールを有効にして GPU にも接続できます。 既存のモジュールを使用してこの接続を行うには、 createOptionsにいくつかの仕様を追加します。

{"HostConfig": {"DeviceRequests": [{"Count": -1,"Capabilities": [["gpu"]]}]}}

Docker inspect コマンドを使用してこれらの設定を確認し、JSON 出力で新しい設定を表示します。

sudo docker inspect <YOUR-MODULE-NAME>

デバイスと仮想マシンが GPU に接続する方法の詳細については、「 GPU のIoT Edge モジュールの構成、接続、検証を参照してください。

次のステップ

実際の作成オプションのその他の例については、次のIoT Edgeサンプルを参照してください。