Comment connaître la raison pour laquelle un conteneur docker sort?

104

J'ai un conteneur Docker fonctionnant dans un hôte de 1G de RAM (il existe également d'autres conteneurs fonctionnant dans le même hôte). L'application de ce conteneur Docker décodera certaines images, ce qui peut consommer beaucoup de mémoire.

De temps en temps, ce conteneur sortira. Je doute que cela soit dû à un manque de mémoire mais pas très sûr. J'ai besoin d'une méthode pour trouver la cause première. Alors, y a-t-il un moyen de savoir ce qui s'est passé pour la mort de ce conteneur?

Li Bin
la source
5
Vous pouvez consulter les journaux de ce conteneur via docker logs <container-id>.
techtabu
2
mais le conteneur est sorti, je suppose que je ne peux plus l'enregistrer?
Li Bin
Je viens d'essayer ma machine. Vous pouvez toujours accéder aux journaux même lorsque le conteneur est sorti.
Samuel Toh
Avez-vous au moins essayé?
techtabu
techtabu, oui je l'ai fait. Cela n'aide pas de toute façon
Li Bin

Réponses:

122

D'autres ont mentionné docker logs $container_idpour afficher la sortie de l'application. Ce serait toujours ma première chose à vérifier.

Ensuite, vous pouvez exécuter a docker inspect $container_idpour afficher les détails de l'état, par exemple:

    "State": {
        "Status": "exited",
        "Running": false,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 0,
        "ExitCode": 2,
        "Error": "",
        "StartedAt": "2016-06-28T21:26:53.477229071Z",
        "FinishedAt": "2016-06-28T21:26:53.478066987Z"
    },

La ligne importante est "OOMKilled" qui sera vraie si vous dépassez les limites de mémoire du conteneur et Docker tue votre application. Vous pouvez également rechercher le code de sortie pour voir s'il identifie une cause de sortie par votre application.

Notez que cela indique uniquement si docker lui-même tue votre processus et nécessite que vous ayez défini une limite de mémoire sur votre conteneur. En dehors de docker, le noyau Linux peut lol votre processus si l'hôte lui-même manque de mémoire. Linux écrit souvent dans un journal dans / var / log lorsque cela se produit. Avec Docker Desktop sur Windows et Mac, vous pouvez ajuster la mémoire allouée à la machine virtuelle Linux intégrée dans les paramètres du docker.

BMitch
la source
9
Je ne comprends pas que puisque mon conteneur est parti, comment le "inspecter" fonctionnera-t-il? D'après la discussion ci-dessus, une fois que l'application meurt, le conteneur meurt également. Vous voulez dire redémarrer la même image puis inspecter?
Li Bin
9
@LiBin un conteneur n'est pas effacé quand il meurt, il arrive simplement à un état d'arrêt comme status = arrêté ou sorti. 'docker ps -a' et voyez par vous
Samuel Toh
J'obtenais la sortie 0 à chaque fois que j'exécutais une opération gourmande en mémoire et OOMKilled était faux. L'augmentation de la mémoire l'a fait fonctionner à nouveau.
Andrei
1
Cela peut se produire si le noyau Linux, plutôt que le moteur docker, tue les processus dans le conteneur. Vous verrez souvent cela dans les journaux du système d'exploitation sous / var / log sur l'hôte.
BMitch
5

Vous pouvez savoir si le processus à l'intérieur du conteneur a été OOMkilled en lisant les journaux. Les OOMkills sont lancés par le noyau, donc à chaque fois que cela se produit, il y a un tas de lignes /var/log/kern.log, par exemple:

python invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=995
oom_kill_process+0x22e/0x450
Memory cgroup out of memory: Kill process 31204 (python) score 1994 or sacrifice child
Killed process 31204 (python) total-vm:7350860kB, anon-rss:4182920kB, file-rss:2356kB, shmem-rss:0kB
mouche en polystyrène
la source
Cette réponse m'a aidé à trouver ce qui ne va pas avec un conteneur que docker redémarrerait à la sortie (docker inspect n'aide pas beaucoup ici).
m90 le
0

Bien que la réponse acceptée soit la meilleure option, il peut parfois être utile d'inspecter également depuis l'hôte le contenu du journal (sous Linux).

Vous pouvez le faire en tapant:

sudo journalctl -u docker

ou le suivre

sudo journalctl -u docker -f

ou raccorder la sortie à moins si elle est trop longue pour votre tampon de terminal

journalctl -xn -u docker | less
Roberto Manfreda
la source