Docker: Gerenciamento do Ciclo de Vida de Contêineres
Última atualização: 2026-08-26
Contêineres, como processos, têm um ciclo de vida completo — entender as transições de estado dos contêineres e os comandos operacionais é uma habilidade fundamental para operações Docker.
1. O Que Você Vai Aprender
- Os Seis Estados de um Contêiner e Suas Transições
- Operações de Iniciar/Parar/Reiniciar
- A Diferença Entre Pausar e Retomar
- Visualizando e Filtrando Logs de Contêineres
- Solução de Problemas de Processos e Recursos de Contêineres
2. Uma História Real de uma Pessoa Engenheira de Operações
(1) Ponto de Dor: Contêineres de produção travam de madrugada
O contêiner de produção de Charlie travou repentinamente às 3 da manhã. Um alerta de monitoramento disparou, mas Charlie não sabia por que o contêiner havia saído — foi um erro OOM? Uma exceção da aplicação? Ou foi encerrado manualmente? Ele precisava solucionar rapidamente o problema sem precisar reconstruir o contêiner.
(2) Soluções para Registro e Monitoramento
docker logs mostrou um erro OOM, e docker stats confirmou o estouro de memória.
# Verificar logs de saída do contêiner
docker logs --tail 50 myapp
# Verificar uso de recursos do contêiner
docker stats --no-stream
(3) Benefício: Identificar a causa raiz em 5 minutos
Charlie detectou um erro "Out of memory" usando docker logs, docker inspect confirmou que o código de saída era 137 (OOM Kill), e o contêiner voltou ao normal após ajustar o parâmetro --memory. Levou apenas 5 minutos do alerta até a resolução.
3. Os Seis Estados de um Contêiner
Da criação à exclusão, um contêiner passa por seis estados.
stateDiagram-v2
[*] --> Created : docker create
Created --> Running : docker start
Created --> Running : docker run
Running --> Paused : docker pause
Paused --> Running : docker unpause
Running --> Stopped : docker stop / Ctrl+C
Running --> Stopped : docker kill
Stopped --> Running : docker start
Running --> Restarting : Falha do processo + política de reinicialização
Restarting --> Running : Reinicialização bem-sucedida
Restarting --> Stopped : Reinicialização falha
Running --> Dead : Erro irrecuperável
Stopped --> [*] : docker rm
Dead --> [*] : docker rm
(1) Explicação Detalhada dos Estados
| Estado | Descrição | Gatilhos Comuns |
|---|---|---|
| Created | Criado mas não iniciado | docker create / docker run (ainda não iniciado) |
| Running | Em execução | docker start / docker run -d |
| Paused | Pausado (processo congelado) | docker pause |
| Stopped | Parado (Encerrado) | docker stop / docker kill / processo encerrado |
| Restarting | Reiniciando | Falha do contêiner + política de reinicialização acionada |
| Dead | Irrecuperável | Erro interno do Docker (extremamente raro) |
(2) Visualizar status do contêiner
# Listar contêineres em execução (somente estado Running)
docker ps
# Listar todos os contêineres (todos os estados)
docker ps -a
# Filtrar por status
docker ps -a --filter "status=exited"
docker ps -a --filter "status=running"
4. Iniciar, Parar e Reiniciar
▶ Exemplo:iniciar / parar / reiniciar(Dificuldade ⭐)
# Criar e iniciar um contêiner
docker run -d --name web -p 8080:80 nginx:latest
# Parar o contêiner (desligamento gracioso)
docker stop web
# Iniciá-lo novamente
docker start web
# Reiniciar (parar + iniciar em um comando)
docker restart web
# Verificar status após cada operação
docker ps -a --filter name=web
(1) docker stop vs docker kill
| Dimensão | docker stop |
docker kill |
|---|---|---|
| Sinal | SIGTERM → Período de tolerância → SIGKILL | SIGKILL(padrão) |
| Elegante | ✅ Dá à aplicação 30 segundos para limpar | ❌ Força a saída imediatamente |
| Segurança de Dados | A aplicação pode gravar dados e fechar a conexão | Dados que não foram gravados podem ser perdidos |
| Tempo de Espera | Padrão 30 segundos (-t ajustável) |
Sem espera |
| Casos de Uso | Desligamento Normal | Encerramento Forçado Quando o Contêiner Não Responde |
# Parada graciosa com tempo limite personalizado (60 segundos)
docker stop -t 60 web
# Forçar encerramento imediato
docker kill web
# Enviar um sinal personalizado
docker kill -s SIGUSR1 web
docker stop por padrão; use docker kill apenas se o contêiner não responder. A aplicação deve tratar adequadamente o sinal SIGTERM para garantir um desligamento gracioso.
5. Pausando e Retomando
▶ Exemplo:pause / unpause(Dificuldade ⭐⭐)
# Pausar o contêiner (congelar todos os processos)
docker pause web
# Verificar: o status deve ser "Paused"
docker ps -a --filter name=web
# Retomar o contêiner
docker unpause web
(1) docker pause vs docker stop
| Dimensão | docker pause |
docker stop |
|---|---|---|
| Mecanismo | Congelar processo (cgroup freeze) | Enviar um sinal SIGTERM |
| Memória | Permanece na memória | A memória é liberada |
| Velocidade de Recuperação | Imediata (descongelar) | Requer reinício do processo |
| Porta em Uso | Ainda em Uso | Liberada |
| Casos de Uso | Liberar temporariamente recursos de CPU, depuração | Desligar o serviço normalmente |
docker stop quando precisar liberar recursos.
6. Visualizando Logs de Contêineres
▶ Exemplo: Monitoramento de Logs de Contêiner em Tempo Real (Dificuldade: ⭐⭐)
# Acompanhar logs em tempo real
docker logs -f web
# Mostrar as últimas 100 linhas
docker logs --tail 100 web
# Mostrar logs das últimas 2 horas
docker logs --since 2h web
# Mostrar logs entre horários específicos
docker logs --since "2024-01-15T10:00:00" --until "2024-01-15T12:00:00" web
10.0.0.1 - - [15/Jan/2024:10:05:22 +0000] "GET / HTTP/1.1" 200 615
10.0.0.1 - - [15/Jan/2024:10:05:23 +0000] "GET /favicon.ico HTTP/1.1" 404 555
(1) Tabela de Referência Rápida de Parâmetros de Log
| Parâmetro | Função | Exemplo |
|---|---|---|
-f / --follow |
Acompanhamento em Tempo Real | docker logs -f web |
--tail N |
Mostrar as últimas N linhas | --tail 100 |
--since |
Exibir logs a partir de um horário específico | --since 2h / --since "2024-01-15" |
--until |
Exibir logs anteriores a um determinado horário | --until 30m |
-t / --timestamps |
Mostrar timestamp | docker logs -t web |
7. Monitoramento de Recursos e Solução de Problemas do Contêiner
▶ Exemplo: Monitoramento em Tempo Real de Recursos do Contêiner (Dificuldade: ⭐⭐)
# Estatísticas de recursos em tempo real para todos os contêineres
docker stats
# Captura única (sem streaming)
docker stats --no-stream
# Estatísticas para um contêiner específico
docker stats web --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a1b2c3d4e5f6 web 0.02% 4.2MiB / 512MiB 0.82% 1.2kB / 0B 0B / 0B 9
▶ Exemplo: Visualizando processos dentro de um contêiner (Dificuldade: ⭐)
# Listar processos em execução dentro de um contêiner
docker top web
UID PID PPID C STIME TTY TIME CMD
root 1234 5678 0 10:05 ? 00:00:00 nginx: master process
www 1235 1234 0 10:05 ? 00:00:00 nginx: worker process
▶ Exemplo: Visualizando Configuração Detalhada do Contêiner (Dificuldade: ⭐⭐)
# Configuração completa do contêiner (JSON)
docker inspect web
# Extrair campos específicos
docker inspect web --format='{{.State.Status}}'
docker inspect web --format='{{.State.ExitCode}}'
docker inspect web --format='{{.NetworkSettings.IPAddress}}'
docker inspect web --format='{{.HostConfig.Memory}}'
running
0
172.17.0.2
536870912
8. Entrar em um Contêiner em Execução
▶ Exemplo: Entrando em um contêiner usando docker exec (Dificuldade: ⭐⭐)
# Abrir um shell interativo dentro de um contêiner em execução
docker exec -it web bash
# Executar um único comando dentro do contêiner
docker exec web cat /etc/nginx/nginx.conf
# Copiar arquivos do contêiner para o host
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
docker exec não cria um novo contêiner; em vez disso, inicia um novo processo dentro de um contêiner em execução. Isso é adequado para depuração e operações temporárias. Evite depender de docker exec em ambientes de produção — use montagens de volume e coleta de logs em vez disso.
9. Exemplo Completo: Simulando Solução de Problemas de Contêiner
# ============================================
# Passo a passo completo: Diagnóstico de falha de contêiner
# Abrange: executar, travar, logs, inspect, corrigir, reiniciar
# ============================================
# 1. Iniciar um contêiner com memória limitada
docker run -d \
--name crash-test \
--memory=50m \
--restart=on-failure:3 \
nginx:latest
# 2. Verificar se está em execução
docker ps --filter name=crash-test
# 3. Simular pressão de memória de dentro do contêiner
docker exec -it crash-test bash -c "dd if=/dev/zero of=/tmp/bigfile bs=1M count=100"
# 4. O contêiner pode ser encerrado por OOM, verificar status
docker ps -a --filter name=crash-test
# 5. Verificar o código de saída (137 = OOM Kill)
docker inspect crash-test --format='ExitCode: {{.State.ExitCode}}, OOMKilled: {{.State.OOMKilled}}'
# 6. Verificar logs para o motivo da falha
docker logs --tail 20 crash-test
# 7. Verificar eventos Docker para OOM
docker events --filter event=oom --since 5m
# 8. Corrigir: aumentar limite de memória (precisa recriar)
docker stop crash-test
docker rm crash-test
docker run -d \
--name crash-test \
--memory=256m \
--restart=on-failure:3 \
nginx:latest
# 9. Verificar a correção
docker ps --filter name=crash-test
docker stats crash-test --no-stream
# docker inspect --format
ExitCode: 137, OOMKilled: true
# docker events
2024-01-15T10:05:22Z container oom crash-test...
# Após correção
CONTAINER ID IMAGE STATUS NAMES
b2c3d4e5f6a7 nginx:latest Up 10 seconds crash-test
❓ Perguntas Frequentes
P: Os dados ainda estão lá depois que o contêiner para? R: Sim. Parar o contêiner meramente pausa o processo; o sistema de arquivos permanece no disco. Você pode restaurá-lo usando
docker start. No entanto, os dados serão perdidos após excluir o contêiner comdocker rm— a menos que um volume seja montado.
P: Qual é a diferença entre
docker stopedocker kill? R:stopenvia um sinal SIGTERM, dando à aplicação 30 segundos para desligar graciosamente (para concluir gravações e fechar conexões); se expirar, envia um sinal SIGKILL.killenvia um sinal SIGKILL imediatamente para encerrar o processo. Em um ambiente de produção, usestopsempre que possível; usekillapenas quando o contêiner não responder.
P: Como posso configurar um contêiner para reiniciar automaticamente após travar? R: Adicione
--restart=alwaysou--restart=unless-stoppedao iniciar o contêiner. "always" reinicia o contêiner independentemente do motivo do encerramento; "unless-stopped" impede a reinicialização automática após uma parada manual.unless-stoppedé recomendado para serviços web em produção.
P: O que devo fazer se os arquivos de log do contêiner forem muito grandes? R: O driver de log padrão do Docker,
json-file, não rotaciona logs automaticamente, então os logs podem crescer indefinidamente. Configure limites de log na inicialização:docker run --log-opt max-size=10m --log-opt max-file=3, que limita cada arquivo de log a 10 MB e retém no máximo 3 arquivos.
P: Como entro em um contêiner em execução? R:
docker exec -it <contêiner> bash(ou sh). Este é o método de depuração mais comum. Se o contêiner não tiver bash, usedocker exec -it <contêiner> sh. Você também pode usardocker attachpara conectar, mas ele se conecta ao stdin do processo principal, e pressionar Ctrl+C irá parar o contêiner, então geralmente não é usado.
P: O que significa o código de saída 137? R: 137 = 128 + 9, onde 9 é o número do sinal para SIGKILL. Quando um contêiner é encerrado pelo OOM Killer, o código de saída é 137. Outros códigos de saída comuns: 0 = saída normal, 1 = erro da aplicação, 2 = uso incorreto de comando, 125 = erro do daemon Docker.
📖 Resumo
- Contêineres têm seis estados: Created / Running / Paused / Stopped / Restarting / Dead
docker stopDesligamento gracioso (SIGTERM),docker killEncerramento forçado (SIGKILL)docker pauseCongela o processo e retém memória;docker stopLibera memóriadocker logsSuporta acompanhamento em tempo real com-f, filtragem por tempo com--since/--untile limites de linhas com--taildocker statsMonitora recursos,docker topVisualiza processos,docker inspectVisualiza configuração- Código de saída 137 = OOM Kill, uma pista-chave para solucionar problemas de contêineres
📝 Exercícios
- Exercício Básico (Dificuldade: ⭐): Após iniciar o contêiner Nginx, pare-o usando
docker stop, depois reinicie-o usandodocker starte registre as alterações de status exibidas pordocker ps -aapós cada operação. - Exercício Avançado (Dificuldade: ⭐⭐): Use
docker logs --tail 50 -fpara visualizar os logs do contêiner Nginx em tempo real. Visitehttp://localhost:808010 vezes no seu navegador e observe as entradas de requisição nos logs. - Desafio (Dificuldade: ⭐⭐⭐): Use
docker exec -itpara acessar o contêiner Nginx, modifique o conteúdo de/usr/share/nginx/html/index.htmle então visite a página no seu navegador para confirmar que as alterações tiveram efeito. Pense: As alterações serão retidas após o contêiner ser excluído? Como você pode tornar as alterações persistentes?