Comment utiliser la commande docker compose exec pour interagir avec les services

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 labo (LabEx), vous apprendrez à utiliser efficacement la commande docker compose exec pour interagir avec des services en cours d'exécution. Vous explorerez l'exécution de commandes dans un conteneur de service, l'exécution de commandes en mode détaché (detached mode), l'exécution de commandes en tant qu'un autre utilisateur, et l'exécution de commandes avec un répertoire de travail spécifique. Cette expérience pratique vous dotera des compétences essentielles pour déboguer et gérer vos applications conteneurisées avec Docker.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555079{{"Comment utiliser la commande docker compose exec pour interagir avec les services"}} docker/exec -.-> lab-555079{{"Comment utiliser la commande docker compose exec pour interagir avec les services"}} docker/pull -.-> lab-555079{{"Comment utiliser la commande docker compose exec pour interagir avec les services"}} end

Exécuter une commande dans un conteneur de service en cours d'exécution

Dans cette étape, vous apprendrez comment exécuter une commande à l'intérieur d'un conteneur Docker en cours d'exécution. Cette technique est très utile pour déboguer ou interagir avec un service fonctionnant dans un conteneur sans avoir besoin de l'arrêter et de le redémarrer.

Commencez par télécharger une image Nginx simple pour cette démonstration. Nous utiliserons l'image nginx:alpine car elle est légère et rapide à télécharger.

docker pull nginx:alpine

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

Ensuite, nous allons exécuter cette image Nginx en mode détaché (detached mode), ce qui signifie que le conteneur fonctionnera en arrière-plan sans bloquer votre terminal. Nous lui donnerons également un nom pour faciliter sa référence ultérieure.

docker run -d --name my-nginx nginx:alpine

La sortie affichera l'ID du conteneur nouvellement créé et en cours d'exécution.

Maintenant que le conteneur est en cours d'exécution, nous pouvons exécuter une commande à l'intérieur en utilisant la commande docker exec. La syntaxe de base est docker exec [options] conteneur commande [args...]. Essayons de lister les fichiers dans le répertoire racine du conteneur.

docker exec my-nginx ls /

Vous devriez voir une liste des répertoires et fichiers présents dans le système de fichiers racine du conteneur Nginx, tels que bin, etc, usr, etc. Cela confirme que vous avez bien exécuté une commande dans le conteneur en cours d'exécution.

Essayons une autre commande. Nous pouvons vérifier la version de Nginx en cours d'exécution dans le conteneur.

docker exec my-nginx nginx -v

La sortie affichera la version de Nginx installée dans le conteneur, par exemple nginx version: nginx/1.24.0.

Cela démontre comment vous pouvez interagir avec un conteneur en cours d'exécution et y exécuter des commandes arbitraires dans son environnement.

Exécuter une commande en mode détaché

Dans l'étape précédente, nous avons exécuté un conteneur en mode détaché (detached mode) en utilisant l'option -d. Cette pratique est courante lorsque vous souhaitez qu'un conteneur s'exécute en arrière-plan sans occuper votre terminal. Dans cette étape, nous allons explorer plus en détail l'exécution de commandes en mode détaché, en particulier avec docker exec.

Bien que docker exec soit généralement utilisé pour des sessions interactives ou pour exécuter des commandes ponctuelles dans un conteneur en cours d'exécution, vous pouvez également lancer une commande en mode détaché en utilisant l'option -d avec docker exec. Ceci est utile pour démarrer un processus en arrière-plan dans un conteneur déjà actif.

Utilisons le conteneur my-nginx que nous avons démarré précédemment. Nous allons exécuter une commande simple en mode détaché. Par exemple, exécutons une commande qui écrit la date et l'heure actuelles dans un fichier à l'intérieur du conteneur toutes les 5 secondes.

docker exec -d my-nginx sh -c 'while true; do date >> /usr/share/nginx/html/date.txt; sleep 5; done'

Dans cette commande :

  • docker exec -d my-nginx : Exécute la commande suivante en mode détaché dans le conteneur my-nginx
  • sh -c '...' : Exécute la chaîne de commande suivante en utilisant le shell sh
  • while true; do date >> /usr/share/nginx/html/date.txt; sleep 5; done : Il s'agit de la commande exécutée. C'est une boucle simple qui ajoute continuellement la date et l'heure actuelles dans le fichier /usr/share/nginx/html/date.txt, puis attend 5 secondes avant de répéter l'opération.

Après avoir exécuté la commande, vous verrez l'ID du conteneur s'afficher dans votre terminal, indiquant que la commande a bien été démarrée en arrière-plan dans le conteneur.

Pour vérifier que la commande s'exécute correctement et écrit dans le fichier, nous pouvons exécuter une autre commande pour afficher le contenu du fichier date.txt. Comme la commande s'exécute en arrière-plan, il peut s'écouler quelques secondes avant que le fichier ne soit créé et rempli.

docker exec my-nginx cat /usr/share/nginx/html/date.txt

Vous devriez voir la date et l'heure s'afficher dans la sortie. Si vous réexécutez la commande cat après quelques secondes, vous devriez voir de nouvelles entrées ajoutées au fichier. Cela confirme que le processus en arrière-plan démarré avec docker exec -d fonctionne comme prévu.

Exécuter une commande en tant qu'un autre utilisateur

Dans cette étape, vous apprendrez comment exécuter une commande dans un conteneur en cours d'exécution en tant qu'un utilisateur spécifique. Par défaut, docker exec exécute les commandes en tant qu'utilisateur root à l'intérieur du conteneur, mais vous pouvez spécifier un autre utilisateur en utilisant l'option -u ou --user. Ceci est important pour la sécurité et pour respecter le principe du moindre privilège.

Continuons à utiliser le conteneur my-nginx. Tout d'abord, voyons sous quel utilisateur la commande ls / s'exécute par défaut.

docker exec my-nginx whoami

Le résultat sera probablement root, car c'est l'utilisateur par défaut pour docker exec.

Maintenant, essayons d'exécuter une commande en tant qu'un autre utilisateur. L'image Nginx exécute typiquement le processus Nginx en tant qu'utilisateur non-root, souvent nommé nginx. Essayons d'exécuter la commande whoami en tant qu'utilisateur nginx.

docker exec -u nginx my-nginx whoami

Vous devriez voir le résultat nginx, confirmant que la commande a été exécutée en tant qu'utilisateur nginx.

Vous pouvez également spécifier un identifiant d'utilisateur (UID) au lieu d'un nom d'utilisateur. Pour trouver l'UID de l'utilisateur nginx dans le conteneur, nous pouvons consulter le fichier /etc/passwd.

docker exec my-nginx cat /etc/passwd | grep nginx

Le résultat affichera l'entrée pour l'utilisateur nginx, incluant son UID et GID (identifiant de groupe). Par exemple, cela pourrait ressembler à nginx:x:101:101:nginx user,,,:/nonexistent:/bin/false. Dans cet exemple, l'UID est 101.

Maintenant, exécutons la commande whoami en utilisant l'UID. Remplacez 101 par l'UID réel que vous avez trouvé à l'étape précédente s'il est différent.

docker exec -u 101 my-nginx whoami

Le résultat devrait à nouveau être nginx, démontrant que vous pouvez utiliser soit le nom d'utilisateur soit l'UID pour spécifier l'utilisateur avec docker exec.

Exécuter des commandes en tant qu'utilisateur non-root est une bonne pratique de sécurité, particulièrement lorsqu'on interagit avec des fichiers sensibles ou qu'on effectue des opérations ne nécessitant pas les privilèges root.

Exécuter une commande dans un répertoire de travail spécifique

Dans cette dernière étape, vous apprendrez comment exécuter une commande dans un conteneur en cours d'exécution avec un répertoire de travail spécifique. Par défaut, docker exec exécute les commandes dans le répertoire de travail défini dans le Dockerfile de l'image du conteneur (souvent /). Cependant, vous pouvez modifier cela en utilisant l'option -w ou --workdir. Ceci est utile lorsque vous devez exécuter des commandes relatives à un chemin spécifique dans le système de fichiers du conteneur.

Continuons à utiliser le conteneur my-nginx. Tout d'abord, voyons le répertoire de travail par défaut lorsque nous exécutons une commande sans en spécifier un. Nous pouvons utiliser la commande pwd (print working directory) pour cela.

docker exec my-nginx pwd

Le résultat sera probablement /, qui est le répertoire racine.

Maintenant, exécutons une commande dans un répertoire de travail différent. Le conteneur Nginx possède un répertoire /usr/share/nginx/html depuis lequel le serveur web sert les fichiers. Changeons le répertoire de travail vers ce chemin et listons les fichiers qu'il contient.

docker exec -w /usr/share/nginx/html my-nginx ls

Dans cette commande :

  • docker exec -w /usr/share/nginx/html my-nginx : Exécute la commande suivante dans le conteneur my-nginx, en définissant le répertoire de travail sur /usr/share/nginx/html
  • ls : La commande à exécuter, qui liste les fichiers dans le répertoire de travail courant

Vous devriez voir les fichiers présents dans le répertoire /usr/share/nginx/html, comme index.html et date.txt (que nous avons créé dans une étape précédente).

Essayons un autre exemple. Nous pouvons créer un nouveau répertoire dans /usr/share/nginx/html puis changer notre répertoire de travail vers ce nouveau répertoire avant d'exécuter une commande.

docker exec my-nginx mkdir /usr/share/nginx/html/new_dir
docker exec -w /usr/share/nginx/html/new_dir my-nginx pwd

La première commande crée un répertoire nommé new_dir dans /usr/share/nginx/html. La seconde commande change alors le répertoire de travail vers /usr/share/nginx/html/new_dir et affiche le répertoire de travail courant.

Le résultat de la seconde commande devrait être /usr/share/nginx/html/new_dir, confirmant que le répertoire de travail a bien été modifié pour l'exécution de la commande pwd.

L'utilisation de l'option -w avec docker exec vous permet d'exécuter des commandes dans le contexte d'un répertoire spécifique du conteneur, ce qui est très utile pour naviguer et interagir avec le système de fichiers du conteneur de manière plus efficace.

Résumé

Dans ce lab, vous avez appris à utiliser la commande docker exec pour interagir avec un conteneur Docker en cours d'exécution. Vous avez pratiqué l'exécution de commandes à l'intérieur d'un conteneur, notamment pour lister des fichiers et vérifier la version de Nginx, démontrant ainsi la capacité à déboguer et interagir avec des services sans les arrêter.

Vous avez également abordé brièvement l'exécution de conteneurs en mode détaché à l'aide de l'option -d, un concept fondamental pour l'exécution de conteneurs en arrière-plan. Bien que les étapes suivantes n'aient pas été détaillées, les premières étapes ont fourni une base solide pour comprendre comment exécuter des commandes dans un environnement de conteneur en cours d'exécution.