Olá pessoal, tudo bem?

Continuando o assunto dos posts anteriores, hoje vamos fazer um exemplo de uma aplicação ASP.NET Core MVC executando em um Docker container no Ubuntu 16.04.

Requisitos

Aplicação ASP.NET Core

Para este exemplo, vamos criar uma WebApi bem simples, com apenas um controller e uma operação que responde ao método GET. O resultado será semelhante ao abaixo.

Aspnetcore

Seguindo os passos para criar uma aplicação .NET Core apresentados no post anterior, devemos incluir algumas dependências para o ASP.NET MVC:

  • Microsoft.AspNetCore.Mvc: O framework web;
  • Microsoft.AspNetCore.Server.KestrelO web server do AspNetCore construido sobre a libuv (mesma utilizada no Node.js);
  • Microsoft.Extensions.DependencyInjection.Abstractions: Abstrações do container de DI do ASP.NET Core.

No final, o arquivo project.json será semelhante ao exemplo abaixo.

Aspnetcore

Em seguida, devemos criar uma classe para fazer a inicialização do MVC que, por convenção, geralmente é chamada de Startup.cs. Nesta classe, devemos adicionar o MVC no método ConfigureServices informando que a aplicação irá utilizar o framework. No método Configure, deverá ser configurado o MVC no pipeline do ASP.NET Core (no exemplo abaixo não foi mostrado, mas no método UseMvc podem ser configuradas as rotas).

Aspnetcore

O próximo passo, é inicializarmos o WebHost na classe Program.cs para servir a nossa aplicação.

Aqui podemos configurar a construção do WebHost de acordo com a necessidade, pois existem diversas opções de configuração. Neste momento, iremos apenas informar que o Kestrel será utilizado e que a classe de inicialização será a Startup.cs.

Aspnetcore

Por fim, devemos criar o nosso controller.

Aspnetcore

Reforçando, para visualizarmos o resultado basta executar a aplicação com  dotnet run e visualizar no browser.

Imagens do Docker  do .NET Core

Existem diversos tipos de imagens do .NET Core para o Docker, cada uma com um propósito diferente:

  • SDK: Possui o sdk e o CLI permitindo o desenvolvimento e execução de aplicações, o desenvolvimento ocorre dentro da própria imagem.
  • OnBuild: Permite a criação de uma imagem usando o Dockerfile, compilando e executando a aplicação quando o container executar.
  • Core: Contém apenas a runtime do .NetCore, sendo preparada para aplicações portable.
  • Core-Deps: Contém apenas a runtime do .NetCore, sendo preparada para aplicações self-contained.

Executando a aplicação no Docker

Para executar o nosso exemplo no Docker irei utilizar a imagem OnBuild.

É importante salientar que será necessário modificarmos as informações de Hosting da aplicação, pois com o endereço padrão localhost não irá funcionar. Para isto, vamos incluir um novo arquivo no projeto chamado host.json, com a configuração que desejamos (ao invés de localhost, utilizamos o meta-endereço 0.0.0.0 fazendo com que a aplicação responda a qualquer endereço IP que tenha sido atribuído ao Host).

Captura de tela de 2016-07-17 15-24-19

Em seguida, devemos incluir as dependências necessárias para ler estas configurações no projeto.

  • Microsoft.Extensions.Configuration.Json: Provedor de configurações para os arquivos JSON.

A versão final do project.json ficará assim:

Captura de tela de 2016-07-17 15-28-29

Por fim, devemos incluir a leitura das configurações de hosting na criação do nosso WebHost com o extension method UseConfiguration .

Captura de tela de 2016-07-17 15-31-42

As alterações necessárias na aplicação eram estas, agora vamos criar o nosso Dockerfile. O Dockerfile é bem simples, como estamos utilizando a imagem OnBuild, a única coisa que precisamos fazer é apontar a imagem com o comando FROM e informar a porta 5000 com o comando EXPOSE.

Captura de tela de 2016-07-17 15-37-52

Agora devemos compilar a imagem do docker com o comando:

docker build -t aspnetcore-image .

E iniciar o container com o comando:

docker run -it --name aspnetcore-container -p 8080:5000 aspnetcore-image

Muito importante aqui é utilizar o modo interativo do container com o argumento -it, caso contrário o console não irá mais responder.

Captura de tela de 2016-07-17 15-44-09

 

Era isso pessoal!

Para mim está sendo muito bom aprender o dotnetcore/aspnetcore, pois gosto muito da plataforma em si, e usar dentro do Ubuntu e do Docker, que também gosto muito, é excelente.

O exemplo está no GitHub.

Um grande abraço a todos!