Ao longo dos anos, aplicativos e ferramentas se tornaram mais complexos para acompanhar as mudanças nas necessidades e expectativas das pessoas. Mas isso pode criar problemas de compatibilidade de código e acesso remoto. Por exemplo, uma base de código que funciona corretamente no Windows pode desenvolver erros de compatibilidade ao ser instalada no Linux.
Felizmente, o Docker vem para o resgate. Mas você pode estar se perguntando – o que é o Docker e como ele ajuda? Você aprenderá tudo isso e mais neste tutorial.
Mas antes de começarmos, aqui estão alguns pré-requisitos:
-
Conhecimento de comandos Linux
-
Conhecimento de uso de terminal
-
Conhecimento de Node.js e Express.js
Índice
O que é o Docker?
Docker é uma ferramenta de código aberto que facilita a execução de software de maneira 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) dentro de 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, funcionando exatamente da mesma forma no seu laptop, em um servidor ou na nuvem. O Docker ajuda os desenvolvedores a evitar o problema do “funciona na minha máquina” garantindo que tudo esteja empacotado 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 e rede de aplicações.
Antes de prosseguirmos, aqui estão alguns termos-chave que você encontrará enquanto avançamos neste tutorial:
Docker Engine
O mecanismo Docker, como o nome sugere, é a força motriz para aplicativos Docker. Ele possui um componente cliente e um servidor. O cliente Docker, neste caso, é a ferramenta de interface de linha de comando ou terminal Docker que usaremos para enviar os comandos relevantes para a execução do projeto. O servidor Docker, popularmente conhecido como daemon, é o servidor que gerencia a execução das várias imagens e contêineres 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 que vão desde modelos de sistemas operacionais até modelos de servidores, modelos de software, e assim por diante. Você pode encontrar todas essas imagens no registro 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.
Contêineres Docker
Os contêineres Docker são instâncias compactas e executáveis construídas com base no modelo gerado, que é a imagem Docker. Eles são pacotes leves e portáteis que incluem tudo o que é necessário para executar um software—código, tempo de execução, bibliotecas e ferramentas do sistema. Um contêiner garante que o aplicativo seja executado de forma consistente, independentemente do ambiente.
Benefícios de Usar Docker
Aqui estão alguns dos benefícios de usar Docker como desenvolvedor de backend:
-
Docker é uma ótima ferramenta para criar uma cultura DevOps sólida 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 de backend monolíticos distribuídos.
-
Também minimiza erros de configurações de dependência durante instalações, pois porta o aplicativo com suas dependências necessárias de uma só vez.
Seguindo adiante, 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). Para este tutorial, destacarei apenas como configurar o Docker no Windows.
Se você estiver usando um sistema operacional diferente do Windows, pode configurar o Docker facilmente seguindo as etapas 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 habilitado.
Com isso, vamos prosseguir para baixar o instalador executável do Docker. Você pode baixar o instalador mais recente do Docker aqui. Depois de fazer isso, execute o software e aceite os termos e condições. Após a conclusão bem-sucedida, inicie o aplicativo. Isso é o que você deverá ver:
Para confirmar que você instalou o aplicativo com sucesso, acesse o 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 avançar para o projeto propriamente dito.
Projeto de Demonstração: Como Containerizar uma Aplicação Node.js
Nesta seção, estaremos containerizando um serviço de backend simples 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 aplicativos 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 o aplicativo de exemplo Node.js. Eu fornecerei toda a configuração do código neste artigo, abaixo. Mas primeiro, vamos entender o que é um dockerfile.
O que é um Dockerfile?
Básicamente, um Dockerfile é um sistema de modelo que permite ao usuário inserir comandos que, quando executados, podem produzir uma imagem funcional do aplicativo. Essa 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 iniciar. Pode ser sobrescrito fornecendo um comando ao executar o contêiner (docker run ...
). -
ENTRYPOINT
: Especifica o comando principal que sempre é executado quando o contêiner inicia. Não é facilmente sobrescrito, mas argumentos podem ser adicionados.
Nota queCMD
eENTRYPOINT
ambos especificam qual comando ou processo o contêiner deve executar quando inicia. Mas eles são usados de maneira diferente e têm propósitos distintos. UseCMD
para comportamento padrão que pode ser sobrescrito. UseENTRYPOINT
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 fundação para construir a imagem da aplicação em questão. Por exemplo, em nossa aplicação, a imagem base para uma aplicação Node.js é ter o motor Node.js básico instalado. -
WORKDIR
: Esta sintaxe define o diretório de trabalho ativo onde os arquivos da aplicação estarã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 de 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 você deseja executar 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 exemploEXPOSE: 3000
mapeia a interface web da aplicação paralocalhost:3000
.
Profundando no Docker, vamos rapidamente revisar alguns comandos-chave do Docker que estaremos usando 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 iniciar 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 deletar produtos quando executado. Vamos empacotar a aplicação para fácil implantação na nuvem usando nosso motor Docker. Conseguiremos fazer isso usando a ferramenta Dockerfile que discutimos acima.
Passo 1: Crie o dockerfile
Na sua pasta do projeto, crie um arquivo chamado Dockerfile
. Certifique-se de que o nome seja exatamente “Dockerfile” (sem extensão e sensível a maiúsculas em alguns sistemas – então, certifique-se de que esteja em maiúsculas).
Se você estiver usando um editor de código, basta criar um novo arquivo chamado Dockerfile
. Se você estiver usando um editor de texto básico, salve o arquivo com o nome Dockerfile
e certifique-se de que ele 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 motor Node.
Você pode estar se perguntando para que serve o alpine
. Alpine é uma versão leve e muito mais compacta de uma imagem Docker. Ela exclui a incorporação de pacotes adicionais que não são diretamente essenciais para o sistema operacional base. É defendido como uma boa prática de codificação padrão usar distribuições leves para execução mais rápida e fácil utilização.
Passo 2: Defina o diretório de trabalho
WORKDIR /app
Isso define o diretório de trabalho da imagem para a pasta /app
do contêiner. Isso garante que todas as ações de arquivo ocorram aqui e que todos os arquivos sejam copiados para este diretório.
Passo 3: Copiar os arquivos necessários
COPY package.json
Este comando copia os arquivos package.json
que contêm uma lista de dependências e pacotes a serem instalados para alimentar nossa aplicação.
Passo 4: Executar 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 estejam instaladas no contêiner.
Passo 5: Copiar 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: Expor 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: Incluir o comando para ativar o contêiner
CMD ["npm", "run", "dev"]4
Este comando é executado no final para ativar a aplicação Node.js. Ele 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 concluir 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
cria 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 em seu repositório local, execute o comando docker images
.
Para criar uma instância de trabalho de sua imagem para testes, execute o comando docker run nodeapp
.
Estamos usando o MongoDB 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 adicionar a tag -d
, que representa a opção de desanexar. Essa opção permite que o contêiner seja executado em segundo plano mesmo após sair do terminal de linha de comando.
Na ausência de 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 um aplicativo de backend. Avançando além do básico, você também pode explorar outros usos do Docker em integração e desenvolvimento contínuos. Para saber mais sobre o Docker, você pode verificar a documentação aqui.
Também recomendaria usar seu novo conhecimento para implantar projetos com casos de uso da vida real, bem como explorar redes em aplicações Docker. Para tornar seu aplicativo ao vivo, você pode facilmente implantar a imagem Docker que você criou em qualquer um dos provedores de serviços em nuvem populares 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!
Source:
https://www.freecodecamp.org/news/containerize-a-nodejs-application-using-docker/