Como configurar opções de criação de contêiner para módulos de IoT Edge

Aplica-se a:IoT Edge 1.4 checkmark IoT Edge 1.4

Importante

A versão com suporte é a IoT Edge 1.4. Se você estiver em uma versão anterior, confira Atualizar o IoT Edge.

O parâmetro createOptions no manifesto de implantação permite configurar os contêineres de módulo no runtime. Esse parâmetro expande o controle sobre os módulos e permite tarefas como permitir ou restringir o acesso do módulo aos recursos do dispositivo host ou configurar a rede.

Os módulos IoT Edge são implementados como contêineres compatíveis com o Docker em seu dispositivo de IoT Edge. O Docker oferece muitas opções para a criação de contêineres, e essas opções também se aplicam aos módulos de IoT Edge. Para saber mais, confira Opções de criação de contêiner do Docker.

Opções de criação de formato

O manifesto de implantação do IoT Edge aceita opções de criação formatadas como JSON. Por exemplo, use as opções de criação incluídas automaticamente para cada módulo do edgeHub:

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

Este exemplo de edgeHub usa o parâmetro HostConfig.PortBindings para mapear portas expostas no contêiner para uma porta no dispositivo host.

Caso use a extensão do Azure IoT Edge para Visual Studio ou Visual Studio Code, poderá escrever as opções de criação no formato JSON no arquivo deployment.template.json. Em seguida, quando você usa a extensão para criar a solução IoT Edge ou gerar o manifesto de implantação, ela irá sequenciar o JSON para você no formato que o runtime do IoT Edge espera. Por exemplo:

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

Importante

A extensão do Azure IoT Edge para o Visual Studio Code está em modo de manutenção. A ferramenta iotedgedev é a ferramenta recomendada para desenvolver módulos do IoT Edge.

Uma dica para escrever opções de criação é usar o comando docker inspect. Como parte do seu processo de desenvolvimento, execute o módulo localmente usando docker run <container name>. Depois que o módulo estiver funcionando da maneira desejada, execute docker inspect <container name>. Esse comando gera os detalhes do módulo no formato JSON. Localize os parâmetros que você configurou e copie o JSON. Por exemplo:

Screenshot of the results of the command docker inspect edgeHub.

Cenários comuns

As opções de criação de contêiner permitem muitos cenários, mas aqui estão alguns que aparecem com mais frequência ao criar soluções de IoT Edge:

Mapear porta do host para a porta do módulo

Se o seu módulo precisar se comunicar com um serviço fora da solução do IoT Edge e não estiver usando o roteamento de mensagens para fazer isso, você precisará mapear uma porta de host para uma porta de módulo.

Dica

Esse mapeamento de porta não é necessário para a comunicação de módulo para módulo no mesmo dispositivo. Se o módulo A precisar consultar uma API hospedada no módulo B, ele poderá fazer isso sem qualquer mapeamento de porta. O módulo B precisa expor uma porta em seu dockerfile, por exemplo: EXPOSE 8080. Em seguida, o módulo A pode consultar a API usando o nome do módulo B, por exemplo: http://ModuleB:8080/api.

Primeiro, certifique-se de que uma porta dentro do módulo esteja exposta para escutar conexões. Você pode fazer isso usando uma instrução EXPOSE no dockerfile. Por exemplo, EXPOSE 8080. A instrução expose usa como padrão o protocolo TCP, se não for especificado, ou você pode especificar o UDP.

Em seguida, use a configuração PortBindings no grupo HostConfig das opções de criação do contêiner do Docker para mapear a porta exposta no módulo para uma porta no dispositivo host. Por exemplo, se você expôs a porta 8080 dentro do módulo e deseja mapeá-la para a porta 80 do dispositivo host, as opções de criação no arquivo template.json seriam parecidas com o exemplo a seguir:

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

Depois de stringified para o manifesto de implantação, a mesma configuração seria semelhante ao seguinte exemplo:

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

Restringir a memória do módulo e o uso da CPU

Você pode declarar quantos recursos do host um módulo pode usar. Este controle é útil para garantir que um módulo não consuma muita memória ou uso da CPU e evitar que outros processos sejam executados no dispositivo. Você pode gerenciar essas configurações com opções de criação de contêiner do Docker no grupo HostConfig, incluindo:

  • Memória: limite de memória em bytes. Por exemplo, 268435456 bytes = 256 MB.
  • MemorySwap: limite de memória total (memória + troca). Por exemplo, 536870912 bytes = 512 MB.
  • NanoCpus: cota de CPU em unidades de 10-9 (1 bilionésimo) CPUs. Por exemplo, 250000000 nanocpus = 0,25 CPU.

No formato template.json, esses valores seriam semelhantes ao seguinte exemplo:

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

Depois de sequenciados para o manifesto de implantação final, esses valores se parecerão com o exemplo a seguir:

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

Otimizar GPU de um módulo do IoT Edge

Se você estiver executando seu módulo do IoT Edge em uma máquina virtual com otimização de GPU, também poderá habilitar um módulo do IoT Edge para se conectar à sua GPU. Para fazer isso com um módulo existente, adicione algumas especificações ao seu createOptions:

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

Para confirmar se essas configurações foram adicionadas com êxito, use o comando inspecionar do Docker para ver a nova configuração em uma impressão JSON.

sudo docker inspect <YOUR-MODULE-NAME>

Para saber mais sobre como seu dispositivo e máquina virtual se conectam a uma GPU, consulte Configurar, conectar e verificar um módulo do IoT Edge para uma GPU.

Próximas etapas

Para obter mais exemplos de opções de criação em ação, confira os seguintes exemplos do IoT Edge: