Ao longo dos anos, as aplicações e ferramentas tornaram-se mais complexas para acompanhar as mudanças nas exigências e expectativas das pessoas. Mas isso pode criar problemas de compatibilidade de código e acesso remoto. Por exemplo, um código que funciona corretamente no Windows pode desenvolver erros de compatibilidade quando instalado no Linux.

Felizmente, o Docker vem em socorro. Mas você pode estar se perguntando – o que é o Docker e como ele ajuda? Você aprenderá tudo isso e muito mais neste tutorial.

Mas antes de começarmos, aqui estão alguns pré-requisitos:

  • Conhecimento de comandos Linux

  • Conhecimento de uso do terminal

  • Conhecimento de Node.js e Express.js

Sumário

  1. O que é o Docker?

  2. Como instalar o Docker

  3. Projeto de Demonstração: Como containerizar uma aplicação Node.js

  4. Conclusão

O que é o Docker?

O Docker é uma ferramenta de código aberto que facilita a execução de software de forma consistente, não importa onde você esteja. Ele faz isso colocando sua aplicação e tudo o que ela precisa (como bibliotecas e configurações) em um contêiner (sobre o qual falarei mais adiante).

Pense em um contêiner como uma caixa: ele contém seu aplicativo e todas as suas partes, para que funcione exatamente da mesma maneira em seu laptop, em um servidor ou na nuvem. O Docker ajuda os desenvolvedores a evitar o problema do “funciona em minha máquina” garantindo que tudo esteja embalado juntamente de forma confiável e portátil.

O Docker foi criado por Solomon Hykes em 2013. Ao longo dos anos, ele evoluiu para abranger uma ampla gama de ferramentas. Tornou-se uma ferramenta essencial para melhorar os processos de implantação de aplicativos e de rede.

Antes de prosseguirmos, aqui estão alguns termos-chave que você encontrará ao longo deste tutorial:

Motor do Docker

O mecanismo Docker, como o nome indica, é o motor para aplicações Docker. Ele tem um componente cliente e um servidor. O cliente Docker, no nosso caso, é a ferramenta de interface de linha de comando ou terminal Docker que usaremos para enviar comandos relevantes para a execução do projeto. O servidor Docker, popularmente conhecido como daemon, é o servidor que lida com a execução das várias imagens e containers Docker.

Imagem Docker

As imagens Docker são modelos pré-fabricados de software e sistemas executáveis. O Docker oferece uma ampla gama de imagens, desde modelos de sistemas operacionais até modelos de servidores, modelos de software, e assim por diante. Você pode encontrar todos esses no registro do Docker Hub, onde essas imagens são armazenadas.

Você também pode construir uma imagem específica e hospedá-la publicamente no Docker Hub ou em um registro privado.

Containers Docker

Os containers Docker são instâncias compactas executáveis construídas no modelo gerado que é a imagem Docker. Eles são pacotes portáteis e leves que incluem tudo o que é necessário para executar um pedaço de software – código, tempo de execução, bibliotecas e ferramentas de sistema. Um container garante que a aplicação seja executada de forma consistente, independentemente do ambiente.

Vantagens de Usar o Docker

Aqui estão alguns dos benefícios de usar o Docker como desenvolvedor backend:

  • O Docker é uma ótima ferramenta para criar uma sólida cultura DevOps para o desenvolvimento de aplicativos, pois esclarece as funções das equipes de desenvolvimento e operações.

  • Também é bastante flexível, permitindo a implantação fácil de microsserviços e aplicativos monolíticos distribuídos.

  • Também minimiza erros de configurações de dependências durante as instalações, pois porta o aplicativo com suas dependências necessárias de uma só vez.

Continuando, vamos mergulhar em como Dockerizar um aplicativo Node.JS Express. Mas antes disso, você precisará instalar o Docker em seu computador. Você pode pular esta etapa se já tiver instalado.

Como Instalar o Docker

O Docker é uma ferramenta multiplataforma que pode ser instalada em todos os sistemas operacionais populares (Windows, Mac OS e distribuições Linux). Neste tutorial, destacarei apenas como configurar o Docker no Windows.

Se você estiver usando um sistema operacional que não seja o Windows, você pode configurar o Docker facilmente seguindo os passos na documentação do Docker aqui.

Para usuários do Windows, é essencial que seu PC atenda aos requisitos mínimos – caso contrário, a instalação não será bem-sucedida. Os requisitos mínimos são os seguintes:

  • Uma versão do sistema operacional Windows não inferior ao Windows 10 home

  • Um PC com WSL-2 instalado ou Hypervisor ativado.

Com isso, vamos seguir para baixar o instalador executável do Docker. Você pode baixar o instalador mais recente do Docker aqui. Após fazer isso, execute o software e aceite os termos e condições. Ao concluir com sucesso, inicie a aplicação. Isso é o que você deverá ver:

Para confirmar que você instalou a aplicação com sucesso, vá ao terminal do prompt de comando e execute Docker --version. Você deverá ver a versão exata da ferramenta Docker Engine que você instalou, se foi bem-sucedido.

Agora vamos prosseguir para o projeto propriamente dito.

Projeto de Demonstração: Como Containerizar uma Aplicação Node.js

Nesta seção, vamos containerizar um simples serviço backend baseado em Node.js com dependências mínimas. Isso mostrará como containerizar e portar uma aplicação usando uma técnica de containerização de aplicação Docker conhecida como Dockerfile. Tenha em mente que se você tiver uma aplicação mais complexa, pode ser melhor usar a ferramenta Docker Compose YAML.

Para começar, vamos configurar a aplicação de exemplo Node.js. Vou fornecer todo o código de configuração neste artigo, abaixo. Mas primeiro, vamos entender o que é um dockerfile.

O que é um Dockerfile?

Basicamente, um Dockerfile é um sistema de modelo que permite ao usuário inserir comandos que, quando executados, podem produzir uma imagem funcional da aplicação. Esta imagem pode então ser convertida em um contêiner.

Aqui estão alguns comandos incluídos na estrutura básica de um Dockerfile:

  • CMD: define o comando padrão a ser executado se nenhum comando for especificado quando o contêiner é iniciado. Pode ser substituído ao fornecer um comando ao executar o contêiner (docker run ...).

  • ENTRYPOINT: Especifica o comando principal que sempre é executado quando o contêiner é iniciado. Não pode ser facilmente substituído, mas argumentos podem ser acrescentados.
    Observe que CMD e ENTRYPOINT especificam ambos qual comando ou processo o contêiner deve executar ao iniciar. No entanto, são utilizados de forma diferente e possuem propósitos distintos. Use CMD para um comportamento padrão que pode ser substituído. Use ENTRYPOINT para um comando fixo que define o propósito principal do contêiner.

  • FROM: Esta é geralmente a declaração inicial em um Dockerfile. Este comando busca uma imagem base que forma a base para a construção da imagem da aplicação em questão. Por exemplo, em nossa aplicação, a imagem base para uma aplicação Node.js é ter o mecanismo Node.js básico instalado.

  • WORKDIR: Esta sintaxe define o diretório de trabalho ativo onde os arquivos da aplicação viverão dentro do contêiner definido. Uma pasta automática será criada se ainda não estiver disponível.

  • COPY: Esta sintaxe é usada para garantir que os arquivos necessários para criar a imagem Docker a partir do arquivo do projeto base de código sejam copiados para o novo contêiner Docker criado. Os diretórios desses arquivos são cuidadosamente destacados.

  • RUN: Esta sintaxe especifica o script que deseja ser executado antes de concluir a containerização da aplicação.

  • ENV: Esta sintaxe é usada para destacar variáveis ambientais e segredos que serão invocados durante o processo de execução da aplicação.

  • EXPOSE: Esta sintaxe mapeia a porta de navegação onde a aplicação é usada para se comunicar com a internet externa. Por exemplo, EXPOSE: 3000 mapeia a interface web da aplicação para localhost:3000.

Adentrando mais no Docker, vamos rapidamente revisar alguns comandos-chave do Docker que estaremos utilizando ao longo deste tutorial:

  • Docker ps: Este comando lista todos os contêineres em execução no seu terminal Docker.

  • Docker run: Este comando executa uma imagem Docker para acionar uma instância de um contêiner.

  • Docker build: Este comando funciona com base no arquivo Docker para gerar uma imagem de um serviço ou aplicação.

  • Docker rm: este comando pode ser usado para excluir uma imagem usando os detalhes de identificação da imagem.

Como Containerizar o Aplicativo

Agora podemos começar a containerizar nossa simples aplicação Node/Express. Para acompanhar o tutorial, você pode obter o código base aqui.

Ao testá-lo localmente, ele retorna uma API CRUD onde você pode criar, buscar, atualizar e excluir produtos quando executado. Vamos empacotar a aplicação para facilitar a implantação na nuvem usando nosso Docker engine. Seremos capazes de fazer isso usando a ferramenta Dockerfile que discutimos anteriormente.

Passo 1: Criar o dockerfile

No seu diretório de projeto, crie um arquivo chamado Dockerfile. Certifique-se de que o nome seja exatamente “Dockerfile” (sem extensão e sensível a maiúsculas e minúsculas em alguns sistemas – então certifique-se de que esteja em maiúsculas).

Se estiver usando um editor de código, simplesmente crie um novo arquivo chamado Dockerfile. Se estiver usando um editor de texto básico, salve o arquivo com o nome Dockerfile e garanta que não seja salvo acidentalmente com uma extensão como .txt.

Em seguida, insira a primeira linha:

FROM Node:18-alpine

Este comando busca a imagem base que usaremos para alimentar nossa aplicação Express, que é o próprio mecanismo Node.

Você pode estar se perguntando para que serve o alpine. Alpine é uma versão compacta e leve de uma imagem Docker. Ele exclui a incorporação de pacotes adicionais que não são diretamente essenciais para o sistema operacional base. É recomendado como uma boa prática padrão usar distribuições leves para uma execução mais rápida e fácil utilização do código.

Passo 2: Definir o diretório de trabalho

WORKDIR /app

Isso define o diretório de trabalho da imagem para a pasta /app do contêiner. Garante que todas as ações de arquivo ocorram aqui e que todos os arquivos sejam copiados para este diretório.

Passo 3: Copie os arquivos necessários

COPY package.json

Este comando copia os arquivos package.json que têm uma lista de dependências e pacotes a serem instalados para alimentar nossa aplicação.

Passo 4: Execute um script de configuração

RUN npm install

Este comando garante que todas as dependências necessárias para alimentar nossas aplicações Node.js sejam instaladas no contêiner.

Passo 5: Copie os arquivos de código

COPY . .

Este comando garante que todos os arquivos dentro do diretório local sejam copiados para o sistema de arquivos do contêiner dentro do diretório de trabalho estabelecido.

Passo 6: Exponha a porta do servidor



EXPOSE 3000

Este comando expõe a porta do servidor que pretendemos usar para acessar o contêiner. Neste caso, é a porta 3000.

Passo 7: Inclua o comando para iniciar o contêiner

CMD ["npm", "run", "dev"]4

Este comando é executado no final para ligar a aplicação Node.js. Simplesmente executa o comando npm run dev, que é o que você usaria para um ambiente de desenvolvimento. Para executá-lo em um ambiente de produção, você usaria o comando npm start em vez disso.

Após completar este processo, aqui está como a estrutura final do Dockerfile deve parecer:

FROM Node:18-alpine
WORKDIR /app

COPY package.json

RUN npm install

COPY . .

CMD ["npm", "run", "dev"]

Testando o contêiner Docker

Para resumir, estaremos criando uma imagem Docker de nossa aplicação Node.js. Para fazer isso, execute o comando docker build -t nodeapp .. O comando docker build constrói a imagem, enquanto o -t permite especificar os detalhes da tag da imagem.

No nosso caso, estamos atribuindo o nome nodeapp à imagem que estaremos criando e a imagem será criada dentro do diretório de trabalho.

Parabéns! Você construiu com sucesso sua primeira imagem Docker. Para ver todas as imagens no seu repositório local, execute o comando docker images.

Para criar uma instância funcional da sua imagem para testes, execute o comando docker run nodeapp.

Estamos usando o Mongo DB como nosso banco de dados para este tutorial, então precisaremos passar a URL do MongoDB como uma variável de ambiente para o contêiner Docker. Variáveis de ambiente ajudam a proteger certas variáveis-chave que não devem ser expostas ao público. Outras variáveis que podem ser passadas como variáveis de ambiente incluem chaves de API e códigos de criptografia.

Para passar a URL do MongoDB para o contêiner Docker, usamos a tag -e para garantir que o Docker reconheça o valor correspondente inserido como uma variável de ambiente.

docker run -e JWT_SECRETS={insira o valor de sua escolha} -e MONGO_URL={A url do mongo de sua escolha} nodeapp.

Para também usar o contêiner em segundo plano, basta anexar a tag -d que representa a opção de desanexar. Essa opção permite que o contêiner seja executado em segundo plano, mesmo ao sair do terminal de linha de comando.

No caso de não haver erros, ao navegar para localhost:5000 também deve produzir algo semelhante à imagem abaixo.

Finalizando

Neste artigo, você aprendeu sobre o que é o Docker e como ele funciona, juntamente com seus comandos comuns e como usá-lo para containerizar uma aplicação backend. Avançando a partir do básico, você também pode explorar outros usos do Docker em integração contínua e desenvolvimento. Para saber mais sobre o Docker, você pode verificar a sua documentação aqui.

Também recomendo usar seu novo conhecimento para implantar projetos com casos de uso da vida real, bem como explorar a rede em aplicações Docker. Para tornar seu aplicativo público, você pode facilmente implantar a imagem Docker que você criou em qualquer um dos populares provedores de serviços em nuvem como AWS, GCP, Azure, e assim por diante.

Sinta-se à vontade para me fazer qualquer pergunta! Você também pode conferir meus outros artigos aqui. Até a próxima, continue codificando!