Comment utiliser la commande docker compose events pour surveiller les événements des conteneurs

DockerDockerBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce lab, vous apprendrez à utiliser la commande docker compose events pour surveiller les événements des conteneurs. Nous commencerons par préparer un projet Docker Compose simple, incluant l'installation de Docker Compose et la création d'un fichier docker-compose.yml de base.

Après la configuration, vous démarrerez les services définis dans le projet et observerez les événements de base générés. Nous explorerons ensuite comment utiliser le flag --json pour afficher ces événements dans un format JSON structuré. Enfin, vous apprendrez à filtrer les événements pour ne surveiller que ceux liés à des services spécifiques au sein de votre application Docker Compose.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ps -.-> lab-555078{{"Comment utiliser la commande docker compose events pour surveiller les événements des conteneurs"}} docker/start -.-> lab-555078{{"Comment utiliser la commande docker compose events pour surveiller les événements des conteneurs"}} docker/stop -.-> lab-555078{{"Comment utiliser la commande docker compose events pour surveiller les événements des conteneurs"}} docker/pull -.-> lab-555078{{"Comment utiliser la commande docker compose events pour surveiller les événements des conteneurs"}} end

Préparer un projet Docker Compose simple

Dans cette étape, nous allons préparer un projet Docker Compose simple. Comme Docker Compose n'est pas préinstallé dans l'environnement LabEx, nous allons d'abord l'installer. Docker Compose est un outil permettant de définir et d'exécuter des applications multi-conteneurs Docker. Avec Compose, vous utilisez un fichier YAML pour configurer les services de votre application. Ensuite, avec une seule commande, vous créez et démarrez tous les services à partir de votre configuration.

Tout d'abord, installons Docker Compose. Nous allons télécharger le binaire Docker Compose et le rendre exécutable.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Après l'installation, vous pouvez vérifier celle-ci en consultant la version de Docker Compose.

docker-compose --version

Vous devriez voir une sortie similaire à Docker Compose version v2.20.2.

Maintenant, créons un répertoire pour notre projet et naviguons dedans. Nous allons créer un projet simple avec un seul service.

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

Ensuite, nous allons créer un fichier docker-compose.yml dans ce répertoire. Ce fichier définira notre service. Nous utiliserons l'éditeur nano pour créer et modifier le fichier.

nano docker-compose.yml

Dans l'éditeur nano, collez le contenu suivant. Cette configuration définit un service nommé web qui utilise l'image nginx:latest.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

Analysons ce fichier docker-compose.yml :

  • version: '3.8' spécifie la version du format de fichier Docker Compose.
  • services: définit les services qui composent votre application.
  • web: est le nom de notre service.
  • image: nginx:latest spécifie l'image Docker à utiliser pour ce service. Dans ce cas, nous utilisons la dernière version de l'image officielle Nginx.
  • ports: mappe les ports entre l'hôte et le conteneur. "80:80" mappe le port 80 de l'hôte vers le port 80 du conteneur.

Enregistrez le fichier en appuyant sur Ctrl + X, puis Y, et Entrée.

Avant de démarrer le service, téléchargeons l'image nginx:latest. Bien que Docker Compose téléchargera l'image si elle n'est pas présente, la télécharger explicitement au préalable peut parfois être utile.

docker pull nginx:latest

Vous devriez voir une sortie indiquant que l'image est en cours de téléchargement.

Maintenant, notre fichier docker-compose.yml est prêt et l'image nécessaire a été téléchargée. Dans l'étape suivante, nous démarrerons le service défini dans ce fichier.

Démarrer les services et observer les événements de base

Dans cette étape, nous allons démarrer les services définis dans notre fichier docker-compose.yml et observer les événements de base générés par Docker. Les événements Docker fournissent des informations en temps réel sur l'activité de votre démon Docker et de vos conteneurs, comme la création, le démarrage, l'arrêt et la destruction des conteneurs.

Tout d'abord, assurez-vous de vous trouver dans le répertoire ~/project/my-compose-app où vous avez créé le fichier docker-compose.yml à l'étape précédente.

cd ~/project/my-compose-app

Maintenant, nous allons utiliser la commande docker-compose up pour démarrer le service. Le flag -d exécute les conteneurs en mode détaché, ce qui signifie qu'ils fonctionneront en arrière-plan sans bloquer votre terminal.

docker-compose up -d

Vous devriez voir une sortie indiquant que le réseau et le conteneur du service web sont en cours de création et de démarrage.

[+] Running 2/2
 ⠿ Network my-compose-app_default  Created
 ⠿ Container my-compose-app-web-1  Started

Pour observer les événements Docker de base, nous utiliserons la commande docker events. Cette commande diffuse en continu les événements provenant du démon Docker.

docker events

Vous verrez un flux continu d'événements liés à votre environnement Docker. Comme nous venons de démarrer un conteneur, vous devriez voir des événements relatifs à la création, au démarrage et potentiellement d'autres actions concernant le conteneur my-compose-app-web-1. La sortie ressemblera à ceci (les horodatages et détails spécifiques varieront):

2023-10-27T10:00:00.123456789Z container create 1234567890abcdef... (image=nginx:latest, name=my-compose-app-web-1, ...)
2023-10-27T10:00:01.987654321Z container start 1234567890abcdef... (image=nginx:latest, name=my-compose-app-web-1, ...)
...

La commande docker events continuera à s'exécuter et affichera les nouveaux événements au fur et à mesure qu'ils se produisent. Pour arrêter la commande et revenir à votre invite de terminal, appuyez sur Ctrl + C.

Vous pouvez également observer le conteneur en cours d'exécution avec la commande docker ps.

docker ps

Vous devriez voir le conteneur my-compose-app-web-1 listé avec un statut Up.

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
...            nginx:latest   "nginx -g 'daemon off"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   my-compose-app-web-1

Dans cette étape, nous avons démarré avec succès notre service Docker Compose et observé les événements de base générés par Docker. Dans l'étape suivante, nous explorerons comment afficher ces événements au format JSON.

Utiliser le flag --json pour afficher les événements au format JSON

Dans cette étape, nous allons apprendre à afficher les événements Docker au format JSON en utilisant le flag --json avec la commande docker events. L'affichage des événements au format JSON est utile pour le traitement programmatique et l'intégration avec d'autres outils.

Tout d'abord, assurez-vous de vous trouver dans le répertoire ~/project/my-compose-app.

cd ~/project/my-compose-app

Maintenant, exécutons la commande docker events avec le flag --json. Cela diffusera les événements au format JSON.

docker events --json

Vous verrez un flux continu d'objets JSON, où chaque objet représente un événement Docker. La sortie ressemblera à ceci (les détails varieront):

{"status":"create","id":"1234567890abcdef...","from":"nginx:latest","Type":"container","Action":"create","Actor":{"ID":"1234567890abcdef...","Attributes":{"image":"nginx:latest","name":"my-compose-app-web-1"}},"scope":"local","time":1678886400,"timeNano":1678886400123456789}
{"status":"start","id":"1234567890abcdef...","from":"nginx:latest","Type":"container","Action":"start","Actor":{"ID":"1234567890abcdef...","Attributes":{"image":"nginx:latest","name":"my-compose-app-web-1"}},"scope":"local","time":1678886401,"timeNano":1678886401987654321}
...

Chaque ligne est un objet JSON valide contenant des informations détaillées sur l'événement, telles que le status de l'événement, l'id de l'objet concerné, le Type, l'Action, et les détails de l'Actor incluant les Attributes comme le nom de l'image et le nom du conteneur.

Pour démontrer la capture de ces événements, arrêtons puis redémarrons le service web pendant que la commande docker events --json s'exécute dans un autre terminal ou en arrière-plan. Comme nous utilisons un seul terminal dans ce lab, nous allons d'abord arrêter la commande docker events --json en appuyant sur Ctrl + C.

Maintenant, arrêtons le service web.

docker-compose stop web

Vous devriez voir une sortie indiquant que le conteneur web est en cours d'arrêt.

[+] Stopping 1/1
 ⠿ Container my-compose-app-web-1  Stopped

Exécutons maintenant docker events --json en arrière-plan puis redémarrons le service. Nous utiliserons le symbole & pour exécuter la commande en arrière-plan.

docker events --json &

Vous verrez un identifiant de processus (PID) s'afficher, indiquant que la commande s'exécute en arrière-plan.

Maintenant, redémarrons le service web.

docker-compose start web

Vous devriez voir une sortie indiquant que le conteneur web est en cours de démarrage.

[+] Starting 1/1
 ⠿ Container my-compose-app-web-1  Started

La commande docker events --json exécutée en arrière-plan capturera les événements stop et start. Pour voir la sortie du processus en arrière-plan, vous pourriez avoir besoin de le ramener au premier plan avec la commande fg, ou vérifier la sortie du terminal après l'arrêt du processus en arrière-plan. Cependant, pour les besoins de cette étape, simplement exécuter la commande avec --json suffit à comprendre le format.

Pour arrêter le processus docker events --json en arrière-plan, vous pouvez utiliser la commande jobs pour lister les tâches en arrière-plan puis kill %<job_number>. Alternativement, vous pouvez trouver l'identifiant du processus avec ps aux | grep 'docker events --json' et utiliser la commande kill avec le PID. Une méthode plus simple dans ce contexte est simplement de passer à l'étape suivante, car le processus en arrière-plan n'interférera pas significativement.

Dans cette étape, nous avons utilisé avec succès le flag --json pour visualiser les événements Docker dans un format JSON structuré, ce qui est précieux pour l'automatisation et l'analyse.

Filtrer les événements pour des services spécifiques

Dans cette étape, nous allons apprendre à filtrer les événements Docker pour ne voir que ceux liés à des services ou conteneurs spécifiques. Ceci est particulièrement utile dans des environnements avec de nombreux conteneurs où vous souhaitez uniquement surveiller les événements d'une application ou d'un service particulier.

La commande docker events prend en charge le filtrage via le flag --filter. Vous pouvez filtrer selon différents critères comme container, image, event, label, etc.

Tout d'abord, assurez-vous d'être dans le répertoire ~/project/my-compose-app.

cd ~/project/my-compose-app

Notre service est nommé web dans le fichier docker-compose.yml, et le nom du conteneur généré par Docker Compose suit typiquement le format <nom_projet>_<nom_service>_<numéro_instance>. Dans notre cas, le nom du projet est my-compose-app (dérivé du nom du répertoire), le nom du service est web, et le numéro d'instance est 1. Le nom du conteneur est donc my-compose-app-web-1.

Filtrons les événements pour n'afficher que ceux concernant notre conteneur web. Nous pouvons utiliser le filtre container avec le nom du conteneur.

docker events --filter container=my-compose-app-web-1

Cette commande n'affichera désormais que les événements où l'objet concerné est le conteneur nommé my-compose-app-web-1. Pour voir cela en action, arrêtons et redémarrons le service web pendant que cette commande s'exécute.

D'abord, arrêtez la commande docker events en appuyant sur Ctrl + C.

Maintenant, exécutez la commande docker events filtrée en arrière-plan.

docker events --filter container=my-compose-app-web-1 &

Vous verrez l'identifiant du processus en arrière-plan.

Maintenant, arrêtez le service web avec Docker Compose.

docker-compose stop web

Vous devriez voir une sortie indiquant l'arrêt du conteneur. La commande docker events en arrière-plan devrait capturer l'événement stop pour le conteneur my-compose-app-web-1.

Ensuite, redémarrez le service web.

docker-compose start web

Vous devriez voir une sortie indiquant le démarrage du conteneur. La commande en arrière-plan devrait capturer l'événement start pour le conteneur my-compose-app-web-1.

Vous pouvez également filtrer selon d'autres critères. Par exemple, pour filtrer les événements par image, vous pourriez utiliser --filter image=nginx:latest.

Pour arrêter le processus docker events en arrière-plan, vous pouvez utiliser jobs et kill %<job_number> ou trouver le PID et utiliser kill <PID>. Pour ce lab, vous pouvez simplement continuer.

Enfin, nettoyons le conteneur en cours d'exécution et le réseau créé par Docker Compose.

docker-compose down

Cette commande arrêtera et supprimera les conteneurs, réseaux et volumes définis dans le fichier docker-compose.yml.

[+] Running 2/1
 ⠿ Container my-compose-app-web-1  Removed
 ⠿ Network my-compose-app_default  Removed

Dans cette étape, nous avons appris à filtrer les événements Docker en utilisant le flag --filter, ce qui est essentiel pour surveiller des composants spécifiques dans un environnement Docker chargé. Nous avons également nettoyé les ressources créées pendant le lab.

Résumé

Dans ce lab, nous avons appris à utiliser la commande docker compose events pour surveiller les événements des conteneurs. Nous avons commencé par préparer un projet Docker Compose simple, ce qui a impliqué l'installation de Docker Compose et la création d'un fichier docker-compose.yml définissant un service Nginx basique.

Après la configuration du projet, nous avons démarré les services et observé les événements de base générés par Docker Compose. Nous avons ensuite exploré comment afficher ces événements au format JSON en utilisant le flag --json pour faciliter leur analyse et leur traitement. Enfin, nous avons appris à filtrer les événements pour ne surveiller que ceux liés à des services spécifiques au sein de notre projet Docker Compose.