Partilhar via


Ferramentas de contêiner do Visual Studio com ASP.NET Core

Note

Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.

Warning

Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 10 deste artigo.

O Visual Studio 2017 ou versões posteriores oferecem suporte à criação, depuração e execução de aplicativos ASP.NET Core em contêineres. Há suporte para contêineres Windows e Linux.

Visualizar ou descarregar amostra de código (como descarregar)

Prerequisites

Instalação e configuração

Para a instalação do Docker, primeiro revise as informações em Docker para Windows: O que saber antes de instalar. Em seguida, instale o Docker para Windows.

As unidades compartilhadas no Docker para Windows devem ser configuradas para oferecer suporte ao mapeamento e à depuração de volumes. Clique com o botão direito do mouse no ícone do Docker da bandeja do sistema, selecione Configurações e selecione Unidades compartilhadas. Selecione a unidade onde o Docker armazena arquivos. Clique em Aplicar.

Caixa de diálogo para selecionar o compartilhamento de unidade C local para contêineres

Tip

As versões 15.6 ou posteriores do Visual Studio 2017 solicitam quando as Unidades Compartilhadas não estão configuradas.

Adicionar um projeto a um contêiner do Docker

Ao adicionar suporte ao Docker a um projeto, escolha um contêiner Windows ou Linux. O host do Docker deve estar executando o mesmo tipo de contêiner. Para alterar o tipo de contêiner na instância do Docker em execução, clique com o botão direito do mouse no ícone do Docker da bandeja do sistema e escolha Alternar para contêineres do Windows... ou Alternar para contêineres do Linux....

Nova aplicação

Ao criar um novo aplicativo com os modelos de projeto ASP.NET Core Web Application , marque a caixa de seleção Habilitar suporte ao Docker :

Caixa de seleção Ativar suporte ao Docker

A lista suspensa OS permite selecionar um tipo de contêiner.

Aplicação existente

Há duas opções para adicionar suporte ao Docker a um projeto existente por meio das ferramentas. Abra o projeto no Visual Studio e escolha uma das seguintes opções:

  • Selecione Suporte do Docker no menu Projeto .
  • Clique com o botão direito do mouse no projeto no Gerenciador de Soluções e selecione Adicionar>Suporte ao Docker.

As Ferramentas de Contêiner do Visual Studio não oferecem suporte à adição do Docker a um projeto existente do ASP.NET Core destinado ao .NET Framework.

Visão geral do Dockerfile

Um Dockerfile, a receita para criar uma imagem final do Docker, é adicionado à raiz do projeto. Consulte a referência do Dockerfile para entender os comandos dentro dele. Este Dockerfile específico usa uma compilação de vários estágios com quatro estágios de compilação distintos e nomeados:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS base
WORKDIR /app
EXPOSE 59518
EXPOSE 44364

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build
WORKDIR /src
COPY HelloDockerTools/HelloDockerTools.csproj HelloDockerTools/
RUN dotnet restore HelloDockerTools/HelloDockerTools.csproj
COPY . .
WORKDIR /src/HelloDockerTools
RUN dotnet build HelloDockerTools.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish HelloDockerTools.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]

A imagem anterior do Dockerfile inclui o tempo de execução do ASP.NET Core e os pacotes NuGet. Os pacotes são compilados em tempo real (JIT) para melhorar o desempenho durante a inicialização.

Quando a caixa de seleção Configurar para HTTPS da caixa de diálogo do novo projeto é marcada, o Dockerfile expõe duas portas. Uma porta é usada para tráfego HTTP; a outra porta é usada para HTTPS. Se a caixa de seleção não estiver marcada, uma única porta (80) será exposta para o tráfego HTTP.

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY HelloDockerTools/HelloDockerTools.csproj HelloDockerTools/
RUN dotnet restore HelloDockerTools/HelloDockerTools.csproj
COPY . .
WORKDIR /src/HelloDockerTools
RUN dotnet build HelloDockerTools.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish HelloDockerTools.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]

A imagem anterior do Dockerfile inclui os pacotes NuGet ASP.NET Core, que são compilados just-in-time (JIT) para melhorar o desempenho de inicialização.

Adicionar suporte ao orquestrador de contêineres a um aplicativo

As versões 15.7 ou anteriores do Visual Studio 2017 oferecem suporte ao Docker Compose como a única solução de orquestração de contêineres. Os artefatos do Docker Compose são adicionados através da opção Adicionar>Suporte ao Docker.

As versões 15.8 ou posteriores do Visual Studio 2017 adicionam uma solução de orquestração somente quando instruída. Clique com o botão direito do mouse no projeto no Gerenciador de Soluções e selecione Adicionar>Suporte ao Container Orchestrator. As seguintes opções estão disponíveis:

Docker Compose

As ferramentas de contêiner do Visual Studio adicionam um projeto docker-compose à solução com os seguintes arquivos:

  • docker-compose.dcproj: O arquivo que representa o projeto. Inclui um <DockerTargetOS> elemento que especifica o SO a ser usado.
  • .dockerignore: Lista os padrões de arquivo e diretório a serem excluídos ao gerar um contexto de compilação.
  • docker-compose.yml: O arquivo base Docker Compose usado para definir a coleção de imagens criadas e executadas com docker-compose build e docker-compose run, respectivamente.
  • docker-compose.override.yml: Um ficheiro opcional, lido pelo Docker Compose, com ajustes de configuração para serviços. Visual Studio executa docker-compose -f "docker-compose.yml" -f "docker-compose.override.yml" para mesclar esses arquivos.

O arquivo docker-compose.yml faz referência ao nome da imagem que é criada quando o projeto é executado:

version: '3.4'

services:
  hellodockertools:
    image: ${DOCKER_REGISTRY}hellodockertools
    build:
      context: .
      dockerfile: HelloDockerTools/Dockerfile

No exemplo anterior, image: hellodockertools gera a imagem hellodockertools:dev quando o aplicativo é executado no modo de depuração . A hellodockertools:latest imagem é gerada quando a aplicação é executada no modo Release.

Prefixe o nome da imagem com o nome de utilizador do Docker Hub (por exemplo, dockerhubusername/hellodockertools) se a imagem for enviada para o registo. Como alternativa, altere o nome da imagem para incluir a URL do registro privado (por exemplo, privateregistry.domain.com/hellodockertools) dependendo da configuração.

Se você quiser um comportamento diferente com base na configuração de compilação (por exemplo, Debug ou Release), adicione arquivos docker-compose específicos da configuração. Os arquivos devem ser nomeados de acordo com a configuração de compilação (por exemplo, docker-compose.vs.debug.yml e docker-compose.vs.release.yml) e colocados no mesmo local que o arquivo docker-compose-override.yml .

Usando os ficheiros de substituição específicos da configuração, pode-se especificar diferentes definições de configuração (como variáveis de ambiente ou pontos de entrada) para configurações de compilação de Debug e Release.

Para que o Docker Compose exiba uma opção para ser executado no Visual Studio, o projeto docker deve ser o projeto de inicialização.

Service Fabric

Além dos pré-requisitos básicos, a solução de orquestração do Service Fabric exige os seguintes pré-requisitos:

O Service Fabric não suporta a execução de contêineres Linux no cluster de desenvolvimento local no Windows. Se o projeto já estiver usando um contêiner Linux, o Visual Studio solicitará alternar para contêineres do Windows.

As ferramentas de contêiner do Visual Studio executam as seguintes tarefas:

  • Adiciona um projeto <project_name>ApplicationService Fabric Application à solução.

  • Adiciona um Dockerfile e um arquivo .dockerignore ao projeto ASP.NET Core. Se um Dockerfile já existir no projeto ASP.NET Core, ele será renomeado para Dockerfile.original. Um novo Dockerfile, semelhante ao seguinte, é criado:

    # See https://aka.ms/containerimagehelp for information on how to use Windows Server 1709 containers with Service Fabric.
    # FROM microsoft/aspnetcore:2.0-nanoserver-1709
    FROM microsoft/aspnetcore:2.0-nanoserver-sac2016
    ARG source
    WORKDIR /app
    COPY ${source:-obj/Docker/publish} .
    ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]
    
  • Adiciona um <IsServiceFabricServiceProject> elemento ao arquivo do projeto .csproj ASP.NET Core:

    <IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
    
  • Adiciona uma pasta PackageRoot ao projeto ASP.NET Core. A pasta inclui o manifesto do serviço e as configurações para o novo serviço.

Para obter mais informações, consulte Implantar um aplicativo .NET em um contêiner do Windows no Azure Service Fabric.

Debug

Selecione Docker na lista suspensa de depuração na barra de ferramentas e comece a depurar o aplicativo. A visualização Docker da janela Saída mostra as seguintes ações em execução:

  • A tag 2.1-aspnetcore-runtime da imagem runtime microsoft/dotnet é adquirida (se ainda não estiver no cache). A imagem instala os tempos de execução do ASP.NET Core e do .NET e as bibliotecas associadas. Ele é otimizado para executar aplicativos ASP.NET Core em produção.
  • A ASPNETCORE_ENVIRONMENT variável de ambiente é definida como Development dentro do contêiner.
  • Duas portas atribuídas dinamicamente são expostas: uma para HTTP e outra para HTTPS. A porta atribuída a localhost pode ser consultada com o docker ps comando.
  • O aplicativo é copiado para o contêiner.
  • O navegador padrão é aberto com o depurador anexado ao contêiner, utilizando a porta atribuída dinamicamente.

A imagem resultante do Docker do aplicativo é marcada como dev. A imagem é baseada na tag 2.1-aspnetcore-runtime da imagem base microsoft/dotnet . Execute o docker images comando na janela Console do Gerenciador de Pacotes (PMC). As imagens na máquina são exibidas:

REPOSITORY        TAG                     IMAGE ID      CREATED         SIZE
hellodockertools  dev                     d72ce0f1dfe7  30 seconds ago  255MB
microsoft/dotnet  2.1-aspnetcore-runtime  fcc3887985bb  6 days ago      255MB
  • A imagem runtime microsoft/aspnetcore é adquirida (se ainda não estiver no cache).
  • A ASPNETCORE_ENVIRONMENT variável de ambiente é definida como Development dentro do contêiner.
  • A porta 80 é exposta e mapeada para uma porta atribuída dinamicamente para localhost. A porta é determinada pelo host do Docker e pode ser consultada com o docker ps comando.
  • O aplicativo é copiado para o contêiner.
  • O navegador padrão é aberto com o depurador anexado ao contêiner, utilizando a porta atribuída dinamicamente.

A imagem resultante do Docker do aplicativo é marcada como dev. A imagem é baseada na imagem base microsoft/aspnetcore . Execute o docker images comando na janela Console do Gerenciador de Pacotes (PMC). As imagens na máquina são exibidas:

REPOSITORY            TAG  IMAGE ID      CREATED        SIZE
hellodockertools      dev  5fafe5d1ad5b  4 minutes ago  347MB
microsoft/aspnetcore  2.0  c69d39472da9  13 days ago    347MB

Note

A imagem de desenvolvimento não tem os conteúdos da aplicação, pois as configurações de depuração utilizam montagem de volumes para fornecer uma experiência iterativa. Para enviar uma imagem por push, use a configuração Release .

Execute o docker ps comando no PMC. Observe que o aplicativo está sendo executado usando o contêiner:

CONTAINER ID        IMAGE                  COMMAND                   CREATED             STATUS              PORTS                   NAMES
baf9a678c88d        hellodockertools:dev   "C:\\remote_debugge..."   21 seconds ago      Up 19 seconds       0.0.0.0:37630->80/tcp   dockercompose4642749010770307127_hellodockertools_1

Editar e continuar

As alterações em arquivos estáticos e Razor visualizações são atualizadas automaticamente sem a necessidade de uma etapa de compilação. Faça a alteração, salve e atualize o navegador para visualizar a atualização.

As modificações do arquivo de código exigem compilação e uma reinicialização dentro do Kestrel contêiner. Depois de fazer a alteração, use CTRL+F5 para executar o processo e iniciar o aplicativo dentro do contêiner. O contêiner do Docker não é reconstruído ou interrompido. Execute o docker ps comando no PMC. Observe que o contêiner original ainda está funcionando há 10 minutos:

CONTAINER ID        IMAGE                  COMMAND                   CREATED             STATUS              PORTS                   NAMES
baf9a678c88d        hellodockertools:dev   "C:\\remote_debugge..."   10 minutes ago      Up 10 minutes       0.0.0.0:37630->80/tcp   dockercompose4642749010770307127_hellodockertools_1

Publicar imagens do Docker

Depois que o ciclo de desenvolvimento e depuração do aplicativo for concluído, as Ferramentas de Contêiner do Visual Studio ajudarão na criação da imagem de produção do aplicativo. Altere a lista suspensa de configuração para Release e construa a aplicação. A ferramenta adquire a imagem de compilação/publicação do Docker Hub (se ainda não estiver no cache). Uma imagem é produzida com a tag mais recente , que pode ser enviada por push para o registro privado ou para o Docker Hub.

Execute o docker images comando no PMC para ver a lista de imagens. É exibida uma saída semelhante à seguinte:

REPOSITORY        TAG                     IMAGE ID      CREATED             SIZE
hellodockertools  latest                  e3984a64230c  About a minute ago  258MB
hellodockertools  dev                     d72ce0f1dfe7  4 minutes ago       255MB
microsoft/dotnet  2.1-sdk                 9e243db15f91  6 days ago          1.7GB
microsoft/dotnet  2.1-aspnetcore-runtime  fcc3887985bb  6 days ago          255MB
REPOSITORY                  TAG     IMAGE ID      CREATED         SIZE
hellodockertools            latest  cd28f0d4abbd  12 seconds ago  349MB
hellodockertools            dev     5fafe5d1ad5b  23 minutes ago  347MB
microsoft/aspnetcore-build  2.0     7fed40fbb647  13 days ago     2.02GB
microsoft/aspnetcore        2.0     c69d39472da9  13 days ago     347MB

As imagens microsoft/aspnetcore-build e microsoft/aspnetcore listadas na saída anteriormente são substituídas por microsoft/dotnet a partir do .NET Core 2.1. Para obter mais informações, consulte o anúncio de migração de repositórios do Docker.

Note

O comando docker images retorna imagens intermediárias com nomes de repositórios e tags identificadas como <não definido> (não listados acima). Essas imagens sem nome são produzidas pelo Dockerfile de construção de múltiplos estágios. Eles melhoram a eficiência da construção da imagem final — apenas as camadas necessárias são reconstruídas quando ocorrem alterações. Quando as imagens intermediárias não forem mais necessárias, exclua-as usando o comando docker rmi .

Pode haver uma expectativa de que a imagem de produção/lançamento seja menor em tamanho em comparação com a imagem de desenvolvimento. Devido ao mapeamento de volume, o depurador e o aplicativo estavam sendo executados a partir da máquina local e não dentro do contêiner. A imagem mais recente empacotou o código de aplicativo necessário para executar o aplicativo em uma máquina host. Portanto, o delta é o tamanho do código do aplicativo.

Recursos adicionais