Docker
Déboguer un conteneur
Recherche…
Syntaxe
- docker stats [OPTIONS] [CONTAINER ...]
- docker logs [OPTIONS] CONTAINER
- docker top [OPTIONS] CONTAINER [ps OPTIONS]
Entrer dans un conteneur en cours d'exécution
Pour exécuter des opérations dans un conteneur, utilisez la commande docker exec
. Parfois, cela s'appelle "entrer dans le conteneur" car toutes les commandes sont exécutées à l'intérieur du conteneur.
docker exec -it container_id bash
ou
docker exec -it container_id /bin/sh
Et maintenant, vous avez un shell dans votre conteneur en cours d'exécution. Par exemple, répertoriez les fichiers dans un répertoire, puis quittez le conteneur:
docker exec container_id ls -la
Vous pouvez utiliser le -u flag
pour entrer le conteneur avec un utilisateur spécifique, par exemple uid=1013
, gid=1023
.
docker exec -it -u 1013:1023 container_id ls -la
L'ID utilisateur et le gid ne doivent pas nécessairement exister dans le conteneur, mais la commande peut générer des erreurs. Si vous souhaitez lancer un conteneur et entrer immédiatement à l'intérieur pour vérifier quelque chose, vous pouvez le faire.
docker run...; docker exec -it $(docker ps -lq) bash
la commande docker ps -lq
ne docker ps -lq
que l'id du dernier conteneur (le l in -lq
) démarré. (cela suppose que vous ayez bash comme interpréteur disponible dans votre conteneur, vous pouvez avoir sh ou zsh ou tout autre)
Surveillance de l'utilisation des ressources
L'inspection de l'utilisation des ressources du système est un moyen efficace de trouver des applications qui fonctionnent mal. Cet exemple est équivalent à la commande top
traditionnelle pour les conteneurs:
docker stats
Pour suivre les statistiques de conteneurs spécifiques, listez-les sur la ligne de commande:
docker stats 7786807d8084 7786807d8085
Docker stats affiche les informations suivantes:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
7786807d8084 0.65% 1.33 GB / 3.95 GB 33.67% 142.2 MB / 57.79 MB 46.32 MB / 0 B
Par défaut, les docker stats
affichent l'ID des conteneurs, ce qui n'est pas très utile, si vous préférez afficher les noms du conteneur, faites simplement
docker stats $(docker ps --format '{{.Names}}')
Surveillance des processus dans un conteneur
L'inspection de l'utilisation des ressources du système est un moyen efficace de réduire un problème sur une application en cours d'exécution. Cet exemple est un équivalent de la commande ps
traditionnelle pour les conteneurs.
docker top 7786807d8084
Pour filtrer le format de la sortie, ajoutez des options ps
sur la ligne de commande:
docker top 7786807d8084 faux
Ou, pour obtenir la liste des processus exécutés en tant que root, ce qui est une pratique potentiellement dangereuse:
docker top 7786807d8084 -u root
La commande docker top
s'avère particulièrement utile lors du dépannage de conteneurs minimalistes sans shell ni commande ps
.
Attacher à un conteneur en cours d'exécution
"Attachement à un conteneur" est l'acte de démarrer une session de terminal dans le contexte dans lequel le conteneur (et les programmes qu'il contient) est en cours d'exécution. Ceci est principalement utilisé à des fins de débogage, mais peut également être nécessaire si des données spécifiques doivent être transmises aux programmes exécutés dans le conteneur.
La commande attach
est utilisée pour cela. Il a cette syntaxe:
docker attach <container>
<container>
peut être soit l'identifiant du conteneur, soit le nom du conteneur. Par exemple:
docker attach c8a9cf1a1fa8
Ou:
docker attach graceful_hopper
Vous pouvez avoir besoin de sudo
les commandes ci-dessus, selon votre utilisateur et comment docker est configuré.
Remarque: Attach ne permet qu'une seule session shell à joindre à un conteneur à la fois.
Attention: toutes les entrées au clavier seront transmises au conteneur. Frapper Ctrl-c va tuer votre conteneur.
Pour détacher d'un conteneur attaché, appuyez successivement sur Ctrl-p puis Ctrl-q
Pour attacher plusieurs sessions shell à un conteneur, ou simplement comme alternative, vous pouvez utiliser exec
. En utilisant l'ID du conteneur:
docker exec -i -t c8a9cf1a1fa8 /bin/bash
En utilisant le nom du conteneur:
docker exec -i -t graceful_hopper /bin/bash
exec
exécute un programme dans un conteneur, dans ce cas /bin/bash
(un shell, probablement un conteneur). -i
indique une session interactive, tandis que -t
alloue un pseudo-TTY.
Remarque: contrairement à l' attachement , si vous appuyez sur Ctrl-c , la commande exec 'd ne se terminera que lorsque vous exécutez de manière interactive.
Impression des journaux
Suivre les journaux est le moyen le moins intrusif de déboguer une application en cours d'exécution. Cet exemple reproduit le comportement du tail -f some-application.log
traditionnel sur le conteneur 7786807d8084
.
docker logs --follow --tail 10 7786807d8084
Cette commande affiche essentiellement la sortie standard du processus conteneur (le processus avec pid 1).
Si vos journaux n'incluent pas nativement l'horodatage, vous pouvez ajouter l'indicateur --timestamps
.
Il est possible de regarder les journaux d'un conteneur arrêté, soit
démarrer le conteneur défaillant avec le
docker run ... ; docker logs $(docker ps -lq)
trouver l'identifiant ou le nom du conteneur avec
docker ps -a
et alors
docker logs container-id
ou
docker logs containername
comme il est possible de regarder les journaux d'un conteneur arrêté
Débogage du processus du conteneur Docker
Docker est juste un moyen sophistiqué d'exécuter un processus, pas une machine virtuelle. Par conséquent, le débogage d'un processus "dans un conteneur" est également possible "sur l'hôte" en examinant simplement le processus du conteneur en cours d'exécution en tant qu'utilisateur disposant des autorisations appropriées pour inspecter ces processus sur l'hôte (par exemple root). Par exemple, il est possible de répertorier tous les "processus de conteneur" sur l'hôte en exécutant un simple ps
tant que root:
sudo ps aux
Tous les conteneurs Docker en cours d'exécution seront répertoriés dans la sortie.
Cela peut être utile lors du développement d'applications pour déboguer un processus exécuté dans un conteneur. En tant qu'utilisateur disposant des autorisations appropriées, des utilitaires de débogage classiques peuvent être utilisés sur le processus de conteneur, tels que strace, ltrace, gdb, etc.