Imagens, containers e o modelo mental correto
Objetivos desta aula
- Distinguir imagem, container e registry
- Operar o ciclo de vida do container
- Inspecionar o que está rodando
Imagem é um modelo somente-leitura, formado por layers empilhados; container é uma instância em execução desse modelo, com uma camada de escrita própria e efêmera. Registry é onde as imagens ficam guardadas (Docker Hub, GHCR, ECR). Entender isso explica por que dado gravado dentro do container desaparece ao recriá-lo — e por que volumes existem.
Container não é máquina virtual: ele compartilha o kernel do host e isola processos por namespaces e cgroups. Isso o torna leve e rápido, mas também significa que ele não é fronteira de segurança perfeita — daí a importância de não rodar como root e de limitar recursos.
O container vive enquanto seu processo principal (PID 1) vive. Se o processo termina, o container para. Esse é o motivo de tantos containers que 'não sobem': o comando terminou, com sucesso ou com erro, e o Docker apenas obedeceu.
1. Container não é máquina virtual
Uma VM emula hardware e roda um kernel inteiro. Um container é só um processo Linux isolado que compartilha o kernel do host. O isolamento vem de dois recursos do kernel: namespaces (o que o processo enxerga: PIDs, rede, filesystem, hostname) e cgroups (quanto ele pode usar: CPU, memória, I/O). Por isso um container sobe em milissegundos.
2. Imagem vs container
A imagem é um modelo somente leitura, feito de camadas empilhadas. O container é uma instância em execução dessa imagem, com uma camada gravável por cima. Apagou o container? A camada gravável some junto. Por isso dados importantes vão para volumes.
3. Um processo principal por container
O container vive enquanto o processo PID 1 vive. Se o comando principal termina, o container para. Rodar vários serviços num container só (API + banco + cron) quebra esse modelo, dificulta logs e escalonamento.
4. Ciclo de vida na prática
docker run cria e inicia; docker ps lista; docker logs -f acompanha a saída; docker exec -it abre um shell dentro; docker stop envia SIGTERM e, após 10s, SIGKILL; docker rm remove. Sua aplicação deve tratar SIGTERM para encerrar sem perder requisições.
5. Tags e digests
node:20 é uma tag móvel: amanhã pode apontar para outra imagem. O digest (node@sha256:...) é imutável. Em produção, fixe versões específicas e registre o digest do que foi publicado.
6. Checagem final
Você deve explicar namespaces e cgroups, dizer por que dados não ficam no container e mostrar como inspecionar um container em execução.
Na prática
Ciclo de vida e inspeção
bash
docker run -d --name api -p 3000:3000 node:22-alpine sleep 3600
docker ps
docker ps -a # inclui parados
docker logs -f api
docker exec -it api sh # entrar no container
docker inspect api | jq '.[0].State, .[0].NetworkSettings.IPAddress'
docker stats --no-stream
docker stop api && docker rm api
docker image ls && docker system df
docker system prune -f # limpar recursos nao usadosNota de segurança: docker exec com --user root em produção deve ser exceção auditada; prefira depurar por logs e métricas.
Explorar um container por dentro
bash
docker run -d --name web -p 8080:80 --memory 256m nginx:1.27-alpine
docker ps # STATUS Up ...
docker logs -f web # saida do processo principal
docker exec -it web sh -c 'ps aux' # PID 1 e o nginx master
docker inspect web --format '{{.State.Pid}} {{.HostConfig.Memory}}'
docker stats --no-stream web # CPU e memoria usados (cgroups)
docker stop web && docker rm webPor que isso importa
Todo o resto (CI/CD, Kubernetes, GitOps) assume que você entende container. Modelo mental errado aqui contamina tudo.
Erro comum
Guardar dados importantes na camada de escrita do container e perdê-los no próximo deploy.
Dica de produção
Trate containers como descartáveis: nada essencial dentro, tudo em volume ou serviço externo.
Pergunta de entrevista
Por que um container para imediatamente após iniciar?
Glossário
- layer
- Camada imutável da imagem, reaproveitada em cache e entre imagens.
- cgroups
- Mecanismo do kernel que limita CPU, memória e I/O de um grupo de processos.
- namespace
- Recurso do kernel que isola o que um processo enxerga (PIDs, rede, montagem).
- cgroup
- Recurso do kernel que limita e mede CPU, memória e I/O de processos.
- digest
- Hash sha256 que identifica uma imagem de forma imutável.
- PID 1
- Processo principal do container; quando termina, o container para.
Conexão com o CloudShop
Rodar a API do CloudShop em container pela primeira vez.
Quiz da aula
1. O que acontece com os dados escritos dentro do container ao removê-lo?
2. O que um container compartilha com o host?
3. Por que usar digest em produção?
Minhas anotações
Salvo automaticamente neste navegador.