Compartilhar via


Colocar um aplicativo .NET Core em contêiner

Aplica-se a: Windows Server 2022, Windows Server 2019 e Windows Server 2016

Este tópico descreve como empacotar um aplicativo .NET de exemplo para implantação como um contêiner do Windows, após configurar o ambiente conforme descrito em Introdução: Preparar o Windows para contêineres e executar seu primeiro contêiner, conforme descrito em Executar o primeiro contêiner do Windows.

Você também precisará ter o sistema de controle do código-fonte Git instalado no computador. Para instalá-lo, visite Git.

Clonar o código de exemplo do GitHub

Todo o código-fonte de exemplo do contêiner fica no repositório Git Virtualization-Documentation (conhecido informalmente como repo), em uma pasta chamada windows-container-samples.

  1. Abra uma sessão do PowerShell e altere os diretórios para a pasta na qual deseja armazenar esse repositório. (Outros tipos de janela de prompt de comando também funcionam, mas nossos comandos de exemplo usam o PowerShell.)

  2. Clone o repositório para seu diretório de trabalho atual:

    git clone https://github.com/MicrosoftDocs/Virtualization-Documentation.git
    
  3. Navegue até o diretório de exemplo encontrado em Virtualization-Documentation\windows-container-samples\asp-net-getting-started e crie um Dockerfile usando os comandos a seguir.

    Um Dockerfile é semelhante a um makefile – é uma lista de instruções que dizem ao mecanismo de contêiner como criar a imagem de contêiner.

    # Navigate into the sample directory
    Set-Location -Path Virtualization-Documentation\windows-container-samples\asp-net-getting-started
    
    # Create the Dockerfile for our project
    New-Item -Name Dockerfile -ItemType file
    

Escrever o Dockerfile

Abra o Dockerfile que acabou de criar usando o editor de texto que desejar e, em seguida, adicione o seguinte conteúdo:

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Vamos examiná-lo linha por linha e explicar o que cada instrução faz.

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

O primeiro grupo de linhas determina sobre qual imagem base criaremos nosso contêiner. Se o sistema local não tiver essa imagem ainda, o docker tentará obtê-la automaticamente. O mcr.microsoft.com/dotnet/core/sdk:2.1 vem empacotado com o SDK do .NET Core 2.1 instalado, portanto, é capaz de executar a tarefa de criar projetos ASP .NET Core voltados para a versão 2.1. A instrução a seguir altera o diretório de trabalho em nosso contêiner para /app, para que todos os comandos depois desse sejam executados nesse contexto.

COPY *.csproj ./
RUN dotnet restore

Em seguida, essas instruções copiam os arquivos .csproj para o diretório /app do contêiner build-env. Depois de copiar esse arquivo, o .NET fará a leitura dele e buscará todas as dependências e ferramentas de que o projeto precisa.

COPY . ./
RUN dotnet publish -c Release -o out

Depois que o .NET tiver efetuado pull de todas as dependências para o contêiner build-env, a instrução seguinte copiará todos os arquivos de origem do projeto para o contêiner. Em seguida, instruiremos o .NET a publicar o aplicativo com uma configuração de versão e especificaremos o caminho de saída.

A compilação deverá ser bem-sucedida. Agora, precisamos criar a imagem final.

Dica

Este guia de início rápido cria um projeto do .NET Core da origem. Ao criar imagens de contêiner, é uma melhor prática incluir apenas a carga de produção e suas dependências na imagem de contêiner. Não queremos que o SDK do .NET Core seja incluído em nossa imagem final porque precisamos apenas do runtime do .NET Core, portanto, o dockerfile é escrito de modo a usar um contêiner temporário que é empacotado com o SDK chamado build-env para compilar o aplicativo.

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Como nosso aplicativo é ASP.NET, especificamos uma imagem com esse runtime incluído. Então, copiamos todos os arquivos do diretório de saída do contêiner temporário no contêiner final. Configuramos nosso contêiner para ser executado com nosso novo aplicativo como seu ponto de entrada quando o contêiner é iniciado

Escrevemos o dockerfile para executar uma compilação em vários estágios. Quando o dockerfile for executado, ele usará o contêiner temporário, build-env, com o SDK do .NET Core 2.1 para criar o aplicativo de exemplo e, em seguida, copiar os binários de saída para outro contêiner que contém apenas o runtime do .NET Core 2.1, de modo que minimizamos o tamanho do contêiner final.

Compilar e executar o aplicativo

Com o Dockerfile escrito, podemos apontar o Docker para nosso Dockerfile e pedir que ele crie e, em seguida, execute a imagem:

  1. Em uma janela de prompt de comando, navegue até o diretório em que o dockerfile reside e execute o comando docker build para criar o contêiner usando o Dockerfile.

    docker build -t my-asp-app .
    
  2. Para executar o contêiner recém-criado, execute o comando docker run.

    docker run -d -p 5000:80 --name myapp my-asp-app
    

    Vamos detalhar este comando:

    • -d instrui o Docker a executar o contêiner “desanexado”, o que significa que nenhum console é conectado ao console dentro do contêiner. O contêiner é executado em segundo plano.
    • -p 5000:80 instrui o Docker a mapear a porta 5000 no host para a porta 80 no contêiner. Cada contêiner obtém o próprio endereço IP. O ASP.NET escuta por padrão na porta 80. O mapeamento de portas nos permite acessar o endereço IP do host na porta mapeada e o Docker encaminhará todo o tráfego para a porta de destino dentro do contêiner.
    • --name myapp instrui o Docker a dar a esse contêiner um nome conveniente com o qual fazer consultas (para que não haja necessidade de buscar a ID do contêiner atribuída no runtime pelo Docker).
    • my-asp-app é a imagem que queremos que o Docker execute. Essa é a imagem de contêiner produzida como a culminação do processo de docker build.
  3. Abra um navegador da Web e navegue até http://localhost:5000 para ver seu aplicativo conteinerizado, conforme mostrado nesta captura de tela:

    Página da Web do ASP.NET Core, sendo executada de um localhost em um contêiner

Próximas etapas

  1. A próxima etapa é publicar seu aplicativo Web ASP.NET em contêiner em um registro privado usando o Registro de Contêiner do Azure. Isso permite implantá-lo em sua organização.

    Quando chegar à seção em que você efetua push da imagem de contêiner para o registro, especifique o nome do aplicativo ASP.NET que você acabou de empacotar (my-asp-app) junto com o registro de contêiner (por exemplo: contoso-container-registry):

    docker tag my-asp-app contoso-container-registry.azurecr.io/my-asp-app:v1
    

    Para ver mais exemplos de aplicativos e seus dockerfiles associados, confira amostras de contêiner adicionais.

  2. Depois de publicar o aplicativo no registro de contêiner, a etapa seguinte seria implantar o aplicativo em um cluster do Kubernetes criado com o Serviço de Kubernetes do Azure.