Escolha uma Página

Sabe aquela frase “na minha máquina funciona”? Pois é! Também me dá arrepio na espinha. Mas relaxa que o Docker resolve!

A proposta dele é bem simples: Rodar qualquer coisa em qualquer lugar. Como o próprio site diz, o Docker permite empacotar sua aplicação numa unidade padronizada para desenvolvimento de software. A ideia é a mesma que acontece nos portos, o pacote é um container e o conteúdo é a aplicação. O container vem com as pilhas necessárias para rodar sua aplicação e tudo que você instalaria no servidor ficam nele.

Isso facilita muito o desenvolvimento. Você pode esquecer aquele dia inteiro configurando sua máquina, instalando bibliotecas e configurando o ambiente para rodar a aplicação. Além de minimizar as inconsistências entre ambientes, configurações e dependências justamente por tudo estar empacotado.

Com o crescimento da comunidade, estão sendo disponibilizadas imagens prontas para uso no Docker Hub. O Hub é um repositório público e privado na nuvem que hospeda imagens.

Outro benefício, é o ganho de escala horizontal. É possível levantar um novo container em sua aplicação sem a necessidade de levantar máquinas virtuais ou provisionar um ambiente. E isso pode ser feito em instantes com um simples comando.

Mas vamos deixar de papo e meter a mão na massa. Abaixo vamos mostrar como desenvolver uma api rest em C# rodando no Docker e desenvolvida no Mac.

Para fazermos isso temos algumas opções:

  1. Podemos escrever uma aplicação utilizando o novo framework .NET Core (https://github.com/dotnet/corefx) da Microsoft e subir tanto em containers linux quanto windows. Como na internet já existem muitas explicações de como fazer isso vamos descartá-la por agora. Se quiser saber mais sobre essa abordagem é só dar uma olhada na imagem oficial no Docker Hub: https://hub.docker.com/r/microsoft/dotnet/
  2. Segunda opção é escrever uma aplicação tradicional .NET e subir um container windows com ela. O Docker não suporta dois tipos de containers rodando simultaneamente no mesmo host, por isso, essa opção não é interessante.
  3. Opção aqui é escrever a api em C# com framework Nancy e rodar em containers linux com o Mono.

Mono é uma implementação open source do .NET desenhada para permitir o desenvolvimento de aplicações cross plataform. Existe uma comunidade super ativa com o repositório no github (https://github.com/mono/mono) com mais de 110K commits. Atualmente é patrocinada pela Microsoft, o que transmite bastante confiança. Vai ser o mono que vai permitir que nosso amado C# rode com louvor no linux =). Se quiser se aprofundar mais sobre o mono é só entrar no site do projeto: http://www.mono-project.com

Nancy também é um framework open source focado em serviços HTTP. Ele leva o nome da filha do Frank Sinatra pois foi inspirado no Sinatra do Ruby. Ele é leve e com pouquíssima cerimônia, já que não tem todas as dependências do Wcf e do Web Api. Além disso, não precisa de linhas e linhas de configuração. Sugiro muito esmiuçar toda a documentação do framework que está no github: https://github.com/NancyFx/Nancy/wiki/Documentation

É muito simples criar uma api do zero com o Nancy.

Primeiro vamos criar um projeto Console Application (vou chamar de Nala que é o nome da minha cachorrinha linda):

Tela de configuração de um novo projeto

Depois basta instalar os seguintes pacotes pelo NuGet:

Nancy.Hosting.Self
Mono.Posix

Editar o arquivo Program.cs com as seguintes linhas:

Criar um módulo Nancy qualquer para responder às requisições http (os módulos são equivalentes aos controllers no Web Api):

Com essa abordagem self hosted ficamos livres do nosso pesadinho amigo IIS e de fato a api já estará funcional:

Agora vamos escrever o Dockerfile que contém as instruções pro docker construir a imagem da aplicação. O arquivo vai ficar muito simples, muito pelo motivo que falamos acima sobre colaboração. Como já tem a imagem do Mono pronta no docker hub a minha vida ficou muito mais fácil:

Imagem do Mono

Na primeira linha eu digo ao docker qual imagem base utilizar. Depois eu copio o conteúdo do diretório de binários resultantes do build do projeto para dentro do container. Por último, determino qual diretório estaremos e determino qual comando por default será executado quando o container for iniciado.

Após isso basta construir a imagem a partir do docker build:

Imagem do docker build

(O parâmetro -t serve para associar uma tag a imagem)

Após ter construído a imagem, basta levantar o container utilizando as opções -d (Detached mode) para executar em segundo plano e -p para mapear as portas do host (1234) para dentro do container (8888) e por último passar o parâmetro que corresponde a tag da imagem:

imagem construída

Logo após isso, a aplicação já está de pé escutando na porta 1234:

imagem ilustrativa

E assim você consegue aproveitar os super poderes do C#, Nancy e Docker! Após isso, vale muito a pena estudar o Docker Compose e sempre criar scripts e pipelines para automatizar todos os processos e deixar a vida mais agradável.

Quer receber as novidades de e-commerce em primeira mão?

x