Sitemap
Thassio Victor

Thassio Victor

Brazilian, developer

ENV: Docker e Node.js

4 min readOct 25, 2015

--

“Na minha máquina funciona”

A idéia

Configurar um ambiente de desenvolvimento Node.js que possa ser
facilmente replicável em qualquer máquina Linux (dá pra fazer em Windows, mas esse tutorial cobre somente Linux), sem ter a necessidade de instalar outro software que não seja o próprio Docker e seus componentes. Isso vai garantir com que o ambiente no qual você está desenvolvendo (sua própria máquina) seja idêntico ao ambiente de produção (o servidor).

O que isso resolve?

Do ponto de vista do Dev, isso resolve dois problemas:

- “Estranho, na minha máquina funciona” e

- "Mas eu vou ter que desinstalar a versão 0.12.7 do Megaboga Express Super Ultra Mega Puxa Puxa pra eu poder instalar o Super Aerolito 2.3.2 porque os dois softwares não são compatíveis e é isso que usam no trabalho :(“

Sobre o Docker

Se você nunca ouviu falar sobre Docker:

Docker containers wrap up a piece of software in a complete filesystem that
contains everything it needs to run: code, runtime, system tools, system
libraries — anything you can install on a server. This guarantees that it will
always run the same, regardless of the environment it is running in.

Pense em uma “VM enxuta”, só com o necessário para rodar o seu serviço, que pode ser instanciada tanto na sua máquina quanto no servidor, sem diferença na configuração entre as instâncias. Essa “VM enxuta” chama-se container e é nesse container que vamos colocar o código para rodar.

Existe muita documentação sobre Docker na web, incluindo vídeos, artigos e
tutoriais. A documentação do site do Docker é excelente, por sinal.

O conhecimento sobre o que é uma imagem, o que é um container e outros
conceitos básicos não serão tratados diretamente nesse tutorial. Por conta disso, deixo o vídeo “Descomplicando Docker e Containers — parte 1” para que você possa assistir e entender melhor esses conceitos (foi o vídeo que eu assisti pra entender Docker, por sinal. É bem legal o vídeo).

Importante: O Docker pode ser instalado em muitas plataformas diferentes. Veja qual é a sua e faça a instalação. A versão do Docker que será utilizada neste tutorial é a 1.8.3.

Hands on!

Definindo o “mini projeto” Node

A primeira coisa a se fazer é definir um diretório e colocar o código da sua aplicação lá dentro. Isso pode ser feito através de um git clone de algum projeto Node que está no github, mas para esse exemplo vamos fazer uma aplicação do zero (Obs: a base do projeto vai ser /tmp).

Dentro do diretório /tmp/nodeproj, crie o arquivo package.json e coloque o seguinte conteúdo:

Depois, crie o arquivo app.js com o seguinte conteúdo:

Até agora o conteúdo do diretório /tmp/nodeproj fica sendo:

  • o arquivo package.json,
  • o arquivo app.js

Agora vem o Docker

Levando em consideração que você já sabe como inicializar um container (se você não assistiu o vídeo lá em cima, sério, assista), vamos baixar uma imagem, inicializar um container, colocar nossos arquivos do projeto dentro do container, instalar as dependências do projeto (aquele “express” dentro do package.json) e, por último, executar o projeto node.

Get Thassio Victor’s stories in your inbox

Join Medium for free to get updates from this writer.

A primeira coisa a fazer é pegar uma imagem do repositório de images do Docker. Já tem imagem pronta com Node (de todas as versões, inclusive), então usaremos uma que já existe lá. A imagem que vamos usar é a do node v0.12.7 (você pode usar a versão que você quiser. Essa é uma versão mais antiga, mas funciona perfeitamente com o exemplo que estamos fazendo).

Esse comando vai no repositório e baixa uma imagem que tem o node 0.12.7 instalado. A velocidade e tempo do download podem variar de acordo com a sua conexão.

Importante: se der algum tipo de erro com o comando acima, as possíveis
causas podem ser:

  • 1) o deamon do Docker não foi inicializado; para se certificar, “pgrep docker” e veja se retorna o PID do processo,
  • 2) você instalou o Docker como deveria, mas seu usuário não ter permissão para executar diretamente; para resolver, você pode colocar o seu usuário no grupo “docker” ou você coloca “sudo” na antes de “docker” sempre que for executar algum comando comando.

Executando

Tendo a imagem, vamos inicializar o container e colocar nossos arquivos lá
dentro.

Esse comando inicializa o container (docker run -it node:0.12.7), monta o
diretório atual no diretório ‘/src’ do container (-v `pwd`:/src), cria um
link (mais fácil de pensar dessa forma) entre a porta 8080 do container com a porta 8080 do host (-p 8080:8080) e depois retorna um bash (/bin/bash). É importante ter esse ‘/bin/bash’ no final porque o default é o docker te enviar para o REPL do node, e não é bem isso o que a gente quer.

Agora que você já tem o terminal do container, vá para o diretório ‘/src’ para iniciar o projeto node:

Agora vá no seu browser e acesse “http://0.0.0.0:8080". Deverá aparecer a mensagem “This is nodeproj running inside docker”

Press enter or click to view image in full size
Resultado

Se você conseguir ver a mensagem, deu tudo certo, parabéns, we are the
champions!

Agora você pode continuar o desenvolvimento do seu projeto, dentro do
container Docker, como se estivesse fazendo tudo diretamente na sua máquina. O diretório /tmp/nodeproj continua acessível no host (porque esse diretório foi montado no container ~como uma partição~) e você pode controlar a execução do projeto no bash do container.

:)

Por favor, dê seu feedback para que o post possa ser melhorado!

--

--