Configuración de las opciones de creación de contenedores para módulos de IoT Edge

Se aplica a:IoT Edge 1.4 checkmark IoT Edge 1.4

Importante

IoT Edge 1.4 es la versión admitida. Si está usando una versión anterior, consulte Actualización de IoT Edge.

El parámetro createOptions del manifiesto de implementación le permite configurar los contenedores de módulos en tiempo de ejecución. Este parámetro expande el control sobre los módulos y permite tareas como permitir o restringir el acceso del módulo a los recursos del dispositivo host o configurar las redes.

Los módulos de IoT Edge se implementan como contenedores compatibles con Docker en el dispositivo IoT Edge. Docker ofrece muchas opciones para crear contenedores y estas opciones se aplican también a los módulos de IoT Edge. Para más información, consulte Opciones de creación de un contenedor de Docker.

Formato de las opciones de creación

El manifiesto de implementación de IoT Edge acepta las opciones de creación con formato JSON. Por ejemplo, tome las opciones de creación que se incluyen automáticamente para todos los módulos de edgeHub:

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

En este ejemplo de edgeHub se usa el parámetro HostConfig.PortBindings para asignar los puertos expuestos en el contenedor a un puerto en el dispositivo host.

Si usa la extensión Azure IoT Edge para Visual Studio o Visual Studio Code, puede escribir las opciones de creación en formato JSON en el archivo deployment.template.json. A continuación, cuando se usa la extensión para crear la solución IoT Edge o generar el manifiesto de implementación, el archivo JSON se convierte en una cadena en el formato que espera el entorno de ejecución de Azure IoT Edge. Por ejemplo:

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

Importante

La extensión de Visual Studio Code de Azure IoT Edge está en modo de mantenimiento. La herramienta iotedgedev es la herramienta recomendada para desarrollar módulos de IoT Edge.

Una sugerencia para escribir las opciones de creación es usar el comando docker inspect. Como parte del proceso de desarrollo, ejecute el módulo localmente mediante docker run <container name>. Una vez que el módulo funcione de la manera que desea, ejecute docker inspect <container name>. Este comando genera los detalles del módulo en formato JSON. Busque los parámetros que ha configurado y copie el código JSON. Por ejemplo:

Screenshot of the results of the command docker inspect edgeHub.

Escenarios comunes

Las opciones de creación de contenedores permiten muchos escenarios, pero aquí se incluyen algunos de los más frecuentes al crear soluciones IoT Edge:

Asignación del puerto del host al puerto del módulo

Si el módulo necesita comunicarse con un servicio fuera de la solución IoT Edge y no usa el enrutamiento de mensajes para hacerlo, deberá asignar un puerto del host a un puerto del módulo.

Sugerencia

Esta asignación de puertos no es necesaria para la comunicación de módulo a módulo en el mismo dispositivo. Si el módulo A necesita consultar una API hospedada en el módulo B, puede hacerlo sin ninguna asignación de puertos. El módulo B debe exponer un puerto en su archivo dockerfile, por ejemplo: EXPOSE 8080. A continuación, el módulo A puede consultar la API con el nombre del módulo B, por ejemplo: http://ModuleB:8080/api.

En primer lugar, asegúrese de que se expone un puerto dentro del módulo para escuchar las conexiones. Puede hacerlo mediante una instrucción EXPOSE en el archivo dockerfile. Por ejemplo, EXPOSE 8080. La instrucción EXPOSE tiene como valor predeterminado el protocolo TCP si no se especifica o bien se puede especificar UDP.

A continuación, use el valor PortBindings del grupo HostConfig de las opciones de creación de un contenedor de Docker para asignar el puerto expuesto en el módulo a un puerto del dispositivo host. Por ejemplo, si expuso el puerto 8080 dentro del módulo y desea asignarlo al puerto 80 del dispositivo host, las opciones de creación del archivo template.json serían como en el ejemplo siguiente:

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

Una vez convertido en cadena para el manifiesto de implementación, la misma configuración sería similar a la del ejemplo siguiente:

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

Restricción del uso de CPU y memoria del módulo

Puede declarar la cantidad de recursos del host que puede usar un módulo. Este control es útil para garantizar que un módulo no puede consumir demasiada memoria o uso de CPU y evitar que otros procesos se ejecuten en el dispositivo. Puede administrar esta configuración con las opciones de creación de contenedores de Docker del grupo HostConfig, incluidas:

  • Memoria: límite de memoria en bytes. Por ejemplo, 268435456 bytes = 256 MB.
  • MemorySwap: límite de memoria total (memoria + intercambio). Por ejemplo, 536870912 bytes = 512 MB.
  • NanoCpus: cuota de CPU en unidades de CPU de 10 a -9 (1 mil millones). Por ejemplo, 250000000 nanocpuus = 0,25 CPU.

En el formato del archivo template.json, estos valores se verían como en el ejemplo siguiente:

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

Una vez convertido en cadena para el manifiesto de implementación final, estos valores serían similares a los del ejemplo siguiente:

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

Optimización de GPU en un módulo de IoT Edge

Si ejecuta el módulo IoT Edge en una máquina virtual optimizada para GPU, también puede habilitar un módulo de IoT Edge para conectarse a la GPU. Para ello con un módulo existente, agregue algunas especificaciones a createOptions:

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

Para confirmar que esta configuración se ha agregado correctamente, use el comando Docker inspect para ver la nueva configuración en una impresión JSON.

sudo docker inspect <YOUR-MODULE-NAME>

Para obtener más información sobre cómo el dispositivo y la máquina virtual se conectan a una GPU, consulte Configuración, conexión y comprobación de un módulo de IoT Edge para una GPU.

Pasos siguientes

Para más ejemplos de opciones de creación en acción, consulte los siguientes ejemplos de IoT Edge: