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

时间:2016-06-30 02:23:21

标签: docker containers exit

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

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

3 个答案:

答案 0 :(得分:83)

其他人提到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杀死你的应用程序,这将是真的。您可能还希望查找退出代码,以查看它是否确定了应用退出的原因。

答案 1 :(得分:2)

虽然可接受的答案是最佳选择,但有时也可以从主机(在Linux上)从主机检查日志的内容。

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

sudo journalctl -u docker

或拖尾

sudo journalctl -u docker -f

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

sudo journalctl -xn -u docker | less

答案 2 :(得分:1)

您可以通过阅读日志来了解容器内的进程是否被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