如何知道Docker容器退出的原因?


99

我有一个在1G RAM主机中运行的Docker容器(也有在同一主机中运行的其他容器)。该Docker容器中的应用程序将解码一些图像,这可能会消耗大量内存。

该容器会不时退出。我怀疑这是由于内存不足,但不是很确定。我需要找到根本原因的方法。那么有什么方法可以知道这个集装箱的死亡发生了什么?


5
您可以通过来检查该容器的日志docker logs <container-id>
techtabu

2
但是容器已经退出,我想我不能再记录它了?
李斌

刚在我的机器上尝试过。即使容器已退出,您仍然可以访问日志。
Samuel Toh

你至少尝试过吗?
techtabu

techtabu,是的,我做到了。无论如何都无济于事
Li Bin

Answers:


118

其他人提到docker logs $container_id查看该应用程序的输出。这永远是我要检查的第一件事。

接下来,您可以运行docker inspect $container_id以查看状态的详细信息,例如:

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

重要的一行是“ OOMKilled”,如果您超出了容器的内存限制,并且Docker杀死了您的应用程序,则该行将为true。您可能还需要查找退出代码,以查看其是否标识出您的应用退出的原因。

注意,这仅表示docker本身是否会杀死您的进程,并要求您在容器上设置内存限制。在Docker外部,如果主机本身内存不足,Linux内核可以大笑您的进程。发生这种情况时,Linux通常会在/ var / log中写入日志。使用Windows和Mac上的Docker Desktop,您可以在docker设置中调整分配给嵌入式Linux VM的内存。


9
我不明白这里是因为我的容器不见了,“检查”将如何工作?通过上面的讨论,一旦应用程序死亡,容器也会死亡。您的意思是重新启动同一图像然后检查?
李斌

9
@LiBin死后不会被擦掉,它只会进入停止状态,例如status =停止或退出。'docker ps -a',然后自己看看
Samuel Toh

每次运行内存密集型操作时,我都将退出0,而OOMKilled为false。内存增加使它可以再次工作。
Andrei

1
如果Linux内核而不是docker引擎杀死了容器中的进程,则会发生这种情况。您通常会在主机上的/ var / log下的OS日志中看到该日志。
BMitch

5

您可以通过阅读日志来了解容器内的进程是否被OOM杀死。OOMkill是由内核启动的,因此每次发生时,都会在中包含很多行/var/log/kern.log,例如:

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

这个答案帮助我找到了一个在退出时重启Docker的容器出了什么问题(docker inspect在这里没有太大帮助)。
m90

0

尽管可接受的答案是最好的选择,但有时从主机上检查日志的内容(在Linux上)也很有用。

您可以通过输入以下内容来实现:

sudo journalctl -u docker

或拖尾

sudo journalctl -u docker -f

或如果输出对于终端缓冲区而言太长,则将输出传递到更少

journalctl -xn -u docker | less
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.