Ferramentas do Visual Studio para Contêineres com ASP.NET Core

O Visual Studio 2017 e as versões posteriores dão suporte à criação, à depuração e à execução de aplicativos ASP.NET Core em contêineres direcionados ao .NET Core. Contêineres do Windows e do Linux são compatíveis.

Exibir ou baixar código de exemplo (como baixar)

Pré-requisitos

Instalação e configuração

Para a instalação do Docker, primeiro examine as informações em Docker for Windows: What to know before you install (Docker para Windows: o que saber antes de instalar). Em seguida, instale o Docker for Windows.

As Unidades Compartilhadas do Docker para Windows devem ser configuradas para dar suporte ao mapeamento do volume e à depuração. Clique com o botão direito do mouse no ícone do Docker na Bandeja do Sistema, selecione Configurações e selecione Unidades Compartilhadas. Selecione a unidade em que o Docker armazena arquivos. Clique em Aplicar.

Dialog to select local C drive sharing for containers

Dica

A versão 15.6 e as versões posteriores do Visual Studio 2017 exibem um aviso quando as Unidades Compartilhadas não estão configuradas.

Adicionar um projeto a um contêiner do Docker

Para colocar um projeto do ASP.NET Core em contêineres, o projeto deve ser destinado ao .Net Core. Contêineres do Linux e Windows são ambos compatíveis.

Ao adicionar o suporte do Docker a um projeto, escolha um contêiner do 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 na Bandeja do Sistema e escolha Alternar para contêineres do Windows... ou Alternar para contêineres do Linux....

Novo aplicativo

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

Enable Docker Support checkbox

Se a estrutura de destino for o .NET Core, a lista suspensa SO permitirá a seleção de um tipo de contêiner.

Aplicativo existente

Para projetos do ASP.NET Core direcionados ao .NET Core, há duas opções para adicionar o suporte do Docker 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 do Docker.

As Ferramentas de Contêiner do Visual Studio não são compatíveis com a adição do Docker a um projeto ASP.NET Core existente direcionado ao .NET Framework.

Visão geral do Dockerfile

Um Dockerfile, a receita para criar uma imagem final do Docker, é adicionado à raiz do projeto. Consulte Referência do Dockerfile para compreender seus comandos. Esse Dockerfile específico usa um build de vários estágios, com quatro estágios de build nomeados distintos:

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 Dockerfile precedente inclui o runtime do ASP.NET Core e os pacotes NuGet. Os pacotes são compilados JIT (Just-In-Time) para melhorar o desempenho de inicialização.

Quando a caixa de seleção Configurar para HTTPS do diálogo do novo projeto estiver marcada, o Dockerfile exibirá duas portas. Uma porta é usada para o tráfego HTTP; a outra porta é usada para o 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 Dockerfile precedente base inclui os pacotes NuGet do ASP.NET Core, que são compilados JIT (Just-In-Time) para melhorar o desempenho de inicialização.

Adicionar o suporte de orquestrador de contêineres a um aplicativo

As versões 15.7 ou posteriores do Visual Studio 2017 são compatíveis com o Docker Compose como a única solução de orquestração de contêineres. Os artefatos do Docker Compose são adicionados por meio 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 apenas quando instruído. Clique com o botão direito do mouse no projeto no Gerenciador de Soluções e selecione Adicionar>Suporte do orquestrador de contêineres. 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.dcprojO arquivo que representa o projeto. Inclui um elemento <DockerTargetOS> que especifica o sistema operacional a ser utilizado.
  • .dockerignore: lista os padrões de arquivo e diretório a serem excluídos ao gerar um contexto de build.
  • docker-compose.yml: o arquivo de base do Docker Compose usado para definir a coleção de imagens compiladas e executadas com o docker-compose build e docker-compose run, respectivamente.
  • docker-compose.override.yml: um arquivo opcional, lido pelo Docker Compose, com substituições de configuração para os serviços. O 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 Depuração. A imagem hellodockertools:latest é gerada quando o aplicativo é executado no modo Versão.

Prefixe o nome da imagem com o nome de usuário do hub do Docker (por exemplo, dockerhubusername/hellodockertools) se a imagem for enviada por push para o registro. 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ê desejar um comportamento diferente com base na configuração de build (por exemplo, Depuração ou Versão), adicione arquivos docker-compose específicos para a configuração. Os arquivos precisam ser nomeados de acordo com a configuração de build (por exemplo, docker-compose.vs.debug.yml e docker-compose.vs.release.yml) e colocado no mesmo local que o arquivo docker-compose-override.yml.

Usando os arquivos de substituição específicos da configuração, é possível especificar definições de configuração diferentes (como variáveis de ambiente ou pontos de entrada) para as configurações de build de Depuração e Versão.

Para que o Docker Compose exiba uma opção a ser executada no Visual Studio, o projeto do 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 é compatível com a execução de contêineres do Linux no cluster de desenvolvimento local no Windows. Se o projeto já estiver usando um contêiner do Linux, o Visual Studio pedirá para alternar para os contêineres do Windows.

As Ferramentas de Contêiner do Visual Studio realizam as seguintes tarefas:

  • Adiciona um projeto <project_name>doAplicativo do Service Fabric à solução.

  • Adiciona um Dockerfile e um arquivo .dockerignore ao projeto ASP.NET Core. Se um Dockerfile já existir no projeto do ASP.NET Core, ele já terá sido renomeado para Dockerfile.original. Um novo Dockerfile, semelhante ao seguinte, foi 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 elemento <IsServiceFabricServiceProject> ao arquivo .csproj do projeto do 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.

Depurar

Selecione Docker no menu suspenso de depuração na barra de ferramentas e inicie a depuração do aplicativo. A exibição Docker da janela Saída mostra as seguintes ações em andamento:

  • A marcação 2.1-aspnetcore-runtime da imagem do tempo de execução microsoft/dotnet foi adquirida (se ainda não estiver no cache). A imagem instala os runtimes do ASP.NET Core e do .Net Core e bibliotecas associadas. Ela é otimizada para executar aplicativos do ASP.NET Core em produção.
  • A variável de ambiente ASPNETCORE_ENVIRONMENT é 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 ao localhost pode ser consultada com o comando docker ps.
  • O aplicativo é copiado para o contêiner.
  • O navegador padrão é iniciado com o depurador anexado ao contêiner, usando a porta atribuída dinamicamente.

A imagem resultante do Docker do aplicativo é marcada como dev. A imagem é baseada na marcação 2.1-aspnetcore-runtime da imagem base microsoft/dotnet. Execute o comando docker images na janela do PMC (Console do Gerenciador de Pacotes). As imagens no computador 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 em runtime microsoft/aspnetcore é adquirida (se ainda não está no cache).
  • A variável de ambiente ASPNETCORE_ENVIRONMENT é definida como Development dentro do contêiner.
  • A porta 80 é exposta e mapeada para uma porta atribuída dinamicamente para o localhost. A porta é determinada pelo host do Docker e pode ser consultada com o comando docker ps.
  • O aplicativo é copiado para o contêiner.
  • O navegador padrão é iniciado com o depurador anexado ao contêiner, usando 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 comando docker images na janela do PMC (Console do Gerenciador de Pacotes). As imagens no computador 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

Observação

A imagem dev não inclui o conteúdo do aplicativo, pois as configurações de Depuração usam a montagem de volume para fornecer uma experiência iterativa. Para enviar uma imagem por push, use a configuração Versão.

Execute o comando docker ps no PMC. Observe que o aplicativo está em execução 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 exibições do Razor são atualizadas automaticamente sem a necessidade de uma etapa de compilação. Faça a alteração, salve e atualize o navegador para exibir a atualização.

As modificações nos arquivos de código exigem a compilação e a reinicialização do Kestrel dentro do 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 é recompilado nem interrompido. Execute o comando docker ps no PMC. Observe que o contêiner original ainda está em execução como 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

Após concluir o ciclo de desenvolvimento e depuração do aplicativo, as Ferramentas de Contêiner do Visual Studio ajudarão você a criar a imagem de produção do aplicativo. Altere a lista suspensa de configuração para Versão e compile o aplicativo. O conjunto de ferramentas adquire a imagem de compilação/publicação do hub do Docker (se ainda não estiver no cache). Uma imagem é produzida com a marcação latest, que você pode enviar por push para seu registro privado ou para o hub do Docker.

Execute o comando docker images no PMC para ver a lista de imagens. Uma saída semelhante à apresentada a seguir será exibida:

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 anterior são substituídas pelas imagens microsoft/dotnet com o .Net Core 2.1. Para obter mais informações, consulte o comunicado de migração de repositórios do Docker.

Observação

O comando docker images retorna imagens intermediárias com nomes de repositório e marcas identificadas como <none> (não listadas acima). Essas imagens sem nome são produzidas pelo Dockerfile no build de vários estágios. Elas melhoram a eficiência da compilação da imagem final – apenas as camadas necessárias são recompiladas quando ocorrem alterações. Quando você não precisar mais das imagens intermediárias, exclua-as usando o comando docker rmi.

Pode haver uma expectativa de que a imagem de produção ou versão seja menor em comparação com a imagem dev. Devido ao mapeamento do volume, o depurador e o aplicativo estavam em execução no computador local e não dentro do contêiner. A última imagem empacotou o código do aplicativo necessário para executar o aplicativo em um computador host. Portanto, o delta é o tamanho do código do aplicativo.

Recursos adicionais