Ferramentas do Visual Studio para Contêineres com ASP.NET Core
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. 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 9 deste artigo.
Importante
Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
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
- Docker para Windows
- Visual Studio 2019 com a carga de trabalho de desenvolvimento multiplataforma do .NET Core
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.
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:
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
edocker-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:
- SDK do Microsoft Azure Service Fabric versão 2.6 ou posterior
- Carga de trabalho de Desenvolvimento do Azure do Visual Studio
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>Application Service Fabric Application à 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 comoDevelopment
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 comoDevelopment
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 multi-stage build Dockerfile. 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
- Desenvolvimento de contêiner com o Visual Studio
- Azure Service Fabric: prepare seu ambiente de desenvolvimento
- Implantar um aplicativo .NET em um contêiner do Windows no Azure Service Fabric
- Solucionar problemas de desenvolvimento do Visual Studio com o Docker
- Repositório do GitHub e Ferramentas do Visual Studio para Contêineres
- GC usando o Docker e contêineres pequenos
- System.IO.IOException: o limite de usuário configurado (128) no número de instâncias inotify foi atingido
- Atualizações nas imagens do Docker