04/12/2022

0. Debug d'un conteneur

Lu 1660 fois Licence Creative Commons

Démarrez un conteneur nginx:

docker run -d --rm --name web-srv -p 8080:80 nginx

Logs de conteneur

Lorsqu'un conteneur se comporte d'une manière innatendue, l'un des premiers réflexes à avoir est de regarder les logs:
On peut afficher les logs avec la commande logs suivie du nom du conteneur:

docker logs web-srv
[output]172.17.0.1 - - [06/Dec/2019:15:49:00 +0000] "GET / HTTP/1.1" 200 29 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0" "-"
[output]172.17.0.1 - - [06/Dec/2019:15:49:42 +0000] "GET /something HTTP/1.1" 404 153 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0" "-"
[output]2019/12/06 15:49:42 [error] 6#6: *1 open() "/usr/share/nginx/html/something" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /something HTTP/1.1", host: "localhost:8080"

Détecter des changements

Lorsqu'un problème survient, il peut s'agir d'un changement dans le système de fichiers du conteneur: modification de fichier, suppression d'un dossier, ...
Docker permet de lister les différences entre l'image originale et l'état du conteneur avec la commande diff:

docker diff web-srv
[output]C /run
[output]A /run/nginx.pid
[output]...

Plusieurs lettres préfixent chaque ligne:

Lettre Signification
A added: fichier/dossier ajouté
D deleted: fichier/dossier supprimé
C changed: fichier/dossier modifié

Processus et ports

Listez le mapping des ports d'un conteneur avec la commande port:

docker port web-srv
[output]80/tcp -> 0.0.0.0:8080

Listez les processus en cours dans un conteneur:

docker top web-srv
[output]UID                 PID                 PPID                C                   STIME              TTY               TIME                CMD
[output]root                13641            13608              0                   16:48               ?                   00:00:00         nginx: master process nginx -g daemon off;
[output]systemd+      13690            13641              0                   16:48               ?                   00:00:00         nginx: worker process

Lire la configuration d'un conteneur

Pour obtenir la configuration complète d'un conteneur, utiliser la commande inspect qui renverra du JSON:

docker inspect web-srv
[output][
[output]    {
[output]        "Id": "23825eac26c270d54bb86c3152b034a1a865353d0eeb98eb98ed067addd0fba5",
[output]        "Created": "2019-12-06T15:48:53.906908049Z",
[output]...

Il est possible de formatter l'affichage en utilisant un template Go.
Exemple: affichage des adresses MAC et IPv4 du conteneur.

docker inspect --format='MAC: {{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}} | IP: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web-srv
[output]MAC: 02:42:ac:11:00:02 | IP: 172.17.0.2