Construindo um ambiente Node.js com Docker
Tags: node, docker, koa, nodemon
Published: 2020-09-14 14:16:20

Eae dev!

Meu nome é Lucas e tenho 27 anos, pouco mais de 3 anos entre estudante de desenvolvimento e programador de verdade. 
O que me motivou a escrever esse artigo foi a vontade de mostrar como criar um ambiente de desenvolvimento que é utilizado também em ambientes de produção, usando containers e especialmente Docker. Esse artigo é um pouco mais prático, não se atentará a explicar como Docker funciona e o contexto dos containers e imagens. Não que não seja importante conhecer os fundamentos, mas para começar a utilizar não é necessário. No final deixarei alguns vídeos e outros artigos caso você tenha esse intuito. 

Docker é um gerenciador de containers criado por Solomon Hykes e que, na minha opinião, mudou a forma de desenvolver, sendo utilizado tanto no ambiente de desenvolvimento quanto de produção.
Depois que conheci, o Docker e resolvi aplica-lo no meu dia-dia, não o abandonei mais. Depois do ar condicionado, a melhor invenção do homem foi o Docker. 
Você consegue criar um ambiente em poucos segundos e pode começar a desenvolver um sistema que será facilmente utilizado tanto no servidor quanto em outro computador.
Sim, aquela frase "no meu computador funciona" não será mais dita.

# Pré-requisitos

Antes de começarmos de fato a utilizar o Docker, alguns pré-requisitos precisam ser preenchidos. São eles:

1 - Ter o Docker instalado em sua máquina. Caso não tenha, segue alguns links ensinando como instalar:

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-pt
https://www.mundodocker.com.br/tag/docker-no-windows/

2 - Ter o Node.js instalado em seu computador. Deixarei apenas o link de como instalar no Linux devido à facilidade de instalação no Winodws.

https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-pt

# 1º Passo - Criar um projeto Node.js com NPM

Escolha um diretório de sua preferência e no terminal, digite o comando abaixo:
``` mkdir node_project ```

Navegue para esse diretório utilizando o comando abaixo:
``` cd node_project ```

Inicie um projeto node lembrando de colocar a tag "-y" no final para que não haja a necessidade de preenchimento dos campos: 
``` npm init -y ```

# 2º Passo - Criando o arquivo do projeto e instalando Koa.js

O nosso app será bem básico, utilizando uma biblioteca conhecida no mundo JS chamada Koa.js. Esse lib surgiu de uma galera que se desvencilhou de um outro projeto, Express. Ele também é baseado em middlewares e facilita bastante a criação de um servidor HTTP com o Node.js. No final, deixarei alguns links falando mais sobre o Koa caso você tenha interesse em se aprofundar mais.

Bom, antes de criar o nosso arquivo, vamos instalar o Koa como dependência do nosso projeto para podermos utilizá-lo.

``` npm install koa ```

Além do Koa, vamos instalar o Nodemon como uma dependência de desenvolvimento, que nos permitirá atualizar a nossa aplicação e ver o efeito dessa atualização em tempo real. 

``` npm install nodemon -D ```

Sem mais delongas, vamos criar o nosso app.js. (FINALMENTE!)

```javascript
//app.js
const Koa = require('koa')

const app = new Koa()

app.use((ctx) => {
  ctx.body = '<h1>Hello from my first Node.js Docker app!</h1>'
})

app.listen('3000')
```

Para que consiga testar, basta digitar no diretório do arquivo o comando a seguir: 

``` node app.js ```

Acesse o seu navegador preferido, digite "localhost:3000" e _voilá_ ... 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/kj1xqa5u55unfm14ummx.png)

Temos um servidor rodando em nosso computador. Vamos agora para a última etapa e mais importante, colocar o servidor para rodar em um container Docker.

# Último Passo - Criando uma imagem Docker e subindo um container com o nosso servidor

Agora que temos o projeto instalado, vamos criar um novo arquivo no nosso diretório chamado Dockerfile. Com ele será possível criar uma imagem e posteriormente, subir o container com a aplicação rodando via localhost.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ukkyvbt7m11iyby36sjf.png)

Uma dica importante, se você é como a maioria dos devs hoje em dia e utiliza o VSCode como ferramenta para desenvolver, instale a extensão do Docker para ter acesso a várias coisas legais como syntax highlighting.

https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker

Com o arquivo Dockerfile criado, digite a receita abaixo: 

```docker 
// Dockerfile
FROM node:12.18.3-alpine3.12

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

RUN npm install

COPY . .

COPY --chown=node:node . .

USER node

EXPOSE 3000

CMD [ "node", "app.js" ]
```
Pronto, vamos fazer mágica acontecer. Em seu terminal, no diretório do projeto, digite: 

``` docker build . -t node-app ```

Aguarde alguns segundos, dependendo da velocidade da sua conexão, para que a imagem Node seja baixada e se a mensagem abaixo aparecer no seu terminal, está tudo ok para seguirmos adiante.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ta7m9bafz2ylf15872jp.png)

Com a imagem criada, vamos criar o nosso container e colocar ele para rodar.

```  docker run --name my-node -p 3000:3000 -v "${PWD}:/home/node/app" node-app ```

Se não houve nenhum erro ao final do processo, acesse novamente o seu navegador preferido, digite "localhost:3000" e novamente... **VOILÁ**!

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/kj1xqa5u55unfm14ummx.png)

Pronto. Temos um servidor Node rodando em Docker. Viu como é fácil? Quer ver outra coisa sensacional? 
Vá até o arquivo app.js no seu editor ou IDE preferido e mude o texto dentro da tag H1.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/6cx44oom56hl7xtcq02a.png)

Acesse o navegador e atualize a página para ver a mágica acontecer.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/gy71fmqb9ze4lugsotnx.png)

Conseguimos realizar tal façanha utlizando um recurso do Docker que cria volumes e reflete toda alteração feita no arquivo que está na pasta automaticamente no containter. 

Com mais algumas linhas de código, estudo sobre Docker, você será capaz de subir uma aplicação dessas em produção.

Espero que tenha gostado dessa artigo prático e que tenha coçado o seu cerebelo para ir cada vez mais fundo nesse mundo Docker. 

Como prometido, segue links de outros materiais que irão te ajudar a seguir adiante:

**Como criar um servidor HTTP com KoaJS - CollabCode**
https://www.youtube.com/watch?v=D780xIvOBPk&t=2s

https://www.digitalocean.com/community/tutorials/how-to-build-a-hello-world-application-with-koa

**Docker em 22 minutos - teoria e prática - Programador a Bordo**
https://www.youtube.com/watch?v=Kzcz-EVKBEQ

**Ambiente de desenvolvimento NodeJS com Docker e Docker Compose - Rocketseat**
https://www.youtube.com/watch?v=AVNADGzXrrQ&t=611s

**Ambientes Back-End com Docker + VS Code - Código Fonte TV**
https://www.youtube.com/watch?v=97jWpWp4Pnc

**Como configurar seu ambiente de desenvolvimento Javascript para usar Docker - Erick Wendel** https://www.youtube.com/watch?v=Bp2bU6fQcSo&t=468s