次の方法で共有


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

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

重要

IoT Edge 1.5 LTS は、サポートされているリリースです。 IoT Edge 1.4 LTS は、2024 年 11 月 12 日をもってサポートが終了しています。 以前のリリースの場合は、「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 をコピーします。 次に例を示します。

一般的なシナリオ

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

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

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

ヒント

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

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

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

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

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

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

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

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

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

テンプレートの JSON 形式では、これらの値は次の例のようになります。

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

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

"createOptions":"{\"HostConfig\":{\"Memory\":268435456,\"MemorySwap\":536870912,\"CpuPeriod\":25000}}"

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 サンプルを参照してください。