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



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.

BASH
# 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.

100%
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

BASH
# 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 ⭐)

BASH
# 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
BASH
# 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
💡 Dica: Em ambientes de produção, use 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 ⭐⭐)

BASH
# 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
⚠️ Nota: Contêineres pausados ainda consomem memória e portas, portanto não devem ser deixados pausados por longos períodos. Use docker stop quando precisar liberar recursos.



6. Visualizando Logs de Contêineres

▶ Exemplo: Monitoramento de Logs de Contêiner em Tempo Real (Dificuldade: ⭐⭐)

BASH
# 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
💻 Saída:

TEXT 📖 Somente leitura
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: ⭐⭐)

BASH
# 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
💻 Saída:

TEXT 📖 Somente leitura
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: ⭐)

BASH
# Listar processos em execução dentro de um contêiner
docker top web
💻 Saída:

TEXT 📖 Somente leitura
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: ⭐⭐)

BASH
# 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}}'
💻 Saída:

TEXT 📖 Somente leitura
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: ⭐⭐)

BASH
# 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
💡 Dica: 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

BASH
# ============================================
# 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
💻 Saída (trecho):

TEXT 📖 Somente leitura
# 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 com docker rm — a menos que um volume seja montado.

P: Qual é a diferença entre docker stop e docker kill? R: stop envia 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. kill envia um sinal SIGKILL imediatamente para encerrar o processo. Em um ambiente de produção, use stop sempre que possível; use kill apenas quando o contêiner não responder.

P: Como posso configurar um contêiner para reiniciar automaticamente após travar? R: Adicione --restart=always ou --restart=unless-stopped ao 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, use docker exec -it <contêiner> sh. Você também pode usar docker attach para 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


📝 Exercícios

  1. Exercício Básico (Dificuldade: ⭐): Após iniciar o contêiner Nginx, pare-o usando docker stop, depois reinicie-o usando docker start e registre as alterações de status exibidas por docker ps -a após cada operação.
  2. Exercício Avançado (Dificuldade: ⭐⭐): Use docker logs --tail 50 -f para visualizar os logs do contêiner Nginx em tempo real. Visite http://localhost:8080 10 vezes no seu navegador e observe as entradas de requisição nos logs.
  3. Desafio (Dificuldade: ⭐⭐⭐): Use docker exec -it para acessar o contêiner Nginx, modifique o conteúdo de /usr/share/nginx/html/index.html e 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?
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%