Como rodar uma aplicação Node.js no Docker

Claudiney Junior
Nerdzão/Nerdgirlz
Published in
4 min readMay 13, 2018

--

Muita gente tem me procurado para saber um pouco mais sobre Docker e como fazer sua aplicação rodar em um container. Por isso resolvi fazer esse pequeno tutorial de como fazer o deploy de uma aplicação Node.js em um container no Docker.

Vou partir da premissa que você já tenha o Docker, NPM e Node.js instalados, caso contrário você pode encontrar ajuda aqui:

A primeira coisa que vamos fazer é clonar o repositório do nosso projeto, e instalar as dependências:

$ git clone https://github.com/claudineyjr/docker_node_tutorial
$ cd docker_node_tutorial
$ npm install

Pronto, tudo instalado! Essa aplicação é extremamente simples, está rodando um servidor com express e quando acessado localhost:3000 ele nos exibe o conteúdo do objeto process.env que nada mais é que o ambiente em que está rodando o processo. Um objeto presente por padrão em uma aplicação Node.js.

Neste projeto vamos focar em 1 arquivo em especial, o Dockerfile que é o arquivo para moldar a imagem docker a ser usada. Podemos fazer um paralelo dele, a título de exemplo, com o que é o código de uma declaração de uma classe em POO (Programação Orientada a Objeto), nele definimos todas as propriedades que a imagem Docker terá. Vamos ver um pouco do que está acontecendo neste arquivo.

# Usa uma imagem do docker hub com a versão carbon do Node.jsFROM node:carbon

Esse comando define nosso "ponto de partida" da imagem, vamos usar uma imagem publicada no Docker Hub que contém o Node.js.

Precisamos definir em qual diretório do container iremos usar para copiar os arquivos e rodar nossa aplicação, para isso usamos o comando WORKDIR

# Define qual diretório será usado para nossa aplicação dentro do containerWORKDIR /usr/src/app

Como vocês sabem, nos arquivos package.json e package-lock.json temos todas as dependências usadas em nossa aplicação, assim como a estrutura da aplicação, portanto, para inicializar nosso projeto, precisamos copiar estes arquivos da pasta em que se encontra o Dockerfile para a pasta declarada no WORKDIR. O comando abaixo usa o operador COPY e recebe 2 parâmetros, arquivos de origem package*.json onde * é um operador para dizer à maquina que ela pode pegar todos os arquivos que comecem com e tenham a extensão json e o segundo parâmetro é a pasta destino representada pelo ./.

# Copia todos os arquivos que começam com package e tem extensão .json para o diretório definido acimaCOPY package*.json ./

Após copiar todos os arquivos de pacote para nosso diretório de trabalho precisamos instalar todas as dependências, para isso vamos rodar

# Instala todas as dependências declaradas no package.jsonRUN npm install

Agora falta copiar nossa aplicação de fato para dentro do container, para isso usaremos oCOPY novamente, com 2 parâmetros sendo que o . quer dizer que é pra copiar tudo do nível do Dockerfile para tudo do nível do WORKDIR

# Copia todos os arquivos da raiz da nossa aplicação para a pasta deinida no WORKDIRCOPY . .

Bom, precisamos também deixar disponível a porta em que nossa aplicação roda, certo? Então exporemos a porta3000 do container.

# Expõe a porta 3000 do containerEXPOSE 3000

Bom, precisamos que o container rode nossa aplicação também né? Pra isso vamos colocar que é preciso rodar o npm start também.

# Roda o comando 'npm start'CMD [ "npm", "start" ]

E isso conclui nosso Dockerfile temos nosso modelo para criar a imagem, agora vamos criá-la.

Agora vamos abrir o terminal e navegar até o diretório onde se encontra o Dockerfile

Para buildar uma imagem usamos o comando docker build e podemos usar a opção -t nomedoprojeto para dar uma tag para sua imagem. Vamos chamar essa imagem de seunome/docker-node-tutorial a partir do diretório local .

docker build -t seunome/docker-node-tutorial .

O comando acima provavelmente demorará um pouco na primeira vez que você executar, pois ele precisa baixar a imagem node:carbon que tem um tamanho considerável. As próximas vezes serão praticamente instantâneas.

Agora você já tem sua imagem Docker criada. Uma imagem é como se fosse uma classe em POO, e você precisa instanciá-la. A instância de uma imagem é o container da mesma, então podemos comparar um container a um objeto em POO.

Vamos listar nossas imagens usando o comando docker images em seu terminal. O resultado será uma lista com todas as imagens disponíveis em seu computador.

Só falta rodar a aplicação agora, certo? Para isso basta usar o comando

docker run -p 49160:3000 -d seunome/docker-node-tutorial

Vamos entender o comando acima. usamos docker run para rodar uma aplicação, o -p é para definir as portas sendo que a porta 49160 ficará disponível fora do container e que ela direcionará à porta 3000 que nós definimos na nossa aplicação e expusemos no Dockerfile. O -d faz com que o container rode em background e que exibe no terminal o id do container. o último argumento é o nome da sua imagem, que você definiu acima.

PRONTO! Sua aplicação está rodando! Para acessar vá em localhost:49160 e você deverá ver o process.env do seu container, veja que ele é diferente do que você recebe quando roda sua aplicação direto do terminal, pois ele exibe as informações do container.

Pronto, agora que você já sabe da estrutura e de como começar você pode desenvolver aplicações e imagens docker para rodar em qualquer ambiente. E essa é a base para levar seus aplicativos pra nuvem, para serviços como IBM Cloud, Amazon, Microsoft e Google.

Dá uma olhada no repositório e dá estrela lá o/ https://github.com/claudineyjr/docker_node_tutorial

Prefere vídeo? Tem também, meu vídeo no youtube falando sobre o assunto está nesse link.
https://youtu.be/6TqH5DLNh3c

Quer ficar ligado nas atualizações? Se inscreva no meu canal! :P

Valeu pessoal, espero que tenham gostado!!

--

--

Claudiney Junior
Nerdzão/Nerdgirlz

Senior Engineering Manager @ iFood | Community Manager @ CaquiCoders