9 dicas avançadas de Docker para desenvolvedores Node.js
11 de abril de 2024
0 minutos de leitura
Se você passa bastante tempo na linha de comando trabalhando localmente com imagens e contêineres Docker para criá-los e testá-los, talvez queira conhecer alguns comandos avançados do Docker.
Vamos pular o básico e partir direto para comandos menos conhecidos, mas muito eficazes, que podem melhorar bastante sua experiência com Docker.
Você se preocupa com a segurança dos seus contêineres Docker? Antes de mergulharmos nos detalhes dos comandos do Docker, é fundamental reconhecer a importância da segurança de contêineres. É aí que a Snyk entra em cena. A Snyk oferece soluções de segurança robustas para aplicações em contêineres, ajudando você a identificar e corrigir vulnerabilidades nos seus contêineres e dependências. Comece integrando a Snyk ao seu fluxo de trabalho para reforçar a segurança.
Como acessar o shell de um contêiner Docker?
Muitas vezes, é necessário depurar problemas no contêiner, por exemplo, inspecionar logs e a estrutura do sistema de arquivos ou atender a outros requisitos para validar ou confirmar uma hipótese específica. Em outras ocasiões, você pode querer explorar o interior de uma imagem Docker criada localmente.
Você pode fazer isso usando os argumentos de linha de comando do comando `docker run` para executar um shell interativo. Primeiro, inicie um contêiner, execute um shell e vincule a interação do terminal a ele.
Veja como abrir um shell para uma imagem Docker do Node.js com o comando run do Docker:
Você pode fazer isso desde que o `Dockerfile` da imagem Docker não especifique um `ENTRYPOINT`.
Como descobrir a versão da imagem Docker do Node.js?
Confira este truque para descobrir qual versão do runtime do Node.js está instalada na sua imagem Docker. Essa informação é essencial para verificar a compatibilidade, depurar problemas e garantir um comportamento consistente em diferentes ambientes.
Execute o comando a seguir (considerando que o programa de análise de JSON `jq` esteja instalado):
O comando exibe as variáveis de ambiente da imagem Docker, incluindo a versão do Node.js. Por exemplo, você pode ver:
Como usar imagens Docker otimizadas para Apple M1?
O Docker evoluiu para oferecer suporte à arquitetura ARM, que é a base do chip M1, e disponibiliza imagens de contêiner especializadas e otimizadas para essa arquitetura. Elas garantem maior compatibilidade e desempenho mais rápido em máquinas M1, o que é útil, já que muitos desenvolvedores usam notebooks da Apple atualmente.
Primeiro, talvez você queira verificar a arquitetura da imagem. Antes de executar um contêiner, confirme se a arquitetura é compatível. Este comando ajuda a verificar se você está usando uma imagem otimizada para M1:
Ao baixar imagens do registro Docker Hub, convém garantir que elas sejam otimizadas para M1:
Se você também faz parte de uma equipe que cria imagens Docker e as publica em um registro privado ou público, convém garantir que as imagens de contêiner sejam criadas especificamente para M1. Assim, elas funcionarão sem problemas em diferentes arquiteturas de CPU e terão compatibilidade mais ampla:
Identifique mudanças em um contêiner com o Docker diff
O comando `docker diff` mostra as mudanças feitas no sistema de arquivos de um contêiner Docker desde a sua criação. Ele revela os arquivos ou diretórios que foram adicionados, modificados ou excluídos.
Veja como usar o comando:
Esse comando retorna uma lista das mudanças feitas no contêiner Docker. Para cada mudança, o Docker indica se o arquivo ou diretório foi adicionado (A), modificado (C) ou excluído (D).
O comando `docker diff` pode ser útil, por exemplo, se você atualizou algumas dependências no arquivo `package.json` e quer verificar exatamente o que mudou no diretório `node_modules` de um contêiner Docker do Node.js. Execute o comando `docker diff` para identificar as mudanças.
Como o `docker diff` ajuda a identificar vulnerabilidades de segurança
O comando `docker diff` também pode ser uma ferramenta poderosa no seu kit de segurança. Ele oferece uma visão rápida das mudanças feitas no sistema de arquivos do contêiner Docker, que podem revelar alterações não autorizadas ou atividades suspeitas.
Por exemplo, se você notar mudanças inesperadas nos arquivos da sua aplicação Node.js, isso pode indicar uma violação de segurança ou a exploração de uma vulnerabilidade. Ao incluir o `docker diff` nas verificações de rotina ou até mesmo no processo de CI/CD, você pode reforçar a segurança da aplicação e garantir que os contêineres Docker estejam funcionando como esperado.
Por isso, você pode usar o comando `docker diff` para fazer uma auditoria de segurança dos seus contêineres Docker. Comparando o estado atual do contêiner com a imagem original, é possível identificar desvios que possam representar um risco à segurança.
Analise imagens de contêiner Docker em busca de vulnerabilidades e gere um SBOM
A Snyk é uma plataforma de segurança que oferece um plano gratuito permanente, criado para ajudar desenvolvedores com a segurança de aplicações. No caso do Docker, a Snyk pode analisar suas imagens Docker em busca de vulnerabilidades e fornecer um relatório completo com recomendações práticas para corrigi-las.
Para analisar a imagem Docker de um projeto Node.js, primeiro confira se a Snyk CLI (interface de linha de comando) está instalada. Caso não esteja, você pode instalá-la com o npm executando:
Agora, suponha que você tenha uma imagem Docker da sua aplicação Node.js chamada `my-nodejs-app`. Você pode analisá-la com a Snyk usando o comando a seguir:
Esse comando instrui a Snyk a testar a imagem Docker chamada `my-nodejs-app` em busca de vulnerabilidades conhecidas. Após a análise, a Snyk apresentará uma lista das vulnerabilidades encontradas na imagem, ordenadas por nível de gravidade:
Outro ótimo recurso da Snyk é a capacidade de gerar um inventário de materiais de software (SBOM) para sua imagem Docker. Um SBOM é uma lista de todos os componentes da imagem, incluindo todas as dependências e suas versões. Isso é muito útil para acompanhar o que há na imagem Docker e identificar possíveis vulnerabilidades.
Veja como gerar um SBOM para sua imagem Docker usando a Snyk:
Como obter o ID SHA da imagem Docker?
É fundamental usar o ID SHA da imagem Docker para referenciar suas imagens Docker com precisão — especialmente em scripts automatizados ou para garantir a consistência entre ambientes. Esse identificador é exclusivo de cada imagem e versão, oferecendo mais precisão do que as tags.
Esse comando lista todas as suas imagens Docker com seus hashes SHA256 completos. O ID SHA é exibido na coluna 'IMAGE ID':
Caso de uso: fixar uma imagem no Docker Compose
Ao especificar uma imagem em um arquivo do Docker Compose, você pode usar o ID SHA em vez da tag para fixar a imagem em uma versão específica. Assim, você sempre usa exatamente a versão da imagem com a qual testou sua aplicação, evitando mudanças inesperadas caso a tag da imagem seja atualizada.
Usar o ID SHA nos comandos do Docker traz consistência e confiabilidade, essenciais para ambientes de produção e pipelines de CI/CD.
Como descobrir o endereço IP do contêiner Docker?
Ao executar aplicações Node.js com frameworks como NestJS, Express ou Fastify em contêineres Docker, muitas vezes é necessário saber o endereço IP do contêiner.
Essa informação pode ser essencial para depurar problemas, analisar logs ou se conectar ao servidor web em execução dentro do contêiner.
Como inspecionar processos filhos do Node.js dentro de um contêiner Docker?
Como os desenvolvedores de Node.js podem obter mais informações sobre seus aplicativos em contêineres para monitorá-los e solucionar problemas com mais eficiência, além de verificar se o processo está usando mais memória ou CPU do que o esperado?
Use este comando do Docker:
Ao trabalhar com aplicações Node.js em contêineres Docker, especialmente as que usam processos filhos (comuns em aplicações que usam clusters, workers ou iniciam subprocessos para executar tarefas), é essencial poder inspecionar esses processos para fins de depuração e monitoramento.
Consulte os metadados de imagens de contêiner Node.js na API do Docker Registry
Às vezes, você precisa de informações detalhadas sobre a imagem de contêiner do Node.js, e consultar diretamente a API do Docker Hub é uma maneira eficaz de obtê-las.
Essa abordagem fornece metadados abrangentes sobre a imagem, que podem ser essenciais para entender detalhes da versão, dependências e outros atributos importantes.
Use o comando a seguir: ele usa o programa `curl` para fazer a solicitação HTTP e o `jq` para formatar a resposta como JSON com indentação legível:
Veja o que você pode esperar da resposta:
Detalhes da imagem: informações como tamanho, digest, arquitetura e muito mais.
Informações sobre as camadas: entenda como a imagem é construída.
Detalhes da tag: dados específicos sobre a tag 'latest'.
Esse recurso é útil, por exemplo, em scripts automatizados que integram o comando a pipelines de CI/CD para fazer verificações e atualizações automaticamente, além de acompanhar versões e garantir que você esteja usando a versão da imagem Node.js adequada às necessidades do seu projeto.
Chegamos ao fim!
Exploramos diferentes cenários, desde a resolução de inconsistências entre versões e gargalos de desempenho até a otimização das operações do dia a dia no seu ecossistema Docker.
Para concluir, este post buscou apresentar um conjunto de comandos avançados do Docker, que vai além do básico com docker run e docker ps. Estas dicas avançadas para profissionais de DevOps e desenvolvimento têm o objetivo de agilizar a solução de problemas, a depuração e o gerenciamento de contêineres.
Ao incorporar essas ideias e comandos ao seu fluxo de trabalho, lembre-se de que dominar o Docker é um processo contínuo. Se você desenvolve em Node.js, continue aprendendo com estas 10 práticas recomendadas para conteinerizar aplicações web Node.js com Docker. Se você desenvolve em Java, confira o artigo de Brian Vermeer: 10 práticas recomendadas para criar contêineres Java com Docker.
Segurança de contêineres que prioriza os desenvolvedores
O Snyk encontra e corrige automaticamente vulnerabilidades em imagens de contêiner e workloads do Kubernetes.
