IoT Edge モジュールのコンテナー作成オプションを構成する方法
適用対象: IoT Edge 1.5 IoT Edge 1.4
重要
IoT Edge 1.5 LTS および IoT Edge 1.4 LTS がサポートされているリリースです。 IoT Edge 1.4 LTS は、2024 年 11 月 12 日にサポートが終了します。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。
配置マニフェストの createOptions パラメーターを使用すると、実行時にモジュール コンテナーを構成できます。 このパラメーターは、モジュールに対する制御を拡張し、ホスト デバイスのリソースに対するモジュールのアクセスを許可または制限したり、ネットワークを構成したりするなどのタスクを可能にします。
IoT Edge モジュールは、Docker と互換性のあるコンテナーとして IoT Edge デバイスに実装されます。 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 モジュールを開発するための推奨ツールです。
作成オプションを記述するためのヒントの 1 つは、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 のサンプルを参照してください。