Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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
- Docker para Windows
- Visual Studio 2019 com o workload de desenvolvimento entre plataformas do .NET Core
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.
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 :
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 buildedocker-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:
- 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 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.csprojASP.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_ENVIRONMENTvariável de ambiente é definida comoDevelopmentdentro 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 pscomando. - 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_ENVIRONMENTvariável de ambiente é definida comoDevelopmentdentro 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 pscomando. - 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
- Desenvolvimento de contêiner com 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 GitHub do Visual Studio Container Tools
- GC usando Docker e pequenos contêineres
- System.IO.IOException: O limite de usuário configurado (128) no número de instâncias inotify foi atingido
- Atualizações de imagens do Docker