Come configurare le opzioni di creazione di contenitori per i moduli IoT EdgeHow to configure container create options for IoT Edge modules

Si applica a:  icona Sì IoT Edge 1,1  sì icona IOT Edge 1,2Applies to: yes icon IoT Edge 1.1 yes icon IoT Edge 1.2

Il parametro createOptions nel manifesto di distribuzione consente di configurare i contenitori dei moduli in fase di esecuzione.The createOptions parameter in the deployment manifest enables you to configure the module containers at runtime. Questo parametro espande il controllo sui moduli e consente attività come consentire o limitare l'accesso del modulo alle risorse del dispositivo host oppure configurare la rete.This parameter expands your control over the modules and allows for tasks like allowing or restricting the module's access to the host device's resources, or configuring networking.

IoT Edge moduli sono implementati come contenitori compatibili con Docker nel dispositivo IoT Edge.IoT Edge modules are implemented as Docker-compatible containers on your IoT Edge device. Docker offre molte opzioni per la creazione di contenitori e queste opzioni si applicano anche ai moduli IoT Edge.Docker offers many options for creating containers, and those options apply to IoT Edge modules, too. Per altre informazioni, vedere Opzioni di creazione di contenitori Docker.For more information, see Docker container create options.

Opzioni di creazione formatoFormat create options

Il manifesto di distribuzione di IoT Edge accetta le opzioni di creazione formattate come JSON.The IoT Edge deployment manifest accepts create options formatted as JSON. Ad esempio, eseguire le opzioni create incluse automaticamente per ogni modulo edgeHub:For example, take the create options that are automatically included for every edgeHub module:

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

Questo esempio di edgeHub usa il parametro Hostconfig. PortBindings per eseguire il mapping delle porte esposte nel contenitore a una porta sul dispositivo host.This edgeHub example uses the HostConfig.PortBindings parameter to map exposed ports on the container to a port on the host device.

Se si usano le estensioni degli strumenti di Azure per Visual Studio o Visual Studio Code, è possibile scrivere le opzioni di creazione in formato JSON nell' deployment.template.jssu file.If you use the Azure IoT Tools extensions for Visual Studio or Visual Studio Code, you can write the create options in JSON format in the deployment.template.json file. Quindi, quando si usa l'estensione per compilare la soluzione IoT Edge o generare il manifesto di distribuzione, stringify il codice JSON nel formato previsto dal runtime di IoT Edge.Then, when you use the extension to build the IoT Edge solution or generate the deployment manifest, it will stringify the JSON for you in the format that the IoT Edge runtime expects. Ad esempio:For example:

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

Un suggerimento per la scrittura di opzioni di creazione consiste nell'usare il docker inspect comando.One tip for writing create options is to use the docker inspect command. Nell'ambito del processo di sviluppo eseguire il modulo localmente usando docker run <container name> .As part of your development process, run the module locally using docker run <container name>. Quando il modulo funziona nel modo desiderato, eseguirlo docker inspect <container name> .Once you have the module working the way you want it, run docker inspect <container name>. Questo comando restituisce i dettagli del modulo in formato JSON.This command outputs the module details in JSON format. Trovare i parametri configurati e copiare il codice JSON.Find the parameters that you configured, and copy the JSON. Ad esempio:For example:

Risultati dell'ispezione di Docker edgeHubResults of docker inspect edgeHub

Scenari comuniCommon scenarios

Le opzioni di creazione del contenitore consentono molti scenari, ma di seguito sono riportate più spesso quando si compilano soluzioni IoT Edge:Container create options enable many scenarios, but here are some that come up most often when building IoT Edge solutions:

Eseguire il mapping della porta host alla porta del moduloMap host port to module port

Se il modulo deve comunicare con un servizio esterno alla soluzione IoT Edge e non usa il routing dei messaggi a tale scopo, è necessario eseguire il mapping di una porta host a una porta del modulo.If your module needs to communicate with a service outside of the IoT Edge solution, and isn't using message routing to do so, then you need to map a host port to a module port.

Suggerimento

Questo mapping delle porte non è necessario per la comunicazione da modulo a modulo sullo stesso dispositivo.This port mapping is not required for module-to-module communication on the same device. Se il modulo A deve eseguire una query su un'API ospitata sul modulo B, questa operazione può essere eseguita senza alcun mapping delle porte.If module A needs to query an API hosted on module B, it can do so without any port mapping. Il modulo B deve esporre una porta nella relativa dockerfile, ad esempio: EXPOSE 8080 .Module B needs to expose a port in its dockerfile, for example: EXPOSE 8080. Il modulo A può quindi eseguire una query sull'API usando il nome del modulo B, ad esempio: http://ModuleB:8080/api .Then module A can query the API using module B's name, for example: http://ModuleB:8080/api.

Assicurarsi prima di tutto che una porta all'interno del modulo sia esposta per restare in ascolto delle connessioni.First, make sure that a port inside the module is exposed to listen for connections. A tale scopo, è possibile usare un'istruzione Expose in dockerfile.You can do this using an EXPOSE instruction in the dockerfile. Ad esempio: EXPOSE 8080.For example, EXPOSE 8080. Se non è specificata, l'istruzione Expose viene utilizzata per impostazione predefinita sul protocollo TCP oppure è possibile specificare UDP.The expose instruction defaults to TCP protocol if not specified, or you can specify UDP.

Quindi, usare l'impostazione PortBindings nel gruppo Hostconfig delle opzioni di creazione del contenitore Docker per eseguire il mapping della porta esposta nel modulo a una porta sul dispositivo host.Then, use the PortBindings setting in the HostConfig group of the Docker container create options to map the exposed port in the module to a port on the host device. Se ad esempio è stata esposta la porta 8080 all'interno del modulo e si vuole eseguirne il mapping alla porta 80 del dispositivo host, le opzioni di creazione nel template.jsnel file avranno un aspetto simile all'esempio seguente:For example, if you exposed port 8080 inside the module and want to map that to port 80 of the host device, the create options in the template.json file would look like the following example:

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

Una volta file per il manifesto di distribuzione, la stessa configurazione sarà simile all'esempio seguente:Once stringified for the deployment manifest, the same configuration would look like the following example:

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

Limitare l'utilizzo della memoria e della CPU del moduloRestrict module memory and CPU usage

È possibile dichiarare la quantità di risorse host che un modulo può utilizzare.You can declare how much of the host resources a module can use. Questo controllo è utile per garantire che un modulo non possa utilizzare troppa memoria o utilizzo della CPU e impedire l'esecuzione di altri processi sul dispositivo.This control is helpful to ensure that one module can't consume too much memory or CPU usage and prevent other processes from running on the device. È possibile gestire queste impostazioni con le Opzioni di creazione di contenitori Docker nel gruppo Hostconfig , tra cui:You can manage these settings with Docker container create options in the HostConfig group, including:

  • Memoria: limite di memoria in byte.Memory: Memory limit in bytes. Ad esempio, 268435456 byte = 256 MB.For example, 268435456 bytes = 256 MB.
  • MemorySwap: limite di memoria totale (memoria + scambio).MemorySwap: Total memory limit (memory + swap). Ad esempio, 536870912 byte = 512 MBFor example, 536870912 bytes = 512 MB
  • CpuPeriod: lunghezza di un periodo di CPU in microsecondi.CpuPeriod: The length of a CPU period in microseconds. Il valore predefinito è 100000, quindi, ad esempio, il valore 25000 limita un contenitore al 25% delle risorse della CPU.The default value is 100000 so, for example, a value of 25000 limits a container to 25% of the CPU resources.

Nel template.jsin formato, questi valori avranno un aspetto simile all'esempio seguente:In the template.json format, these values would look like the following example:

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

Una volta file per il manifesto finale della distribuzione, questi valori avranno un aspetto simile all'esempio seguente:Once stringified for the final deployment manifest, these values would look like the following example:

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

Passaggi successiviNext steps

Per altri esempi di creazione di opzioni in azione, vedere gli esempi di IoT Edge seguenti:For more examples of create options in action, see the following IoT Edge samples: