Introdução ao Docker — Criando um servidor web com Node.js

Criado - 30 de outubro de 2022

Atualizado - 1 de maio de 2023

Introdução

O Docker é uma plataforma open source que facilita a criação e administração de ambientes isolados. Ele possibilita o empacotamento de uma aplicação ou ambiente dentro de um container, se tornando portátil para qualquer outro host que contenha o Docker instalado.

Com isso podemos criar, implantar, copiar e migrar de um ambiente para outro com maior flexibilidade. A ideia do Docker é subir apenas uma máquina, ao invés de várias.

Como funciona ?

Desde o seu lançamento em 2013, a tecnologia oferecida por essa ferramenta proporciona a virtualização dos aplicativos utilizando o conceito de containers, uma máquina virtual que permite a execução de imagens. A ideia é fornecer camadas de abstração, permitindo que um aplicativo seja executado de forma independente do sistema operacional da máquina. Isso facilita o compartilhamento de uma aplicação ou conjunto de serviços, incluindo todas as dependências deles em vários ambientes.

Containers

Um container contém um conjunto de processos que são executados a partir de uma imagem, imagem esta que fornece todos os arquivos necessários.

Podemos criar containers usando apenas imagens já existentes no Docker Hub , sem precisar de um Dockerfile, por exemplo criar um container de um banco de dados Postgres, podemos executar o comando abaixo, isso irá baixar a imagem do Postgres do Docker Hub.

docker run --name db_postgres -e POSTGRES_PASSWORD=docker -p 5432:5432 -d postgres

O container trabalha de forma isolada, no que se trata de disco, memória, processamento e rede. Essa separação permite mais agilidade na criação, execução e orquestração dos containers, além de ambientes distintos poderem fazer uso do mesmo host, sem qualquer problema.

Instalação

A instalação é muito simples, basta acessar o site da docker , e baixar o executável de acordo com seu Sistema Operacional.

Não esqueça de criar uma conta no Docker Hub , ela é necessária para baixar as imagens e fazer login no Docker CLI. Depois de instalar e criar a conta, acesse o Docker e inicie a sessão digitando seu login e senha.

Para verificar se o mesmo está instalado, basta executa o comando docker -v .

Projeto

mkdir docker-projeto-nodejs && cd docker-projeto-nodejs && npm init -y

Adicione a lib express para criarmos um simples servidor web.

npm install express

Crie o arquivo index.js na raiz do projeto e adicione o conteúdo abaixo:

const express = require("express");

const app = express();

app.get("/", (req, res) => {
  res.send("Meu projeto docker");
});

app.listen(3000);

O arquivo index.js é basicamente um servidor web que recebe requisições quando acessamos http://localhost:3000 no navegador veremos na tela a mensagem Meu projeto docker. Mas para que isso ocorra, precisamos adicionar o comando abaixo no arquivo package.json.

...
 "scripts": {
    "start": "node index.js"
  },
...

Para iniciar o servidor digite npm start no terminal. Para encerrar o processo CTRL+C. Oque acabamos de realizar foi a criação do servivo em nossa máquina.

Dockerfile

Dockerfile é o arquivo onde definimos as instruções para criar as nossas próprias imagens. Ele tem sua própria sintaxe com os seus respectivos comandos. Abaixo temos um exemplo, crie um arquivo Dockerfile na raiz e adicione o código abaixo.

FROM node:16

## Define o local onde o app vai ficar no disco do container
## Pode ser o diretório que você quiser
WORKDIR /usr/app

## Copia tudo que começa com package e termina com .json para dentro da pasta /usr/app
COPY package*.json ./

## Executa npm install para adicionar as dependências e criar a pasta node_modules
RUN npm install

## Copia tudo que está no diretório onde o arquivo Dockerfile está
## para dentro da pasta /usr/app do container
## ignorar a node_modules
COPY . .

## Container ficará ouvindo os acessos na porta 3000
EXPOSE 3000

## Executa o comando npm start para iniciar o script que que está no package.json
CMD npm start

Criamos um .dockerignore para ignorar algumas coisas que não precisamos copiar para o container, ele é semelhante ao .gitignore quando não queremos enviar algo para repositório do GitHub.

Crie o arquivo .dockerignore na raiz do projeto e adicione na a linha:

node_modules

Agora a pasta node_modules da máquina local será ignorada pelo Docker quando copiar todos os arquivos para o container.

Executando o Dockerfile

Vamos criar nossa imagem no Docker

docker build -t codehamper-exemplo/dockernode .
  • docker build : cria uma imagem a partir do Dockerfile.
  • -t : é o nome/tag da imagem
  • codehamper-exemplo/dockernode : é o nome escolhido para esse projeto
  • . : onde o Dockerfile está (nesse caso é um . pois o comando será executado no mesmo diretório que o Dockerfile se encontra.

Após executar o comando nossa imagem está montada no Docker. Execute docker images para visualizar as imagens.

Criando o container

Execute o comando abaixo para criar o container

docker run -p 3000:3000 -d codehamper-exemplo/dockernode
  • docker run : cria uma container
  • -p 3000:3000: libera a porta do container para que cada requisição de fora quereira acessar a porta 3000 o container possa ouvir também na porta 3000.
  • -d: detach, ou seja, o terminal fica livre e o processo roda em background, porém exibe ID do container.
  • codehamper-exemplo/dockernode: nome da imagem que usado para criar o container.

Se executarmos o comando docker ps veremos o ID do processo em execução do container. Ao acessar em nosso navegador http://localhost:3000 veremos a mensagem Meu projeto docker.

Caso esteja usando o docker desktop, é possivel executar, parar, ver logs... tudo pela interface. Caso esteja utilizando via terminal, pode-se usar os comandos abaixos, mudando o ID pelo ID do seu container.

  • docker stop ID - Parar
  • **docker start ID ** - Iniciar
  • docker logs ID - Exibir os logs

Docker Compose

Hoje se alteramos o código ele não reflete no container, nem mesmo na nossa aplicação, temos que parar o processo do Node.js e iniciar novamente para refazer o deploy, mas temos uma lib chamada nodemon que fica ouvindo toda alteração no código e faz auto reload dessa alteração, para quando acessarmos a página vermos a modificação.

Na raiz do projeto crie o arquivo chamado docker-compose.yml

version: "3"

services:
 app:
   build: .
   command: npm start
   ports:
     - "3000:3000"
   volumes:
     - .:/usr/app

Instale o nodemon no projeto.

npm install nodemon

Vamos alterar o package.json para executar o nodemon

...
"scripts": {
  "start": "nodemon index.js"
}
...

Execute o comando docker-compose up, se acessarmos http://localhost:3000 veremos a mensagem da nossa aplicação.

Projeto no github

Carlos Stenzel profil

Author

Carlos Stenzel