対象:
IoT Edge 1.5
重要
IoT Edge 1.5 LTS は、サポートされているリリースです。 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 をコピーします。 次に例を示します。
一般的なシナリオ
コンテナー作成オプションは、さまざまなシナリオをサポートします。 IoT Edge ソリューションを構築するための最も一般的なものを次に示します。
ホスト ポートをモジュール ポートにマップする
モジュールがIoT Edge ソリューションの外部のサービスと通信する必要があり、それにメッセージ ルーティングを使用していない場合は、ホスト ポートをモジュール ポートにマップします。
ヒント
同じデバイス上のモジュール間通信には、ポート マッピングは必要ありません。 モジュール A がモジュール B でホストされている API に対してクエリを実行する必要がある場合は、ポート マッピングなしで実行できます。 モジュール B は、dockerfile 内のポートを公開する必要があります。 たとえば、 EXPOSE 8080が公開されます。 その後、モジュール A はモジュール B の名前を使用して API にクエリを実行できます。たとえば、 http://ModuleB:8080/api。
まず、接続を受け入れるためにモジュール内のポートが公開されていることを確認します。 これを行うには、dockerfile の EXPOSE 命令を使用します。たとえば、 EXPOSE 8080。 プロトコルを指定しない場合、または UDP を指定できる場合、公開命令は既定で TCP プロトコルに設定されます。
次に、PortBindingsのHostConfig グループの設定を使用して、モジュール内の公開されているポートをホスト デバイス上のポートにマップします。 たとえば、モジュール内でポート 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サンプルを参照してください。