Woher wissen Sie, warum ein Docker-Container beendet wird?

98

Ich habe einen Docker-Container, der auf einem Host mit 1 G RAM ausgeführt wird (es gibt auch andere Container, die auf demselben Host ausgeführt werden). Die Anwendung in diesem Docker-Container dekodiert einige Bilder, die möglicherweise viel Speicherplatz beanspruchen.

Von Zeit zu Zeit wird dieser Container verlassen. Ich bezweifle, dass es an zu wenig Gedächtnis liegt, aber nicht sehr sicher. Ich brauche eine Methode, um die Grundursache zu finden. Gibt es also eine Möglichkeit zu wissen, was für den Tod dieses Containers passiert ist?

Li Bin
quelle
5
Sie können die Protokolle für diesen Container über überprüfen docker logs <container-id>.
Techtabu
2
aber der container ist beendet, ich schätze ich kann ihn nicht mehr protokollieren?
Li Bin
Ich habe es gerade auf meiner Maschine versucht. Sie können auch dann auf die Protokolle zugreifen, wenn der Container beendet wurde.
Samuel Toh
Hast du es wenigstens versucht?
Techtabu
Techtabu, ja, ich habe es getan. Es hilft sowieso nicht
Li Bin

Antworten:

117

Andere haben erwähnt docker logs $container_id, um die Ausgabe der Anwendung anzuzeigen. Dies wäre immer mein erstes zu überprüfen.

Als Nächstes können Sie a ausführen docker inspect $container_id, um Details zum Status anzuzeigen, z.

    "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"
    },

Die wichtige Zeile dort ist "OOMKilled". Dies gilt, wenn Sie die Container-Speicherbeschränkungen überschreiten und Docker Ihre App beendet. Möglicherweise möchten Sie auch den Exit-Code nachschlagen, um festzustellen, ob Ihre App eine Ursache für den Exit identifiziert.

Beachten Sie, dass dies nur anzeigt, ob Docker selbst Ihren Prozess beendet und dass Sie ein Speicherlimit für Ihren Container festgelegt haben. Außerhalb von Docker kann der Linux-Kernel Ihren Prozess überwachen, wenn dem Host selbst der Arbeitsspeicher ausgeht. Linux schreibt in diesem Fall häufig in ein Log in / var / log. Mit Docker Desktop unter Windows und Mac können Sie den der eingebetteten Linux-VM zugewiesenen Speicher in den Docker-Einstellungen anpassen.

BMitch
quelle
9
Ich verstehe hier nicht, wie die "Inspektion" funktionieren wird, da mein Container weg ist. Nach der obigen Diskussion stirbt auch der Container, sobald die App stirbt. Du meinst das gleiche Image neu starten und dann inspizieren?
Li Bin
9
@LiBin ein Container wird nicht weggewischt, wenn er stirbt, er wird einfach angehalten wie status = gestoppt oder beendet. 'docker ps -a' und überzeugen Sie sich selbst
Samuel Toh
Ich habe jedes Mal Exit 0 erhalten, wenn eine speicherintensive Operation ausgeführt wurde, und OOMKilled war falsch. Durch Erhöhen des Speichers funktionierte es wieder.
Andrei
1
Dies kann passieren, wenn der Linux-Kernel anstelle der Docker-Engine Prozesse im Container abbricht. Sie werden dies häufig in den Betriebssystemprotokollen unter / var / log auf dem Host sehen.
BMitch
5

Sie können herausfinden, ob der Prozess im Container OOMkilled war, indem Sie die Protokolle lesen. OOMkills werden vom Kernel initiiert, sodass jedes Mal, wenn dies geschieht, eine Reihe von Zeilen eingefügt werden /var/log/kern.log, zum Beispiel:

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
Styroporfliege
quelle
Diese Antwort hat mir geholfen herauszufinden, was mit einem Container nicht stimmt, den Docker beim Beenden neu starten würde (Docker Inspect hilft hier nicht viel).
m90
0

Während die akzeptierte Antwort die beste Option ist, kann es manchmal nützlich sein, den Inhalt des Journals (unter Linux) vom Host aus zu überprüfen.

Sie können dies tun, indem Sie Folgendes eingeben:

sudo journalctl -u docker

oder es verfolgen

sudo journalctl -u docker -f

oder leiten Sie den Ausgang auf weniger, wenn er für Ihren Terminalpuffer zu lang ist

journalctl -xn -u docker | less
Roberto Manfreda
quelle