.NET

31 out, 2017

ASP.NET Core 2.0: deployment na nuvem com Docker, Azure Container Registry e Azure Web App on Linux

Publicidade

O objetivo deste artigo é demonstrar o deployment de um projeto ASP.NET Core 2.0 no Microsoft Azure, fazendo uso de containers Docker e de serviços de hospedagem que integram esta plataforma de cloud computing (Azure Container Registry e Azure Web App on Linux).

A aplicação que será utilizada – um site MVC – já foi descrita no artigo indicado a seguir, o qual abordou o consumo de APIs REST disponibilizadas gratuitamente pela NASA (Agência Espacial Norte-Americana):

Consumo de APIs em .NET Core: utilizando APIs REST da NASA

Esse projeto está disponível inclusive no GitHub:

https://github.com/renatogroffe/ASPNETCore2_NASA-Open-APIs

Caso queira saber mais sobre o Azure Web App on Linux e o uso de Docker em aplicações ASP.NET Core, consulte também o seguinte artigo:

ASP.NET Core: APIs REST na nuvem com Docker e Azure Web App

Criando uma imagem Docker

Para gerar uma imagem Docker contendo a aplicação mencionada neste artigo, serão utilizados recursos do próprio Visual Studio 2017. Isto acontecerá por meio de um conjunto de ferramentas conhecidas como Visual Studio Tools for Docker, as quais possibilitam o building, o debugging e a execução de containers a partir de projetos gerados com o .NET Core.

No Visual Studio 2017 será necessário adicionar os arquivos de suporte ao Docker no projeto SiteDadosNASA. Acionar então o menu de contexto para esse site e, em seguida, as opções Add e Docker Support (este processo também pode ser realizado durante a criação de um novo projeto):

Aparecerá neste momento a janela Docker Support Options. Selecionar em Target OS a opção Linux:

Este conjunto de ações produzirá como resultados os seguintes itens:

  • Dockerfile, arquivo no qual constará a imagem do ASP.NET Core a ser utilizada na geração de containers baseados no projeto SiteDadosNASA;
  • Os arquivos do Docker Compose (agrupados em docker-compose), com as configurações para a criação da imagem correspondente à aplicação de testes.

O contéudo do arquivo Dockerfile está na próxima listagem:

FROM microsoft/aspnetcore:2.0
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "SiteDadosNASA.dll"]

Já a listagem a seguir, traz as configurações do arquivo docker-compose.yml:

version: '3'

services:
  sitedadosnasa:
    image: sitedadosnasa
    build:
      context: ./SiteDadosNASA
      dockerfile: Dockerfile

Após estes procedimentos, o projeto SiteDadosNASA já estará devidamente configurado para execução e até mesmo debugging a partir de um container Docker. O próprio ícone do Visual Studio para iniciar a aplicação indica isso:

Com a aplicação SiteDadosNASA em modo de execução, será possível constatar a existência de uma imagem Docker criada para testes de desenvolvimento, além de um container baseado em tal estrutura.

Ao executar o comando docker images no PowerShell, aparecerão as imagens microsoft/aspnetcore:2.1 e sitedadosnasa:dev:

Já o comando docker ps -a, trará o container gerado para utilização a partir do Visual Studio:

Será preciso agora gerar uma nova imagem Docker com base nas configurações de release da aplicação. Selecione para isto a opção Release (ao invés de Debug) no Visual Studio 2017:

Efetue na sequência a compilação do projeto (a partir do menu Build > Build Solution). Ao executar novamente o comando docker images no PowerShell, aparecerá a imagem sitedadosnasa:latest:

Observação: os procedimentos descritos neste artigo foram realizados a partir do Visual Studio 2017 Update 15.3, utilizando ainda o Docker for Windows em um ambiente de desenvolvimento baseado no Windows 10.

Criando um novo recurso do Azure Container Registry

O Azure Containter Registry permite o armazenamento de imagens de containers de maneira privada, trazendo assim uma alternativa dentro da nuvem da Microsoft ao uso de planos pagos do Docker Hub. Este serviço pode ser empregado em conjunto com tecnologias como Azure Container Services (com seus diferentes orquestradores – Docker Swarm, DC/OS e Kubernetes) e Azure Web App on Linux.

No portal do Azure será criado um novo recurso baseado no serviço Azure Container Registry (em português, Registro de Contêiner do Azure):

Informar no formulário de criação:

  • O nome/identificação do recurso (renatogroffe, neste exemplo) em Registry name;
  • Um Grupo de Recursos (ExemploASPNETCore2);
  • A Localização (Sul do Brasil);
  • Marcar a opção Enable em Admin user. Esta opção permitirá usar o nome do registro e uma senha gerada automaticamente como credenciais, viabilizando assim a conexão via utilitário de linha de comando do Docker no PowerShell;
  • Selecionar a opção Classic em SKU;
  • Uma conta de armazenamento (renatogroffestorage) em Storage account.

Após alguns segundos, o item renatogroffe (um Container Registry) aparecerá na lista de recursos disponíveis:

Publicando uma imagem Docker no Azure Container Registry

Uma tag chamada renatogroffe.azurecr.io/sitedadosnasa deverá ser criada para a imagem sitedadosnasa:latest. Este novo elemento contém o nome que será gravado no Azure Container Registry (formado pela identificação do registro de containers + nome da aplicação/imagem; esses dois itens estão separados ainda por uma barra – “/”). Execute para isto o seguinte comando no PowerShell:

docker tag sitedadosnasa:latest renatogroffe.azurecr.io/sitedadosnasa

Ao acionar novamente a instrução docker images no PowerShell, aparecerá uma imagem chamada renatogroffe.azurecr.io/sitedadosnasa:

O próximo passo agora será efetuar o login no recurso do Azure Container Registry criado na seção anterior. Executar para isto o seguinte comando no PowerShell (em que serão fornecidos o usuário e uma senha disponibilizados pelo Microsoft Azure):

docker login renatogroffe.azurecr.io -u USUÁRIO -p SENHA

As credenciais necessárias estão na seção Access keys do Container Registry (é possível utilizar qualquer uma das senhas indicadas em password e password2):

A imagem a seguir mostra que a autenticação teve sucesso:

Para publicar a imagem renatogroffe.azurecr.io/sitedadosnasa no Azure Container Registry, será utilizado o comando:

docker push renatogroffe.azurecr.io/sitedadosnasa

O resultado desta ação pode ser observado na próxima imagem:

A imagem renatogroffe.azurecr.io/sitedadosnasa aparecerá então no Azure Container Registry (seção Repositories), logo após a conclusão deste último procedimento:

Deployment no Azure

Mais uma vez será criado um novo recurso no portal do Azure, desta vez, baseando-se no serviço Web App on Linux:

Preencher no formulário de criação do recurso:

  • O Nome do Aplicativo (consultadadosnasa);
  • Um Grupo de Recursos (TesteDocker, neste exemplo);
  • Opcionalmente poderão ser configurados detalhes de Localização (data center escolhido para hospedagem) e do Plano de Serviço.

Acionar após informar o conteúdo destes campos a opção Configurar contêiner:

Em Contêiner do Docker, selecione o item Registro privado, especificando na sequência as seguintes configurações:

  • Em Imagem e marca opcional, informe o nome da imagem publicada no Azure Container Registry (renatogroffe.azurecr.io/sitedadosnasa);
  • Preencha o campo URL do servidor com o endereço do registro (http://renatogroffe.azurecr.io);
  • Informe ainda o usuário e password fornecidos pelo Azure Container Registry em Nome de usuário do logon e Senha, respectivamente.

Acione então o botão OK em Contêiner do Docker, confirmando as definições a serem utilizadas para a geração do novo container.

Conclua este processo clicando sobre o botão Criar, a partir do formulário em que se especificaram as configurações do site a ser hospedado na nuvem:

A opção Todos os recursos listará, após um curto período de tempo, o recurso consultadadosnasa:

Acessando o item consultadadosnasa aparecerá um painel no qual constará o endereço da aplicação de testes, bem como opções para a configuração e gerenciamento deste recurso:

Testes

Testes com a URL: http://consultadadosnasa.azurewebsites.net/, trarão resultados similares aos encontrados nas imagens a seguir:

Conclusão

Muito embora este artigo tenha focado no deployment de aplicações ASP.NET Core 2.0 na nuvem, o uso de serviços como Azure Container Registry e Azure Web App on Linux não está restrito à nova plataforma de desenvolvimento Web da Microsoft. Projetos implementados em linguagens como Node.js, Java, Ruby, Python e PHP também podem se valer dos recursos aqui descritos, sendo que isto é possível graças ao suporte que tais tecnologias oferecem para o trabalho com containers Docker.

Referências