Migrando aplicativos ASP.NET MVC para contêineres do Windows

Executar um aplicativo existente baseado no .NET Framework em um contêiner do Windows não requer alterações ao seu aplicativo. Para executar seu aplicativo em um contêiner do Windows, crie uma imagem de Docker contendo seu aplicativo e inicie o contêiner. Este tópico explica como selecionar um aplicativo ASP.NET MVC existente e implantá-lo em um contêiner do Windows.

Você começa com um aplicativo ASP.NET MVC existente e cria os ativos publicados usando o Visual Studio. Você usa o Docker para criar a imagem que contém e executa o seu aplicativo. Você navegará para o site em execução em um contêiner do Windows e verificará se que o aplicativo está funcionando.

Este artigo pressupõe uma compreensão básica sobre o Docker. Saiba mais sobre o Docker lendo a Visão geral de Docker.

O aplicativo que você executará em um contêiner é um site simples que responde a perguntas aleatoriamente. Esse aplicativo é um aplicativo MVC básico sem autenticação ou armazenamento de banco de dados; ele permite que você se concentre em mover a camada da Web para um contêiner. Os tópicos futuros mostrarão como mover e gerenciar o armazenamento persistente em aplicativos em contêineres.

Mover seu aplicativo envolve estas etapas:

  1. Criar uma tarefa de publicação para compilar os ativos para uma imagem.
  2. Criar uma imagem do Docker que executará o aplicativo.
  3. Iniciar um contêiner do Docker que execute sua imagem.
  4. Verificar o aplicativo usando o navegador.

O aplicativo finalizado está no GitHub.

Pré-requisitos

O computador de desenvolvimento deve ter o seguinte software:

Important

Se você estiver usando o Windows Server 2016, siga as instruções para Implantação do Host do Contêiner – Windows Server.

Depois de instalar e iniciar o Docker, clique no ícone de bandeja e selecione Alternar para contêineres do Windows. Isso é necessário para executar imagens do Docker com base no Windows. Este comando demora alguns segundos para ser executado:

Contêiner do Windows

Script de publicação

Colete todos os ativos que você precisa carregar em uma imagem de Docker em um único local. Você pode usar o comando Publicar do Visual Studio para criar um perfil de publicação para seu aplicativo. Esse perfil colocará todos os ativos em uma árvore de diretório que você copiará para sua imagem de destino posteriormente neste tutorial.

Etapas de publicação

  1. Clique com o botão direito do mouse no projeto Web no Visual Studio e selecione Publicar.
  2. Clique no botão perfil personalizado e, em seguida, selecione sistema de arquivos como o método.
  3. Selecione o diretório. Por convenção, o exemplo baixado usa bin\Release\PublishOutput.

Conexão da publicação

Abra a seção Opções de publicação de arquivo da guia configurações . Selecione pré-compilação durante a publicação. Essa otimização significa que você compilará as exibições no contêiner do Docker, está copiando as exibições pré-compiladas.

Configurações de publicação

Clique em Publicar e o Visual Studio copiará todos os ativos necessários para a pasta de destino.

Criar a imagem

Crie um novo arquivo chamado Dockerfile para definir a imagem do Docker. Dockerfile contém instruções para criar a imagem final e inclui quaisquer nomes de imagem base, componentes necessários, o aplicativo que você deseja executar e outras imagens de configuração. Dockerfile é a entrada para o docker build comando que cria a imagem.

Para este exercício, você criará uma imagem com base na microsoft/aspnet Imagem localizada no Hub do Docker. A imagem base, microsoft/aspnet, é uma imagem do Windows Server. Ele contém o Windows Server Core, o IIS e o ASP.NET 4.7.2. Quando você executar essa imagem em seu contêiner, ela iniciará automaticamente o IIS e sites instalados.

O Dockerfile que cria a imagem tem esta aparência:

# The `FROM` instruction specifies the base image. You are
# extending the `microsoft/aspnet` image.

FROM microsoft/aspnet

# The final instruction copies the site you published earlier into the container.
COPY ./bin/Release/PublishOutput/ /inetpub/wwwroot

Não há nenhum comando ENTRYPOINT neste Dockerfile. Você não precisa de um. Ao executar o Windows Server com o IIS, o processo do IIS é o ponto de entrada, que é configurado para iniciar na imagem de base do ASPNET.

Execute o comando de compilação do Docker para criar a imagem que executa seu aplicativo ASP.NET. Para fazer isso, abra uma janela do PowerShell no diretório do seu projeto e digite o seguinte comando no diretório da solução:

docker build -t mvcrandomanswers .

Este comando criará a nova imagem usando as instruções em seu Dockerfile, nomeando (marcação-t) a imagem como mvcrandomanswers. Isso pode incluir efetuar o pull da imagem base do Hub do Docker e, em seguida, adicionar seu aplicativo àquela imagem.

Depois que o comando for concluído, você poderá executar o comando docker images para ver informações sobre a nova imagem:

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
mvcrandomanswers              latest              86838648aab6        2 minutes ago       10.1 GB

A ID da IMAGEM será diferente em seu computador. Agora, vamos executar o aplicativo.

Iniciar um contêiner

Inicie um contêiner executando o seguinte comando docker run:

docker run -d --name randomanswers mvcrandomanswers

O argumento -d diz ao Docker para iniciar a imagem no modo desconectado. Isso significa que a imagem do Docker é executada desconectada do shell atual.

Em muitos exemplos de Docker, você pode ver-p para mapear o contêiner e as portas de host. A imagem ASPNET padrão já configurou o contêiner para escutar na porta 80 e expô-la.

O --name randomanswers fornece um nome para o contêiner em execução. Você pode usar esse nome em vez da ID do contêiner na maioria dos comandos.

O mvcrandomanswers é o nome da imagem a ser iniciada.

Verificar no navegador

Depois que o contêiner for iniciado, conecte-se ao contêiner em execução usando http://localhost no exemplo mostrado. Digite a URL no navegador e você deverá ver o site em execução.

Note

Alguns softwares de proxy ou VPN podem impedir que você navegue para seu site. Você pode desabilitá-los temporariamente para se certificar de que seu contêiner está funcionando.

O diretório de exemplo no GitHub contém um script do PowerShell que executa esses comandos para você. Abra uma janela do PowerShell, altere o diretório para o diretório da solução e digite:

./run.ps1

O comando acima cria a imagem, exibe a lista de imagens em seu computador e inicia um contêiner.

Para parar o seu contêiner, emita um comando docker stop:

docker stop randomanswers

Para remover o contêiner, emita um comando docker rm:

docker rm randomanswers