Dockerizando sua Aplicação 🐳

Augusto Amaral
Feb 13, 2018 · 5 min read
This is Docker.

Docker é uma ferramenta incrível! Recentemente decidi me aprofundar um pouco mais e gostaria de compartilhar o que eu aprendi com vocês. Com esse artigo espero ajudar você colocar sua aplicações em contêineres e a gerenciar vários deles utilizando Docker Compose.

Mas por que utilizar Docker?

Sempre me perguntava isso. Achava tão fácil instalar todas as dependências do projeto em minha máquina, porém um script Docker resolve isso de forma muito mais rápida.

Imagina você construindo uma aplicação utilizando vários bancos de dados diferentes. Você teria que instalar cada um deles em sua máquina para poder desenvolver o projeto, até ai parece tudo bem, mas se este projeto fosse desenvolvido por um time? Cada nova dependência fará com que todos os membros do time tenham que instalá-las, se o time possuir SOs (Sistemas Operacionais) diferentes é bem provável que a forma de instalação seja diferente, isso vai dar trabalho, não? O Docker cria contêineres para você, de forma que sua aplicação será executada em um ambiente isolado, como se estivesses em “outra máquina” ou em um servidor.

Docker architecture

Outra vantagem é que você não vai precisar instalar nada em sua máquina, apenas o Docker, isso evita poluir o seu ambiente com as instalações de diversas aplicações.

Tanto o NodeJS, quanto o MongoDB, possuem imagens no Docker, assim como diversas outras tecnologias, você pode encontrar imagens no Docker Hub, lá existem centenas de milhares delas, mas vamos ao que interessa, como utilizar tudo isso?

Nossa Aplicação

Para entendermos como utilizá-lo criei uma pequena API em NodeJS para usarmos de exemplo. A Aplicação consiste em um CRUD, os detalhes sobre a aplicação estão no README para você testar posteriormente. Nossa plicação fará uso do MongoDB para armazenar nossos dados.

Para esse tutorial você vai precisar ter apenas o Docker e o Docker Compose instalados.

Vamos utilizar o Docker Compose para gerenciar nossos Contêineres.

Tudo pronto? então vamos lá!

Dockerizando 🐳

Vamos começar configurando o contêiner de nossa aplicação NodeJS, para isso vamos criar um arquivo com o nome na raiz da aplicação com o seguinte conteúdo:

Agora vamos entender o que esta acontecendo:

  • serve para dizermos qual imagem vamos utilizar no nosso contêiner, nessa caso vamos utilizar do próprio NodeJS contendo a sua ultima versão.
  • é utilizado sempre que queremos executar um comando dentro do contêiner, criar uma pasta, baixar as dependências do NPM, etc…
  • define o diretório de trabalho onde vamos manter nossa aplicação, a partir da declaração dele os comandos e serão executados no caminho definido através deste comando.
  • serve para copiarmos nossas arquivos, dessa forma copiamos o nosso código para o nosso .

Temos o nosso script para montar um contêiner Docker, mas nossa aplicação ainda não funciona, falta nosso banco de dados. Para ele vamos criar um novo contêiner, criaremos um arquivo chamado com o seguinte conteúdo:

Funciona da seguinte forma:

  • serve apenas para dizermos qual a versão do Docker Compose estamos utilizando.
  • são os nossos contêineres, é nossa aplicação em NodeJS e temos mais um chamado que é o nosso banco de dados.
  • serve para darmos um nome ao nosso contêiner, um alias.
  • dizemos quando queremos reiniciar nossa aplicação, com o dizemos que sempre, o padrão é que faz com que o contêiner não reinicie em nenhuma circunstância.
  • definimos onde se encontra o do contêiner
  • é onde listamos as variáveis de ambiente do contêiner, por exemplo a URI de acesso ao nosso banco, aqui temos um detalhe importante, a URI deve conter o nome do contêiner onde esta o banco, para o nosso script é , fica assim: mongodb:///catstore.
  • colocamos as portas que queremos expor do nosso contêiner, primeiro vem a porta do nosso contêiner e depois a do host, nesse caso nossa própria máquina, dessa forma a nossa sera acessível na porta 3000 de nossa máquina.
  • definimos a quais serviços nosso contêiner estará ligado.
  • dizemos que o nosso contêiner depende de outro, assim quando subirmos ele suas dependências serão levantadas primeiro.
  • podemos definir qual imagem vamos utilizar no serviço, para o nosso serviço vamos utilizar a imagem também chama mongo.
  • dizemos qual comando vamos executar ao subir aquele serviço.

Agora que entendemos cada linha vamos botar tudo isso para funcionar, com o comando vamos construir nosso serviço e como ele depende do serviço esse sera priorizado e executando primeiro, é nessa hora que sera feito o download das imagens e a execução nosso script.

Quando os serviços estiverem prontos utilizamos o comando para inicializar nossa aplicação, é nesse momento que a instrução contendo o npm start é executada.

Assim que terminar de utilizar os contêineres o comando vai parar e remover todos, caso deseja apenas parar-los use o .

Ambiente de desenvolvimento

Da forma que criamos nosso contêiner, sempre que alterarmos algum código vamos executar o build das imagens novamente para que nosso novo código seja enviado ao contêiner, podemos deixar isso mais fácil.

O pode nos ajudar, ele é uma ferramente que sobe o nossa aplicação em Node e a qualquer alteração em algum arquivo reinicia o servidor para nós.

Isso pode dar um pouco de dor de cabeça, não basta apenas executar a aplicação com , existem alguns detalhes que vamos ver abaixo, vamos adicionar então o nosso novo serviço :

Nessa configuração adicionamos o campo , ele é necessário para dizermos onde o nosso source se encontra no HOST, funciona assim primeiro o caminho do HOST, no caso e depois o caminho no contêiner que é separados por outro detalhe é o uso da flag para habilitar o modo legacy do , dessa forma a pesquisa por mudanças de arquivos sera feita outra forma.

Agora basta executar e depois para levantarmos nossa aplicação para desenvolvimento, tente mudar algo no código e veja sua aplicação reiniciar.

Considerações

Assim temos nossa aplicação em NodeJS dockerizada, criamos um contêiner para o nosso ambiente de desenvolvimento, isolamos o que é comum nos contêineres em nosso e o que é diferente deixamos em nosso

Aqui utilizamos uma stack NodeJS + MongoDB mais isso não impede você de utilizar outras tecnologias.

Espero ter ajudado com essas informações, conforme eu for percorrendo o meu caminho pretendo criar novos artigos, qualquer feedback ou correções são bem vindas!

Até mais! 🐳

Training Center

Conectamos pessoas que querem aprender algo relacionado a desenvolvimento de software com gente que pode guiá-las.

Augusto Amaral

Written by

Developer at Pagar.me

Training Center

Conectamos pessoas que querem aprender algo relacionado a desenvolvimento de software com gente que pode guiá-las.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade