Come sapere il motivo per cui esce un container Docker?


99

Ho un container Docker in esecuzione in un host di 1G RAM (ci sono anche altri container in esecuzione nello stesso host). L'applicazione in questo contenitore Docker decodificherà alcune immagini, che potrebbero consumare molta memoria.

Di tanto in tanto, questo contenitore uscirà. Dubito che sia dovuto a memoria insufficiente, ma non molto sicuro. Ho bisogno di un metodo per trovare la causa principale. Quindi c'è un modo per sapere cosa è successo per la morte di questo container?


5
Puoi controllare i log per quel container tramite docker logs <container-id>.
techtabu

2
ma il container è uscito, immagino di non poterlo più loggare?
Li Bin

Ho appena provato sulla mia macchina. È comunque possibile accedere ai log anche quando il contenitore è uscito.
Samuel Toh,

Hai almeno provato?
techtabu

techtabu, sì l'ho fatto. Non aiuta comunque
Li Bin il

Risposte:


118

Altri hanno menzionato docker logs $container_iddi visualizzare l'output dell'applicazione. Questa sarebbe sempre la mia prima cosa da controllare.

Successivamente, puoi eseguire a docker inspect $container_idper visualizzare i dettagli sullo stato, ad esempio:

    "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 riga importante è "OOMKilled" che sarà vera se superi i limiti di memoria del contenitore e Docker uccide la tua app. Potresti anche voler cercare il codice di uscita per vedere se identifica una causa dell'uscita dalla tua app.

Nota, questo indica solo se docker stesso interrompe il tuo processo e richiede che tu abbia impostato un limite di memoria sul tuo contenitore. Al di fuori di docker, il kernel Linux può eseguire il lol del processo se l'host stesso esaurisce la memoria. Linux spesso scrive su un log in / var / log quando questo accade. Con Docker Desktop su Windows e Mac, puoi regolare la memoria allocata alla VM Linux incorporata nelle impostazioni del docker.


9
Non capisco qui è poiché il mio contenitore è andato, come funzionerà "l'ispezione"? Dalla discussione sopra, una volta che l'app muore, morirà anche il contenitore. Intendi riavviare la stessa immagine e poi ispezionarla?
Li Bin

9
@LiBin un contenitore non viene cancellato quando muore, ma arriva semplicemente a uno stato di arresto come status = stop o uscito. 'docker ps -a' e guarda tu stesso
Samuel Toh

Ottenevo l'uscita 0 ogni volta che eseguivo un'operazione a uso intensivo di memoria e OOMKilled era falso. L'aumento della memoria lo ha fatto funzionare di nuovo.
Andrei

1
Ciò può accadere se il kernel Linux, anziché il motore docker, interrompe i processi nel contenitore. Lo vedrai spesso nei log del sistema operativo in / var / log sull'host.
BMitch

5

È possibile scoprire se il processo all'interno del contenitore è stato superato da OOM leggendo i log. Le OOMkills vengono avviate dal kernel, quindi ogni volta che accade ci sono un mucchio di righe /var/log/kern.log, ad esempio:

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

Questa risposta mi ha aiutato a trovare cosa c'è di sbagliato in un container che la finestra mobile si riavvia all'uscita (docker inspect non aiuta molto qui).
m90

0

Sebbene la risposta accettata sia l'opzione migliore, a volte può essere utile ispezionare dall'host anche il contenuto della rivista (su linux).

Puoi farlo digitando:

sudo journalctl -u docker

o seguirlo

sudo journalctl -u docker -f

o convogliare l'output a less se è troppo lungo per il buffer del terminale

journalctl -xn -u docker | less
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.