pular para o conteúdo
voltar ao mapa
técnica
etapa: foundations
2 min de leitura

Contêineres e imagens

Um contêiner empacota uma aplicação com suas dependências e a executa isolada do host. Uma boa imagem é pequena, determinística e roda como usuário não root.

Docker / PodmanBuildKitTrivyHadolintDivecontainer registries

Como os contêineres funcionam

  • Um contêiner é um processo Linux comum com sua própria visão do sistema de arquivos, da rede e da tabela de processos (namespaces) e com recursos limitados (cgroups). Ele compartilha o kernel do host, ao contrário de uma máquina virtual.
  • Uma imagem é uma pilha de camadas somente leitura mais metadados. Um contêiner adiciona uma fina camada gravável por cima.
  • Um registry armazena imagens por nome e tag; um digest (sha256) identifica o conteúdo exato e nunca muda.
  • Contêineres são feitos para ser descartáveis: o estado fica em volumes, bancos de dados ou object storage, não dentro do contêiner.

Um Dockerfile fraco

Problemas: uma tag flutuante muda sem aviso, o diretório inteiro (incluindo .git e .env) é copiado, dependências de desenvolvimento e ferramentas de build vão para produção, não há cache de camadas e o processo roda como root.

Dockerfile (antes)dockerfile
FROM node:latest
COPY . .
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]

Um melhor

Use uma base fixada, um build multi-stage, instalação a partir do lockfile, um usuário não root e um arquivo de ignore.

Dockerfile (depois)dockerfile
# estágio de build: tem os compiladores e as dependências de desenvolvimento
FROM node:22-slim@sha256:<digest-you-reviewed> AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build && npm prune --omit=dev

# estágio de runtime: só o que a aplicação precisa
FROM node:22-slim@sha256:<digest-you-reviewed>
ENV NODE_ENV=production
WORKDIR /app
COPY --from=build --chown=node:node /app/dist ./dist
COPY --from=build --chown=node:node /app/node_modules ./node_modules
USER node
EXPOSE 3000
HEALTHCHECK CMD node -e "fetch('http://localhost:3000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
CMD ["node", "dist/server.js"]
.dockerignoretext
.git
node_modules
.env
*.log
coverage

Hábitos

  • Reconstrua e reimplante regularmente: imagens não se atualizam sozinhas.
  • Faça scan das imagens no CI e falhe diante de achados sérios que você possa corrigir.
  • Um processo por contêiner, logs para o stdout, configuração por ambiente ou arquivos montados.
  • Marque com o commit e faça deploy por digest, para que o rollback seja exato.
  • Mantenha as imagens pequenas: menos pacotes, menos vulnerabilidades, pulls mais rápidos.

conexões no mapa

atualizado em 14/10/2026 · fontes para aprofundar · reportar erro

em outros domínios

Estude antes

Desbloqueia

teste o que entendeu

Carregando perguntas…