Executar um aplicativo do ASP.NET Core em contêineres do Docker

Observação

Esta não é a versão mais recente deste artigo. Para informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.

Aviso

Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, confira .NET e a Política de Suporte do .NET Core. Para informações sobre a versão vigente, confira a Versão do .NET 8 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 informações sobre a versão vigente, confira a Versão do .NET 8 deste artigo.

Este artigo mostra como executar um aplicativo ASP.NET Core em contêineres do Docker.

O Windows Home Edition não dá suporte ao Hyper-V, e o Hyper-V é necessário para o Docker.

Consulte Conteinerizar um aplicativo .NET com dotnet publish para obter informações sobre como conteineirizar um aplicativo .NET com dotnet publish.

Imagens do ASP.NET Core Docker

Para este tutorial, você deve baixar um aplicativo de exemplo ASP.NET Core e executá-lo em contêineres do Docker. O exemplo funciona com contêineres do Linux e do Windows.

O exemplo de Dockerfile usa o recurso de build de vários estágios do Docker para compilar e executar em contêineres diferentes. Os contêineres de build e execução são criados a partir de imagens que são fornecidas pela Microsoft no Hub do Docker:

  • dotnet/sdk

    O exemplo usa essa imagem para compilar o aplicativo. A imagem contém o SDK do .NET, que inclui as ferramentas de linha de comando (CLI). A imagem é otimizada para desenvolvimento local, depuração e teste de unidade. As ferramentas instaladas para desenvolvimento e compilação tornam a imagem relativamente grande.

  • dotnet/aspnet

    O exemplo usa essa imagem para executar o aplicativo. A imagem contém o runtime do ASP.NET Core e as bibliotecas e é otimizada para executar aplicativos em produção. Desenvolvida para acelerar a implantação e a inicialização do aplicativo, a imagem é relativamente pequena, portanto, o desempenho da rede no registro do Docker para o host do Docker é otimizado. Somente os binários e o conteúdo necessários para executar o aplicativo são copiados para o contêiner. O conteúdo está pronto para ser executado, permitindo mais rapidez do docker run para a inicialização do aplicativo. A compilação de código dinâmico não é necessária no modelo do Docker.

Pré-requisitos

Baixar o aplicativo de exemplo

Executar o aplicativo localmente

  • Navegue até a pasta do projeto em dotnet-docker/samples/aspnetapp/aspnetapp.

  • Execute o seguinte comando para compilar e executar o aplicativo localmente:

    dotnet run
    
  • Vá para http://localhost:<port> em um navegador para testar o aplicativo.

  • Pressione Ctrl+C no prompt de comando para interromper o aplicativo.

Executar em um contêiner do Linux ou em um contêiner do Windows

  • Para executar em um contêiner do Linux, clique com o botão direito do mouse no ícone do cliente Docker da Bandeja do Sistema e selecione alternar para contêineres do Linux.

  • Para executar em um contêiner do Windows, clique com o botão direito do mouse no ícone do cliente Docker da Bandeja do Sistema e selecione alternar para contêineres do Windows.

  • Navegue até a pasta do Dockerfile em dotnet-docker/samples/aspnetapp.

  • Execute os seguintes comandos para compilar e executar a amostra no Docker:

    docker build -t aspnetapp .
    docker run -it --rm -p <port>:8080 --name aspnetcore_sample aspnetapp
    

    Os argumentos de comando build:

    • Dê o nome aspnetapp para a imagem.
    • Procure o Dockerfile na pasta atual (o ponto no final).

    Os argumentos de comando de execução:

    • Aloque um pseudo-TTY e mantenha-o aberto, mesmo se não estiver anexado. (Mesmo efeito de --interactive --tty).
    • Remova automaticamente o contêiner quando ele é encerrado.
    • Mapeie <port> no computador local para a porta 8080 no contêiner.
    • Dê o nome aspnetcore_sample ao contêiner.
    • Especifique a imagem aspnetapp.
  • Vá para http://localhost:<port> em um navegador para testar o aplicativo.

Criar e implantar manualmente

Em alguns cenários, talvez você queira implantar um aplicativo em um contêiner copiando os ativos necessários no tempo de execução. Esta seção mostra como realizar a implantação manual.

  • Navegue até a pasta do projeto em dotnet-docker/samples/aspnetapp/aspnetapp.

  • Execute o comando dotnet publish:

    dotnet publish -c Release -o published
    

    Os argumentos do comando:

    • Compile o aplicativo no modo de versão (o padrão é o modo de depuração).
    • Crie os ativos na pasta published.
  • Execute o aplicativo.

    • Windows:

      dotnet published\aspnetapp.dll
      
    • Linux:

      dotnet published/aspnetapp.dll
      
  • Navegue até http://localhost:<port> para ver a página home.

Para usar o aplicativo publicado manualmente em um contêiner do Docker, crie um novo Dockerfile e use o comando docker build . para criar uma imagem.

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

Para ver a nova imagem, use o comando docker images.

O Dockerfile

Aqui está o Dockerfile usado pelo comando docker build que foi executado anteriormente. Ele usa dotnet publish da mesma maneira que foi feito nesta seção para realizar a criação e implantação.

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

No Dockerfile anterior, os arquivos *.csproj são copiados e restaurados como camadas distintas. Quando o comando docker build cria uma imagem, ele usa um cache interno. Se os arquivos *.csproj não tiverem sido alterados desde a última execução do comando docker build, o comando dotnet restore não precisará ser executado novamente. Em vez disso, o cache interno para a camada correspondente dotnet restore é reutilizado. Para obter mais informações, confira Melhores práticas para escrever Dockerfiles.

Recursos adicionais

Próximas etapas

O repositório Git que contém o aplicativo de exemplo também inclui a documentação. Para obter uma visão geral dos recursos disponíveis no repositório, confira o arquivo Leiame. Em particular, saiba como implementar o HTTPS:

Imagens do ASP.NET Core Docker

Para este tutorial, você deve baixar um aplicativo de exemplo ASP.NET Core e executá-lo em contêineres do Docker. O exemplo funciona com contêineres do Linux e do Windows.

O exemplo de Dockerfile usa o recurso de build de vários estágios do Docker para compilar e executar em contêineres diferentes. Os contêineres de build e execução são criados a partir de imagens que são fornecidas pela Microsoft no Hub do Docker:

  • dotnet/sdk

    O exemplo usa essa imagem para compilar o aplicativo. A imagem contém o SDK do .NET, que inclui as ferramentas de linha de comando (CLI). A imagem é otimizada para desenvolvimento local, depuração e teste de unidade. As ferramentas instaladas para desenvolvimento e compilação tornam a imagem relativamente grande.

  • dotnet/aspnet

    O exemplo usa essa imagem para executar o aplicativo. A imagem contém o runtime do ASP.NET Core e as bibliotecas e é otimizada para executar aplicativos em produção. Desenvolvida para acelerar a implantação e a inicialização do aplicativo, a imagem é relativamente pequena, portanto, o desempenho da rede no registro do Docker para o host do Docker é otimizado. Somente os binários e o conteúdo necessários para executar o aplicativo são copiados para o contêiner. O conteúdo está pronto para ser executado, permitindo mais rapidez do docker run para a inicialização do aplicativo. A compilação de código dinâmico não é necessária no modelo do Docker.

Pré-requisitos

Baixar o aplicativo de exemplo

Executar o aplicativo localmente

  • Navegue até a pasta do projeto em dotnet-docker/samples/aspnetapp/aspnetapp.

  • Execute o seguinte comando para compilar e executar o aplicativo localmente:

    dotnet run
    
  • Vá para http://localhost:5000 em um navegador para testar o aplicativo.

  • Pressione Ctrl+C no prompt de comando para interromper o aplicativo.

Executar em um contêiner do Linux ou em um contêiner do Windows

  • Para executar em um contêiner do Linux, clique com o botão direito do mouse no ícone do cliente Docker da Bandeja do Sistema e selecione alternar para contêineres do Linux.

  • Para executar em um contêiner do Windows, clique com o botão direito do mouse no ícone do cliente Docker da Bandeja do Sistema e selecione alternar para contêineres do Windows.

  • Navegue até a pasta do Dockerfile em dotnet-docker/samples/aspnetapp.

  • Execute os seguintes comandos para compilar e executar a amostra no Docker:

    docker build -t aspnetapp .
    docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp
    

    Os argumentos de comando build:

    • Dê o nome aspnetapp para a imagem.
    • Procure o Dockerfile na pasta atual (o ponto no final).

    Os argumentos de comando de execução:

    • Aloque um pseudo-TTY e mantenha-o aberto, mesmo se não estiver anexado. (Mesmo efeito de --interactive --tty).
    • Remova automaticamente o contêiner quando ele é encerrado.
    • Mapeie a porta 5000 no computador local para a porta 80 no contêiner.
    • Dê o nome aspnetcore_sample ao contêiner.
    • Especifique a imagem aspnetapp.
  • Vá para http://localhost:5000 em um navegador para testar o aplicativo.

Criar e implantar manualmente

Em alguns cenários, talvez você queira implantar um aplicativo em um contêiner copiando os ativos necessários no tempo de execução. Esta seção mostra como realizar a implantação manual.

  • Navegue até a pasta do projeto em dotnet-docker/samples/aspnetapp/aspnetapp.

  • Execute o comando dotnet publish:

    dotnet publish -c Release -o published
    

    Os argumentos do comando:

    • Compile o aplicativo no modo de versão (o padrão é o modo de depuração).
    • Crie os ativos na pasta published.
  • Execute o aplicativo.

    • Windows:

      dotnet published\aspnetapp.dll
      
    • Linux:

      dotnet published/aspnetapp.dll
      
  • Navegue até http://localhost:5000 para ver a página home.

Para usar o aplicativo publicado manualmente em um contêiner do Docker, crie um novo Dockerfile e use o comando docker build . para criar uma imagem.

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

Para ver a nova imagem, use o comando docker images.

O Dockerfile

Aqui está o Dockerfile usado pelo comando docker build que foi executado anteriormente. Ele usa dotnet publish da mesma maneira que foi feito nesta seção para realizar a criação e implantação.

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

No Dockerfile anterior, os arquivos *.csproj são copiados e restaurados como camadas distintas. Quando o comando docker build cria uma imagem, ele usa um cache interno. Se os arquivos *.csproj não tiverem sido alterados desde a última execução do comando docker build, o comando dotnet restore não precisará ser executado novamente. Em vez disso, o cache interno para a camada correspondente dotnet restore é reutilizado. Para obter mais informações, confira Melhores práticas para escrever Dockerfiles.

Recursos adicionais

Próximas etapas

O repositório Git que contém o aplicativo de exemplo também inclui a documentação. Para obter uma visão geral dos recursos disponíveis no repositório, confira o arquivo Leiame. Em particular, saiba como implementar o HTTPS:

Imagens do ASP.NET Core Docker

Para este tutorial, você deve baixar um aplicativo de exemplo ASP.NET Core e executá-lo em contêineres do Docker. O exemplo funciona com contêineres do Linux e do Windows.

O exemplo de Dockerfile usa o recurso de build de vários estágios do Docker para compilar e executar em contêineres diferentes. Os contêineres de build e execução são criados a partir de imagens que são fornecidas pela Microsoft no Hub do Docker:

  • dotnet/sdk

    O exemplo usa essa imagem para compilar o aplicativo. A imagem contém o SDK do .NET, que inclui as ferramentas de linha de comando (CLI). A imagem é otimizada para desenvolvimento local, depuração e teste de unidade. As ferramentas instaladas para desenvolvimento e compilação tornam a imagem relativamente grande.

  • dotnet/core/sdk

    O exemplo usa essa imagem para compilar o aplicativo. A imagem contém o SDK do .NET Core, que inclui as ferramentas de linha de comando (CLI). A imagem é otimizada para desenvolvimento local, depuração e teste de unidade. As ferramentas instaladas para desenvolvimento e compilação tornam a imagem relativamente grande.

  • dotnet/aspnet

    O exemplo usa essa imagem para executar o aplicativo. A imagem contém o runtime do ASP.NET Core e as bibliotecas e é otimizada para executar aplicativos em produção. Desenvolvida para acelerar a implantação e a inicialização do aplicativo, a imagem é relativamente pequena, portanto, o desempenho da rede no registro do Docker para o host do Docker é otimizado. Somente os binários e o conteúdo necessários para executar o aplicativo são copiados para o contêiner. O conteúdo está pronto para ser executado, permitindo mais rapidez do docker run para a inicialização do aplicativo. A compilação de código dinâmico não é necessária no modelo do Docker.

  • dotnet/core/aspnet

    O exemplo usa essa imagem para executar o aplicativo. A imagem contém o runtime do ASP.NET Core e as bibliotecas e é otimizada para executar aplicativos em produção. Desenvolvida para acelerar a implantação e a inicialização do aplicativo, a imagem é relativamente pequena, portanto, o desempenho da rede no registro do Docker para o host do Docker é otimizado. Somente os binários e o conteúdo necessários para executar o aplicativo são copiados para o contêiner. O conteúdo está pronto para ser executado, permitindo mais rapidez do docker run para a inicialização do aplicativo. A compilação de código dinâmico não é necessária no modelo do Docker.

Pré-requisitos

Baixar o aplicativo de exemplo

Executar o aplicativo localmente

  • Navegue até a pasta do projeto em dotnet-docker/samples/aspnetapp/aspnetapp.

  • Execute o seguinte comando para compilar e executar o aplicativo localmente:

    dotnet run
    
  • Vá para http://localhost:5000 em um navegador para testar o aplicativo.

  • Pressione Ctrl+C no prompt de comando para interromper o aplicativo.

Executar em um contêiner do Linux ou em um contêiner do Windows

  • Para executar em um contêiner do Linux, clique com o botão direito do mouse no ícone do cliente Docker da Bandeja do Sistema e selecione alternar para contêineres do Linux.

  • Para executar em um contêiner do Windows, clique com o botão direito do mouse no ícone do cliente Docker da Bandeja do Sistema e selecione alternar para contêineres do Windows.

  • Navegue até a pasta do Dockerfile em dotnet-docker/samples/aspnetapp.

  • Execute os seguintes comandos para compilar e executar a amostra no Docker:

    docker build -t aspnetapp .
    docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp
    

    Os argumentos de comando build:

    • Dê o nome aspnetapp para a imagem.
    • Procure o Dockerfile na pasta atual (o ponto no final).

    Os argumentos de comando de execução:

    • Aloque um pseudo-TTY e mantenha-o aberto, mesmo se não estiver anexado. (Mesmo efeito de --interactive --tty).
    • Remova automaticamente o contêiner quando ele é encerrado.
    • Mapeie a porta 5000 no computador local para a porta 80 no contêiner.
    • Dê o nome aspnetcore_sample ao contêiner.
    • Especifique a imagem aspnetapp.
  • Vá para http://localhost:5000 em um navegador para testar o aplicativo.

Criar e implantar manualmente

Em alguns cenários, talvez você queira implantar um aplicativo em um contêiner copiando os ativos necessários no tempo de execução. Esta seção mostra como realizar a implantação manual.

  • Navegue até a pasta do projeto em dotnet-docker/samples/aspnetapp/aspnetapp.

  • Execute o comando dotnet publish:

    dotnet publish -c Release -o published
    

    Os argumentos do comando:

    • Compile o aplicativo no modo de versão (o padrão é o modo de depuração).
    • Crie os ativos na pasta published.
  • Execute o aplicativo.

    • Windows:

      dotnet published\aspnetapp.dll
      
    • Linux:

      dotnet published/aspnetapp.dll
      
  • Navegue até http://localhost:5000 para ver a página home.

Para usar o aplicativo publicado manualmente em um contêiner do Docker, crie um novo Dockerfile e use o comando docker build . para criar uma imagem.

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

Para ver a nova imagem, use o comando docker images.

O Dockerfile

Aqui está o Dockerfile usado pelo comando docker build que foi executado anteriormente. Ele usa dotnet publish da mesma maneira que foi feito nesta seção para realizar a criação e implantação.

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

Para ver a nova imagem, use o comando docker images.

O Dockerfile

Aqui está o Dockerfile usado pelo comando docker build que foi executado anteriormente. Ele usa dotnet publish da mesma maneira que foi feito nesta seção para realizar a criação e implantação.

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

No Dockerfile anterior, os arquivos *.csproj são copiados e restaurados como camadas distintas. Quando o comando docker build cria uma imagem, ele usa um cache interno. Se os arquivos *.csproj não tiverem sido alterados desde a última execução do comando docker build, o comando dotnet restore não precisará ser executado novamente. Em vez disso, o cache interno para a camada correspondente dotnet restore é reutilizado. Para obter mais informações, confira Melhores práticas para escrever Dockerfiles.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

O Dockerfile

Aqui está o Dockerfile usado pelo comando docker build que foi executado anteriormente. Ele usa dotnet publish da mesma maneira que foi feito nesta seção para realizar a criação e implantação.

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

Conforme observado no Dockerfile anterior, os arquivos *.csproj são copiados e restaurados como camadas distintas. Quando o comando docker build cria uma imagem, ele usa um cache interno. Se os arquivos *.csproj não tiverem sido alterados desde a última execução do comando docker build, o comando dotnet restore não precisará ser executado novamente. Em vez disso, o cache interno para a camada correspondente dotnet restore é reutilizado. Para obter mais informações, confira Melhores práticas para escrever Dockerfiles.

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

O Dockerfile

Aqui está o Dockerfile usado pelo comando docker build que foi executado anteriormente. Ele usa dotnet publish da mesma maneira que foi feito nesta seção para realizar a criação e implantação.

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

No Dockerfile anterior, os arquivos *.csproj são copiados e restaurados como camadas distintas. Quando o comando docker build cria uma imagem, ele usa um cache interno. Se os arquivos *.csproj não tiverem sido alterados desde a última execução do comando docker build, o comando dotnet restore não precisará ser executado novamente. Em vez disso, o cache interno para a camada correspondente dotnet restore é reutilizado. Para obter mais informações, confira Melhores práticas para escrever Dockerfiles.

Recursos adicionais

Próximas etapas

O repositório Git que contém o aplicativo de exemplo também inclui a documentação. Para obter uma visão geral dos recursos disponíveis no repositório, confira o arquivo Leiame. Em particular, saiba como implementar o HTTPS: