Configurar aplicação Node.js no Docker

Zack Stone
Zack Stone
Published in
3 min readMar 5, 2019

Vamos colocar pra rodar no Docker uma aplicação Node.js simples (sem buildpacks, pré-processaadores, etc.). O código -fonte encontra-se em https://github.com/YitzhakAndrade/nodejs-docker-example.

Assumindo que o ambiente Docker já esteja instalado (veja como em http://stack.desenvolvedor.expert/appendix/docker/instalacao.html) e você saiba o que é o Dockerfile (não sabe? acessa aí: https://www.mundodocker.com.br/o-que-e-dockerfile/).

Não vamos esquecer do arquivo “.dockerignore” (https://docs.docker.com/engine/reference/builder/), que restringe os arquivos/pastas que serão copiados para dentro da nossa imagem. Adicionamos a pasta “node_modules” (https://docs.npmjs.com/files/folders.html#node-modules), pois todas as dependências serão instaladas de dentro da própria imagem, e o arquivo de log do npm (https://docs.npmjs.com/misc/config#loglevel).

node_modules
npm-debug.log

Abaixo está o arquivo Dockerfile utilizado e vou explicar cada instrução logo em seguida.

Informa a imagem base a ser utilizada, neste caso a versão 8 do Node.js.

FROM node:8

Define o diretório de trabalho da nossa imagem (para onde serão copiados os arquivos).

WORKDIR /usr/src/app

A instrução “COPY” copia os arquivos/pastas para dentro da imagem. Primeiramente vamos copiar somente os arquivos “package.json” e” package-lock.json”, necessários para instalar as dependências da aplicação.

COPY package*.json ./

Agora vamos usar a instrução “RUN” para executar um comando dentro da imagem, neste caso, o comando para a instalação dos pacotes (dependências). Estou usando o comando “npm ci” para garantir uma instalação limpa das dependências (veja mais detalhes em https://docs.npmjs.com/cli/ci.html). O argumento “only=production” restringe a instalação somente dos pacotes de produção, ou seja, não instala as dependências de desenvolvimento (seção “devDependencies” do arquivo “package.json” https://docs.npmjs.com/files/package.json#devdependencies).

RUN npm ci --only=production

Assumindo que o arquivo “Dockerfile” esteja na pasta raíz do código fonte da aplicação, o comando abaixo copia o código-fonte para dentro da imagem, exceto os arquivos/pastas configurados no arquivo “.dockerignore”.

COPY . .

A instrução “EXPOSE” define uma ou mais portas a serem expostas quando um contâiner for iniciado utlizando a imagem, deixando-o acessível externamente por meio dessas portas. Já a instrução “CMD” define um comando a ser executado quando o contâiner for iniciado. Neste caso, o comando “npm start” é o que inicia a aplicação.

EXPOSE 3000
CMD [ "npm", "start" ]

Agora já temos nosso arquivo “Dockerfile” configurado para criar nossa imagem a partir da imagem base do Node.js v8, copiar o código-fonte, instalar as dependências, iniciar a aplicação (que usa a porta 3000) e expor a porta 3000 para acesso externo.

O próximo passo é criar a imagem (parâmetro “-t” para criar uma tag para a imagem e o “.” indica onde está o arquivo Dockerfile, neste caso no diretório atual):

$ docker build -t minha_imagem .

E executar nossa imagem num container (parâmetro “name” indica qual imagem vamos executar no container, “-p” para mapear a porta exposta do contâiner em nossa máquina local e “-d” para liberar o terminal/console após subir o contâiner):

docker run --name meu_container -p 3000:3000 -d minha_imagem

Acesse agora seu navegador no “http://localhost:3000” e veja sua aplicação rodando.

Playlist do post: Band On The Run (Paul McCartney) Song Radio

--

--