¿Cómo saber la razón por la que sale un contenedor Docker?

104

Tengo un contenedor Docker que se ejecuta en un host de 1G de RAM (también hay otros contenedores que se ejecutan en el mismo host). La aplicación en este contenedor Docker decodificará algunas imágenes, lo que puede consumir mucha memoria.

De vez en cuando, este contenedor saldrá. Dudo que se deba a una falta de memoria, pero no estoy muy seguro. Necesito un método para encontrar la causa raíz. Entonces, ¿hay alguna forma de saber qué sucedió con la muerte de este contenedor?

Li Bin
fuente
5
Puede consultar los registros de ese contenedor a través de docker logs <container-id>.
techtabu
2
pero el contenedor ha salido, ¿supongo que ya no puedo registrarlo?
Li Bin
Lo acabo de probar en mi máquina. Aún puede acceder a los registros incluso cuando el contenedor ha salido.
Samuel Toh
¿Al menos lo intentaste?
techtabu
techtabu, sí lo hice. No ayuda de todos modos
Li Bin

Respuestas:

122

Otros han mencionado docker logs $container_idpara ver el resultado de la aplicación. Esto siempre sería lo primero que debería comprobar.

A continuación, puede ejecutar un docker inspect $container_idpara ver los detalles del estado, por ejemplo:

    "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 línea importante es "OOMKilled", que será verdadera si excede los límites de memoria del contenedor y Docker mata su aplicación. También es posible que desee buscar el código de salida para ver si identifica una causa de la salida de su aplicación.

Tenga en cuenta que esto solo indica si la ventana acoplable mata su proceso y requiere que haya establecido un límite de memoria en su contenedor. Fuera de la ventana acoplable, el kernel de Linux puede lol su proceso si el propio host se queda sin memoria. Linux a menudo escribe en un registro / var / log cuando esto sucede. Con Docker Desktop en Windows y Mac, puede ajustar la memoria asignada a la máquina virtual Linux integrada en la configuración de la ventana acoplable.

BMitch
fuente
9
No entiendo que, dado que mi contenedor se ha ido, ¿cómo funcionará "inspeccionar"? De la discusión anterior, una vez que la aplicación muere, el contenedor también muere. ¿Te refieres a reiniciar la misma imagen y luego inspeccionar?
Li Bin
9
@LiBin un contenedor no se borra cuando muere, simplemente llega a un estado detenido como status = detenido o salido. 'docker ps -a' y compruébelo usted mismo
Samuel Toh
Obtenía la salida 0 cada vez que ejecutaba una operación con uso intensivo de memoria y OOMKilled era falso. El aumento de la memoria hizo que volviera a funcionar.
Andrei
1
Esto puede suceder si el kernel de Linux, en lugar del motor de la ventana acoplable, mata los procesos del contenedor. A menudo verá eso en los registros del sistema operativo en / var / log en el host.
BMitch
5

Puede averiguar si el proceso dentro del contenedor fue OOMkilled leyendo los registros. OOMkills son iniciados por el kernel, por lo que cada vez que sucede hay un montón de líneas /var/log/kern.log, por ejemplo:

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
mosca de espuma de poliestireno
fuente
Esta respuesta me ayudó a encontrar lo que está mal con un contenedor que la ventana acoplable reiniciaría al salir (la inspección de la ventana acoplable no ayuda mucho aquí).
m90
0

Si bien la respuesta aceptada es la mejor opción, a veces puede ser útil inspeccionar desde el host el contenido de la revista también (en linux).

Puede hacerlo escribiendo:

sudo journalctl -u docker

o siguiéndolo

sudo journalctl -u docker -f

o canalizar la salida a menos si es demasiado larga para el búfer de su terminal

journalctl -xn -u docker | less
Roberto Manfreda
fuente