Como usar o comando docker system events para monitorar a atividade do Docker

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como monitorar efetivamente a atividade do Docker usando o comando docker system events. Você começará ouvindo eventos Docker em tempo real gerados por ações como pulling de imagens e execução de containers.

Posteriormente, você explorará como filtrar esses eventos com base em vários critérios. Isso inclui filtrar por tempo usando as flags --since e --until, filtrar por tipo de objeto e ação usando a flag --filter, e combinar múltiplos filtros para um monitoramento mais específico. Finalmente, você aprenderá como formatar a saída dos eventos para melhor legibilidade e análise usando a flag --format.

Ouvir eventos Docker em tempo real

Nesta etapa, você aprenderá como ouvir eventos Docker em tempo real. Eventos Docker são gerados pelo daemon Docker quando certas ações ocorrem, como iniciar, parar ou excluir containers, imagens ou volumes. Monitorar esses eventos pode ser útil para automação, logging e debugging.

Para ouvir eventos Docker, você usa o comando docker events. Por padrão, este comando irá continuamente exibir eventos à medida que eles acontecem.

Primeiro, vamos abrir um terminal e executar o comando docker events. Este comando irá bloquear e esperar por eventos.

docker events

Agora, abra um novo terminal (mantenha o primeiro terminal executando docker events). Neste novo terminal, executaremos um container Docker simples. Esta ação irá gerar eventos que você verá no primeiro terminal.

No novo terminal, execute o seguinte comando para fazer o pull da imagem hello-world. Isso irá gerar um evento pull.

docker pull hello-world

Você deve ver a saída no primeiro terminal indicando que um evento de pull de imagem ocorreu.

Em seguida, execute o container hello-world. Isso irá gerar eventos create, start e die.

docker run hello-world

Observe a saída no primeiro terminal. Você deve ver eventos relacionados ao container sendo criado, iniciado e, em seguida, saindo (morrendo).

Você pode parar o comando docker events no primeiro terminal pressionando Ctrl+C.

Filtrar eventos por tempo usando --since e --until

Nesta etapa, você aprenderá como filtrar eventos Docker com base no tempo usando as flags --since e --until. Isso é útil para visualizar eventos que ocorreram dentro de um intervalo de tempo específico.

A flag --since permite que você visualize eventos que ocorreram desde um tempo específico. A flag --until permite que você visualize eventos que ocorreram até um tempo específico. Você pode usar essas flags juntas para especificar uma janela de tempo.

O tempo pode ser especificado em vários formatos, incluindo o formato de data RFC3339 (por exemplo, 2023-10-27T10:00:00Z), timestamps Unix (por exemplo, 1698393600) ou tempos relativos (por exemplo, 10m para 10 minutos atrás, 1h para 1 hora atrás).

Vamos primeiro gerar alguns eventos. Executaremos o container hello-world novamente.

docker run hello-world

Agora, vamos tentar visualizar os eventos que ocorreram nos últimos 5 minutos. Podemos usar a flag --since com um tempo relativo.

docker events --since 5m

Você deve ver os eventos relacionados à execução do container hello-world que você acabou de realizar.

Em seguida, vamos tentar visualizar eventos que ocorreram nos últimos 10 minutos, mas não nos últimos 2 minutos. Podemos usar as flags --since e --until com tempos relativos.

docker events --since 10m --until 2m

Dependendo de quando você executou o container hello-world, você pode ou não ver os eventos. Se você não vir nenhum evento, tente ajustar os intervalos de tempo.

Você também pode usar timestamps absolutos. Para obter o timestamp Unix atual, você pode usar o comando date +%s.

Vamos obter o timestamp atual.

date +%s

Agora, execute o container hello-world novamente.

docker run hello-world

Obtenha o timestamp atual novamente.

date +%s

Agora, use os dois timestamps que você obteve com as flags --since e --until para visualizar os eventos que ocorreram entre esses dois tempos. Substitua START_TIMESTAMP e END_TIMESTAMP pelos timestamps reais que você registrou.

docker events --since START_TIMESTAMP --until END_TIMESTAMP

Você deve ver os eventos da execução do container hello-world que aconteceram entre os dois timestamps.

Filtrar eventos por tipo de objeto e ação usando --filter

Nesta etapa, você aprenderá como filtrar eventos Docker com base no tipo de objeto e ação usando a flag --filter. Isso permite que você se concentre em tipos específicos de eventos, como eventos de container ou eventos de imagem, e ações específicas, como create, start, stop ou delete.

A flag --filter recebe um par chave-valor no formato chave=valor. Para filtrar por tipo de objeto, a chave é type e o valor pode ser container, image, volume, network, daemon ou plugin. Para filtrar por ação, a chave é event e o valor é a ação específica.

Vamos começar filtrando apenas os eventos de container. Executaremos o container hello-world novamente para gerar eventos.

docker run hello-world

Agora, use o comando docker events com a flag --filter type=container para visualizar apenas eventos relacionados a containers.

docker events --filter type=container --since 5m

Você deve ver eventos como create, start e die para o container hello-world, mas não eventos relacionados ao pull de imagem.

Em seguida, vamos filtrar por uma ação específica, por exemplo, apenas eventos start para containers.

docker events --filter type=container --filter event=start --since 5m

Este comando mostrará apenas o evento start para o container hello-world se ele ocorreu nos últimos 5 minutos.

Você também pode filtrar pelo nome ou ID do objeto. Por exemplo, para filtrar eventos para um container específico chamado my-container, você usaria --filter container=my-container.

Vamos executar o container hello-world com um nome específico.

docker run --name my-hello-container hello-world

Agora, filtre eventos especificamente para o container chamado my-hello-container.

docker events --filter container=my-hello-container --since 5m

Você deve ver todos os eventos relacionados ao my-hello-container nos últimos 5 minutos.

Filtrar eventos por múltiplos critérios usando múltiplas flags --filter

Nesta etapa, você aprenderá como combinar múltiplas flags --filter para filtrar eventos Docker com base em múltiplos critérios simultaneamente. Isso permite que você crie filtros mais específicos para encontrar exatamente os eventos que lhe interessam.

Quando você usa múltiplas flags --filter, o Docker aplica uma lógica "AND" (E). Isso significa que um evento deve corresponder a todos os filtros especificados para ser incluído na saída.

Vamos combinar a filtragem por tipo de objeto e ação. Vamos filtrar por eventos start de container.

Primeiro, execute um container para gerar um evento start.

docker run hello-world

Agora, use duas flags --filter: uma para o tipo de objeto (type=container) e outra para a ação (event=start). Também usaremos --since 5m para limitar o intervalo de tempo.

docker events --filter type=container --filter event=start --since 5m

Você deve ver apenas o evento start para o container hello-world se ele ocorreu nos últimos 5 minutos. Eventos como create ou die serão excluídos porque não correspondem ao filtro event=start.

Você também pode combinar a filtragem por tempo, tipo e ação. Por exemplo, vamos filtrar por eventos die de container que ocorreram nos últimos 10 minutos, mas não nos últimos 2 minutos.

docker events --filter type=container --filter event=die --since 10m --until 2m

Este comando mostrará eventos die de container que se enquadram na janela de tempo especificada.

Você pode adicionar ainda mais filtros, como filtrar por nome de container ou nome de imagem. Vamos filtrar por eventos start de um container chamado my-specific-container usando a imagem ubuntu.

Primeiro, faça o pull da imagem ubuntu.

docker pull ubuntu

Agora, execute um container ubuntu com um nome específico.

docker run --name my-specific-container ubuntu echo "Hello from Ubuntu"

Agora, filtre por eventos start do container chamado my-specific-container.

docker events --filter type=container --filter event=start --filter container=my-specific-container --since 5m

Você deve ver o evento start para o my-specific-container se ele ocorreu nos últimos 5 minutos.

Formatar a saída de eventos usando --format

Nesta etapa, você aprenderá como formatar a saída de eventos Docker usando a flag --format. Isso permite que você personalize as informações exibidas para cada evento, tornando mais fácil a análise ou leitura.

A flag --format usa a sintaxe do pacote text/template do Go. Você pode acessar vários campos do objeto de evento, como .Time, .Type, .Action, .Actor.ID e .Actor.Attributes.

Vamos começar exibindo o tempo, o tipo e a ação de cada evento.

Primeiro, gere alguns eventos executando o container hello-world.

docker run hello-world

Agora, use o comando docker events com a flag --format para especificar o formato de saída desejado. Exibiremos o tempo, o tipo e a ação, separados por uma tabulação (\t).

docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}'

Você deve ver uma saída semelhante a esta, mas com timestamps e IDs diferentes:

2023-10-27 10:30:00.123456789 +0000 UTC container create
2023-10-27 10:30:00.987654321 +0000 UTC container start
2023-10-27 10:30:01.567890123 +0000 UTC container die

Você também pode acessar atributos do ator que acionou o evento. Por exemplo, para exibir o nome do container, você pode usar .Actor.Attributes.name.

Vamos executar o container hello-world com um nome novamente.

docker run --name my-formatted-container hello-world

Agora, formate a saída para incluir o nome do container.

docker events --since 5m --format '{{.Time}}\t{{.Type}}\t{{.Action}}\t{{.Actor.Attributes.name}}'

A saída agora deve incluir o nome do container:

2023-10-27 10:35:00.123456789 +0000 UTC container create my-formatted-container
2023-10-27 10:35:00.987654321 +0000 UTC container start my-formatted-container
2023-10-27 10:35:01.567890123 +0000 UTC container die my-formatted-container

Você pode usar várias funções de template e estruturas de controle dentro da string de formato para uma formatação mais complexa. Consulte a documentação do text/template do Go para obter mais detalhes.

Resumo

Neste laboratório, você aprendeu como usar o comando docker events para monitorar a atividade do Docker em tempo real. Você começou ouvindo todos os eventos Docker à medida que ocorriam, observando eventos gerados ao fazer o pull e executar um container simples.

Posteriormente, você explorou como filtrar esses eventos com base em vários critérios. Você aprendeu a filtrar eventos por tempo usando as flags --since e --until para visualizar eventos dentro de um intervalo de tempo específico. Você também descobriu como filtrar eventos por tipo de objeto e ação usando a flag --filter*, e como aplicar múltiplos filtros simultaneamente para restringir o fluxo de eventos. Finalmente, você aprendeu como formatar a saída do comandodocker eventsusando a *flag*--format` para melhor legibilidade e análise.