Usar o Azure Batch para executar cargas de trabalho de contentor

Atenção

Este artigo faz referência ao CentOS, uma distribuição Linux que está se aproximando do status de Fim da Vida Útil (EOL). Por favor, considere o seu uso e planejamento de acordo. Para obter mais informações, consulte as diretrizes de Fim da Vida Útil do CentOS.

O Azure Batch permite executar e dimensionar um grande número de trabalhos de computação em lote no Azure. As tarefas em lote podem ser executadas diretamente em máquinas virtuais (nós) num conjunto de lotes, mas também pode configurar um conjunto de lotes para executar tarefas em contentores compatíveis com o Docker nos nós. Este artigo mostra como criar um conjunto de nós de computação que suporta a execução de tarefas de contentor e, em seguida, executar tarefas de contentor no conjunto.

Os exemplos de código aqui usam os SDKs Batch .NET e Python. Você também pode usar outros SDKs e ferramentas de lote, incluindo o portal do Azure, para criar pools de lotes habilitados para contêiner e executar tarefas de contêiner.

Porquê utilizar contentores?

Os contêineres fornecem uma maneira fácil de executar tarefas em lote sem ter que gerenciar um ambiente e dependências para executar aplicativos. Os contêineres implantam aplicativos como unidades leves, portáteis e autossuficientes que podem ser executadas em vários ambientes diferentes. Por exemplo, crie e teste um contêiner localmente e, em seguida, carregue a imagem do contêiner em um registro no Azure ou em outro lugar. O modelo de implantação de contêiner garante que o ambiente de tempo de execução do seu aplicativo esteja sempre instalado e configurado corretamente onde quer que você hospede o aplicativo. As tarefas baseadas em contêiner no Batch também podem tirar proveito dos recursos de tarefas que não são de contêiner, incluindo pacotes de aplicativos e gerenciamento de arquivos de recursos e arquivos de saída.

Pré-requisitos

Você deve estar familiarizado com os conceitos de contêiner e como criar um pool de lotes e trabalho.

  • Versões do SDK: Os SDKs de lote suportam imagens de contêiner a partir das seguintes versões:

    • Batch REST API versão 2017-09-01.6.0
    • Batch .NET SDK versão 8.0.0
    • Batch Python SDK versão 4.0
    • Batch Java SDK versão 3.0
    • Batch Node.js SDK versão 3.0
  • Contas: na sua subscrição do Azure, tem de criar uma conta em lote e, opcionalmente, uma conta de Armazenamento do Azure.

  • Uma imagem de máquina virtual (VM) suportada: os contêineres só são suportados em pools criados com a Configuração da Máquina Virtual, a partir de uma imagem suportada (listada na próxima seção). Se você fornecer uma imagem personalizada, consulte as considerações na seção a seguir e os requisitos em Usar uma imagem gerenciada para criar um pool de imagens personalizadas.

Nota

Das versões do Batch SDK:

  • Batch .NET SDK versão 16.0.0
  • Batch Python SDK versão 14.0.0
  • Batch Java SDK versão 11.0.0
  • Batch Node.js SDK versão 11.0.0

Atualmente, a containerConfiguration propriedade requer Type a ser passada e os valores suportados são: ContainerType.DockerCompatible e ContainerType.CriCompatible.

Tenha em mente as seguintes limitações:

  • O Batch fornece suporte a RDMA (acesso remoto direto à memória) apenas para contêineres executados em pools Linux.
  • Para cargas de trabalho de contêiner do Windows, você deve escolher um tamanho de VM multicore para seu pool.

Importante

O Docker, por padrão, criará uma ponte de rede com uma especificação de sub-rede de 172.17.0.0/16. Se você estiver especificando uma rede virtual para seu pool, certifique-se de que não haja intervalos de IP conflitantes.

Imagens de VM suportadas

Use uma das seguintes imagens suportadas do Windows ou Linux para criar um pool de nós de computação de VM para cargas de trabalho de contêiner. Para obter mais informações sobre imagens do Marketplace compatíveis com o Batch, consulte Lista de imagens de máquina virtual.

Suporte do Windows

O Batch suporta imagens de servidor Windows que têm designações de suporte de contêiner. A API para listar todas as imagens suportadas no Batch indica um DockerCompatible recurso se a imagem suportar contêineres do Docker. O Batch permite, mas não suporta diretamente, imagens publicadas pela Mirantis com capacidade anotada como DockerCompatible. Essas imagens só podem ser implantadas em uma conta de lote do modo de alocação do pool de Assinaturas de Usuário.

Você também pode criar uma imagem personalizada para habilitar a funcionalidade de contêiner no Windows.

Nota

Os SKUs de -with-containers imagem ou -with-containers-smalldisk estão desativados. Consulte o anúncio para obter detalhes e opções alternativas de tempo de execução do contêiner.

Suporte para Linux

Para cargas de trabalho de contêiner do Linux, o Batch atualmente dá suporte às seguintes imagens do Linux publicadas no Azure Marketplace sem a necessidade de uma imagem personalizada.

  • Editora: microsoft-dsvm
    • Oferta: ubuntu-hpc

Opções de imagem alternativas

Atualmente, existem outras imagens publicadas que microsoft-azure-batch suportam cargas de trabalho de contêiner:

  • Editora: microsoft-azure-batch
    • Oferta: centos-container
    • Oferta: centos-container-rdma (Para uso exclusivo em SKUs VM com Infiniband)
    • Oferta: ubuntu-server-container
    • Oferta: ubuntu-server-container-rdma (Para uso exclusivo em SKUs VM com Infiniband)

Importante

Recomenda-se usar a microsoft-dsvmubuntu-hpc imagem da VM em vez das imagens publicadas pela microsoft-azure-batch. Esta imagem pode ser usada em qualquer SKU de VM.

Notas

A raiz de dados do docker das imagens acima está em lugares diferentes:

  • Para as imagens publicadas microsoft-azure-batch no Lote do Azure (Oferta: centos-container-rdma, etc.), a raiz de dados do docker é mapeada para /mnt/batch/docker, que está localizado no disco temporário.
  • Para a imagem HPC, ou microsoft-dsvm (Oferta: ubuntu-hpc, etc.), a raiz de dados do docker permanece inalterada em relação ao padrão do Docker, que é /var/lib/docker no Linux e C:\ProgramData\Docker no Windows. Essas pastas estão localizadas no disco do sistema operacional.

Para imagens não publicadas em lote, o disco do sistema operacional tem o risco potencial de ser preenchido rapidamente à medida que as imagens de contêiner são baixadas.

Soluções potenciais para os clientes

Altere a raiz de dados do docker em uma tarefa inicial ao criar um pool no BatchExplorer. Aqui está um exemplo do comando Iniciar tarefa:

1)  sudo systemctl stop docker
2)  sudo vi /lib/systemd/system/docker.service
    +++
    FROM:
    ExecStart=/usr/bin/docker daemon -H fd://
    TO:
    ExecStart=/usr/bin/docker daemon -g /new/path/docker -H fd://
    +++
3)  sudo systemctl daemon-reload
4)  sudo systemctl start docker

Essas imagens só têm suporte para uso em pools de Lotes do Azure e são voltadas para a execução de contêineres do Docker. Apresentam:

  • Um tempo de execução de contêiner Moby compatível com Docker pré-instalado.
  • Drivers de GPU NVIDIA pré-instalados e tempo de execução de contêiner NVIDIA, para simplificar a implantação em VMs da série N do Azure.
  • As imagens de VM com o sufixo de são pré-configuradas com suporte para tamanhos de -rdma VM RDMA InfiniBand. Essas imagens de VM não devem ser usadas com tamanhos de VM que não tenham suporte a InfiniBand.

Você também pode criar imagens personalizadas compatíveis para contêineres Batch em uma das distribuições Linux compatíveis com Batch. Para obter suporte ao Docker em uma imagem personalizada, instale um tempo de execução compatível com o Docker adequado, como uma versão do Docker ou do Mirantis Container Runtime. Instalar apenas uma ferramenta compatível com Docker-CLI é insuficiente; é necessário um tempo de execução compatível com o Docker Engine.

Importante

Nem a Microsoft nem o Azure Batch fornecerão suporte para problemas relacionados ao Docker (qualquer versão ou edição), Mirantis Container Runtime ou tempos de execução do Moby. Os clientes que optarem por usar esses tempos de execução em suas imagens devem entrar em contato com a empresa ou entidade que fornece suporte para problemas de tempo de execução.

Mais considerações para usar uma imagem Linux personalizada:

  • Para aproveitar o desempenho da GPU dos tamanhos da série N do Azure ao usar uma imagem personalizada, pré-instale os drivers NVIDIA. Além disso, você precisa instalar o Docker Engine Utility para GPUs NVIDIA, NVIDIA Docker.
  • Para acessar a rede RDMA do Azure, use um tamanho de VM compatível com RDMA. Os drivers RDMA necessários são instalados nas imagens HPC e Ubuntu do CentOS suportadas pelo Batch. Pode ser necessária uma configuração extra para executar cargas de trabalho MPI. Consulte Usar instâncias RDMA ou GPU no pool de lotes.

Configuração de contêiner para pool de lotes

Para habilitar um pool de lotes para executar cargas de trabalho de contêiner, você deve especificar as definições de ContainerConfiguration no objeto VirtualMachineConfiguration do pool. Este artigo fornece links para a referência da API .NET em lote. As configurações correspondentes estão na API Python em lote.

Você pode criar um pool habilitado para contêiner com ou sem imagens de contêiner pré-buscadas, conforme mostrado nos exemplos a seguir. O processo pull (ou prefetch) permite pré-carregar imagens de contêiner do Docker Hub ou de outro registro de contêiner na Internet. Para obter o melhor desempenho, use um registro de contêiner do Azure na mesma região que a conta de lote.

A vantagem de pré-buscar imagens de contêiner é que, quando as tarefas começam a ser executadas pela primeira vez, elas não precisam esperar pelo download da imagem de contêiner. A configuração de contêiner extrai imagens de contêiner para as VMs quando o pool é criado. As tarefas executadas no pool podem fazer referência à lista de imagens de contêiner e opções de execução de contêiner.

Pool sem imagens de contêiner pré-buscadas

Para configurar um pool habilitado para contêiner sem imagens de contêiner pré-buscadas, defina ContainerConfiguration e VirtualMachineConfiguration objetos conforme mostrado nos exemplos a seguir. Estes exemplos usam a imagem de pools de contêineres do Ubuntu Server for Azure Batch do Marketplace.

Nota: A versão do servidor Ubuntu usada no exemplo é para fins de ilustração. Sinta-se à vontade para alterar o node_agent_sku_id para a versão que você está usando.

image_ref_to_use = batch.models.ImageReference(
    publisher='microsoft-dsvm',
    offer='ubuntu-hpc',
    sku='2204',
    version='latest')

"""
Specify container configuration. This is required even though there are no prefetched images.
"""

container_conf = batch.models.ContainerConfiguration()

new_pool = batch.models.PoolAddParameter(
    id=pool_id,
    virtual_machine_configuration=batch.models.VirtualMachineConfiguration(
        image_reference=image_ref_to_use,
        container_configuration=container_conf,
        node_agent_sku_id='batch.node.ubuntu 22.04'),
    vm_size='STANDARD_D2S_V3',
    target_dedicated_nodes=1)
...
ImageReference imageReference = new ImageReference(
    publisher: "microsoft-dsvm",
    offer: "ubuntu-hpc",
    sku: "2204",
    version: "latest");

// Specify container configuration. This is required even though there are no prefetched images.
ContainerConfiguration containerConfig = new ContainerConfiguration();

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 1,
    virtualMachineSize: "STANDARD_D2S_V3",
    virtualMachineConfiguration: virtualMachineConfiguration);

Pré-busca de imagens para configuração de contêiner

Para pré-buscar imagens de contêiner no pool, adicione a lista de imagens de contêiner (container_image_names em Python) ao ContainerConfiguration.

O exemplo Python básico a seguir mostra como pré-buscar uma imagem de contêiner padrão do Ubuntu do Docker Hub.

image_ref_to_use = batch.models.ImageReference(
    publisher='microsoft-dsvm',
    offer='ubuntu-hpc',
    sku='2204',
    version='latest')

"""
Specify container configuration, fetching the official Ubuntu container image from Docker Hub.
"""

container_conf = batch.models.ContainerConfiguration(
    container_image_names=['ubuntu'])

new_pool = batch.models.PoolAddParameter(
    id=pool_id,
    virtual_machine_configuration=batch.models.VirtualMachineConfiguration(
        image_reference=image_ref_to_use,
        container_configuration=container_conf,
        node_agent_sku_id='batch.node.ubuntu 22.04'),
    vm_size='STANDARD_D2S_V3',
    target_dedicated_nodes=1)
...

O exemplo de C# a seguir pressupõe que você deseja pré-buscar uma imagem do TensorFlow do Docker Hub. Este exemplo inclui uma tarefa de início que é executada no host da VM nos nós do pool. Você pode executar uma tarefa de início no host, por exemplo, para montar um servidor de arquivos que possa ser acessado a partir dos contêineres.

ImageReference imageReference = new ImageReference(
    publisher: "microsoft-dsvm",
    offer: "ubuntu-hpc",
    sku: "2204",
    version: "latest");

ContainerRegistry containerRegistry = new ContainerRegistry(
    registryServer: "https://hub.docker.com",
    userName: "UserName",
    password: "YourPassword"
);

// Specify container configuration, prefetching Docker images
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> { "tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry };

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Set a native host command line start task
StartTask startTaskContainer = new StartTask( commandLine: "<native-host-command-line>" );

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    virtualMachineSize: "Standard_NC6S_V3",
    virtualMachineConfiguration: virtualMachineConfiguration);

// Start the task in the pool
pool.StartTask = startTaskContainer;
...

Pré-busca de imagens de um registro de contêiner privado

Você também pode pré-buscar imagens de contêiner autenticando em um servidor de registro de contêiner privado. Nos exemplos a seguir, os ContainerConfiguration objetos e VirtualMachineConfiguration pré-buscam uma imagem privada do TensorFlow de um registro de contêiner privado do Azure. A referência de imagem é a mesma do exemplo anterior.

image_ref_to_use = batch.models.ImageReference(
    publisher='microsoft-dsvm',
    offer='ubuntu-hpc',
    sku='2204',
    version='latest')

# Specify a container registry
container_registry = batch.models.ContainerRegistry(
        registry_server="myRegistry.azurecr.io",
        user_name="myUsername",
        password="myPassword")

# Create container configuration, prefetching Docker images from the container registry
container_conf = batch.models.ContainerConfiguration(
        container_image_names = ["myRegistry.azurecr.io/samples/myImage"],
        container_registries =[container_registry])

new_pool = batch.models.PoolAddParameter(
            id="myPool",
            virtual_machine_configuration=batch.models.VirtualMachineConfiguration(
                image_reference=image_ref_to_use,
                container_configuration=container_conf,
                node_agent_sku_id='batch.node.ubuntu 22.04'),
            vm_size='STANDARD_D2S_V3',
            target_dedicated_nodes=1)
// Specify a container registry
ContainerRegistry containerRegistry = new ContainerRegistry(
    registryServer: "myContainerRegistry.azurecr.io",
    userName: "myUserName",
    password: "myPassword");

// Create container configuration, prefetching Docker images from the container registry
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> {
        "myContainerRegistry.azurecr.io/tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry } );

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 2,
    virtualMachineSize: "Standard_NC6S_V3",
    virtualMachineConfiguration: virtualMachineConfiguration);
...

Suporte de identidade gerenciada para ACR

Quando você acessa contêineres armazenados no Registro de Contêiner do Azure, um nome de usuário/senha ou uma identidade gerenciada podem ser usados para autenticar com o serviço. Para usar uma identidade gerenciada, primeiro verifique se a identidade foi atribuída ao pool e se a identidade tem a AcrPull função atribuída para o registro de contêiner que você deseja acessar. Em seguida, instrua Batch com qual identidade usar ao autenticar com ACR.

ContainerRegistry containerRegistry = new ContainerRegistry(
    registryServer: "myContainerRegistry.azurecr.io",
    identityReference: new ComputeNodeIdentityReference() { ResourceId = "/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name" }
);

// Create container configuration, prefetching Docker images from the container registry
ContainerConfiguration containerConfig = new ContainerConfiguration();
containerConfig.ContainerImageNames = new List<string> {
        "myContainerRegistry.azurecr.io/tensorflow/tensorflow:latest-gpu" };
containerConfig.ContainerRegistries = new List<ContainerRegistry> { containerRegistry } );

// VM configuration
VirtualMachineConfiguration virtualMachineConfiguration = new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.ubuntu 22.04");
virtualMachineConfiguration.ContainerConfiguration = containerConfig;

// Create pool
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 2,
    virtualMachineSize: "Standard_NC6S_V3",
    virtualMachineConfiguration: virtualMachineConfiguration);
...

Configurações de contêiner para a tarefa

Para executar uma tarefa de contêiner em um pool habilitado para contêiner, especifique configurações específicas do contêiner. As configurações incluem a imagem a ser usada, o registro e as opções de execução do contêiner.

  • Use a ContainerSettings propriedade das classes de tarefa para definir configurações específicas do contêiner. Essas configurações são definidas pela classe TaskContainerSettings . A --rm opção de contêiner não requer outra --runtime opção, pois é cuidada pelo Batch.

  • Se você executar tarefas em imagens de contêiner, a tarefa na nuvem e a tarefa do gerenciador de tarefas exigirão configurações de contêiner. No entanto, a tarefa de início, a tarefa de preparação de trabalho e a tarefa de liberação de trabalho não exigem configurações de contêiner (ou seja, elas podem ser executadas dentro de um contexto de contêiner ou diretamente no nó).

  • Para Linux, o Batch mapeia a permissão de usuário/grupo para o contêiner. Se o acesso a qualquer pasta dentro do contêiner exigir permissão de administrador, talvez seja necessário executar a tarefa como escopo do pool com nível de elevação de administrador. Isso garante que o Batch execute a tarefa como raiz no contexto do contêiner. Caso contrário, um usuário não administrador pode não ter acesso a essas pastas.

  • Para pools de contêineres com hardware habilitado para GPU, o Batch habilita automaticamente a GPU para tarefas de contêiner, portanto, você não deve incluir o –gpus argumento.

Linha de comando da tarefa de contêiner

Quando você executa uma tarefa de contêiner, o Batch usa automaticamente o comando docker create para criar um contêiner usando a imagem especificada na tarefa. Em seguida, o lote controla a execução da tarefa no contêiner.

Assim como acontece com tarefas em lote não contêiner, você define uma linha de comando para uma tarefa de contêiner. Como o Batch cria automaticamente o contêiner, a linha de comando especifica apenas o comando ou comandos que são executados no contêiner.

Se a imagem de contêiner para uma tarefa em lote estiver configurada com um script ENTRYPOINT , você poderá definir sua linha de comando para usar o ENTRYPOINT padrão ou substituí-lo:

  • Para usar o ENTRYPOINT padrão da imagem do contêiner, defina a linha de comando da tarefa como a cadeia de caracteres ""vazia.

  • Para substituir o ENTRYPOINT padrão, adicione o --entrypoint argumento, por exemplo: --entrypoint "/bin/sh - python"

  • Se a imagem não tiver um ENTRYPOINT, defina uma linha de comando apropriada para o contêiner, por exemplo, /app/myapp ou /bin/sh -c python myscript.py

ContainerRunOptions opcionais são outros argumentos que você fornece ao docker create comando que Batch usa para criar e executar o contêiner. Por exemplo, para definir um diretório de trabalho para o contêiner, defina a --workdir <directory> opção. Consulte a referência de criação do docker para obter mais opções.

Diretório de trabalho da tarefa de contêiner

Uma tarefa de contêiner de lote é executada em um diretório de trabalho no contêiner que é semelhante ao diretório que o lote configura para uma tarefa regular (não contêiner). Este diretório de trabalho é diferente do WORKDIR se configurado na imagem ou do diretório de trabalho do contêiner padrão (C:\ em um contêiner do Windows ou / em um contêiner do Linux).

Para uma tarefa de contêiner em lote:

  • Todos os diretórios recursivamente abaixo do AZ_BATCH_NODE_ROOT_DIR nó no host (a raiz dos diretórios do Lote do Azure) são mapeados no contêiner.
  • Todas as variáveis de ambiente de tarefa são mapeadas no contêiner.
  • O diretório AZ_BATCH_TASK_WORKING_DIR de trabalho da tarefa no nó é definido da mesma forma que para uma tarefa normal e mapeado no contêiner.

Importante

Para pools de contêineres do Windows em famílias de VM com discos efêmeros, todo o disco efêmero é mapeado para o espaço do contêiner devido às limitações do contêiner do Windows.

Esses mapeamentos permitem que você trabalhe com tarefas de contêiner da mesma forma que tarefas sem contêiner. Por exemplo, instale aplicativos usando pacotes de aplicativos, acesse arquivos de recursos do Armazenamento do Azure, use configurações de ambiente de tarefas e persista arquivos de saída de tarefas depois que o contêiner parar.

Solucionar problemas de tarefas de contêiner

Se a tarefa de contêiner não for executada conforme o esperado, talvez seja necessário obter informações sobre a configuração WORKDIR ou ENTRYPOINT da imagem do contêiner. Para ver a configuração, execute o comando docker image inspect .

Se necessário, ajuste as configurações da tarefa de contêiner com base na imagem:

  • Especifique um caminho absoluto na linha de comando da tarefa. Se o ENTRYPOINT padrão da imagem for usado para a linha de comando da tarefa, certifique-se de que um caminho absoluto esteja definido.
  • Nas opções de execução do contêiner da tarefa, altere o diretório de trabalho para corresponder ao WORKDIR na imagem. Por exemplo, defina --workdir /app.

Exemplos de tarefas de contêiner

O trecho Python a seguir mostra uma linha de comando básica em execução em um contêiner criado a partir de uma imagem fictícia extraída do Docker Hub. Aqui, a --rm opção container remove o contêiner após a conclusão da tarefa e define --workdir um diretório de trabalho. A linha de comando substitui o contêiner ENTRYPOINT por um comando shell simples que grava um pequeno arquivo no diretório de trabalho da tarefa no host.

task_id = 'sampletask'
task_container_settings = batch.models.TaskContainerSettings(
    image_name='myimage',
    container_run_options='--rm --workdir /')
task = batch.models.TaskAddParameter(
    id=task_id,
    command_line='/bin/sh -c \"echo \'hello world\' > $AZ_BATCH_TASK_WORKING_DIR/output.txt\"',
    container_settings=task_container_settings
)

O exemplo de C# a seguir mostra as configurações básicas de contêiner para uma tarefa na nuvem:

// Simple container task command
string cmdLine = "c:\\app\\myApp.exe";

TaskContainerSettings cmdContainerSettings = new TaskContainerSettings (
    imageName: "myimage",
    containerRunOptions: "--rm --workdir c:\\app"
    );

CloudTask containerTask = new CloudTask (
    id: "Task1",
    commandline: cmdLine);
containerTask.ContainerSettings = cmdContainerSettings;

Próximos passos

  • Para obter informações sobre como instalar e usar o Docker CE no Linux, consulte a documentação do Docker.
  • Saiba como Usar uma imagem gerenciada para criar um pool de imagens personalizado.
  • Saiba mais sobre o projeto Moby, uma estrutura para a criação de sistemas baseados em contêineres.