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

Posted

技术标签:

【中文标题】如何知道 docker 容器退出的原因?【英文标题】:How to know the reason why a docker container exits? 【发布时间】:2016-11-01 22:49:05 【问题描述】:

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

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

【问题讨论】:

您可以通过docker logs <container-id>查看该容器的日志。 但是容器已经退出,我想我不能再记录它了吗? 刚刚在我的机器上试过。即使容器退出,您仍然可以访问日志。 您至少尝试过吗? techtabu,是的,我做到了。反正也没用 【参考方案1】:

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

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

【讨论】:

我不明白,既然我的容器不见了,“检查”将如何工作?从上面的讨论中,一旦应用程序死亡,容器也会死亡。您的意思是重新启动相同的图像然后检查? @LiBin 容器在死亡时不会被擦除,它只是进入停止状态,例如 status=stopped 或 exited。 'docker ps -a' 自己看看 每次运行内存密集型操作时我都会退出 0 并且 OOMKilled 是错误的。增加内存使其再次工作。 如果 Linux 内核而不是 docker 引擎杀死容器中的进程,就会发生这种情况。您经常会在主机上的 /var/log 下的操作系统日志中看到这一点。【参考方案2】:

通过查看日志可以判断容器内的进程是否被OOMkilled。 OOMkills 是由内核发起的,所以每次发生时都会在/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 在这里没有多大帮助)。【参考方案3】:

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

您可以通过键入:

sudo journalctl -u docker

或拖尾

sudo journalctl -u docker -f

如果对于终端缓冲区来说太长,则将输出管道传输到 less

sudo journalctl -xn -u docker | less

【讨论】:

就是这样!很棒的小费。 Docker 没有任何日志,但这向我展示了某些东西杀死并重新启动了守护进程。

以上是关于如何知道 docker 容器退出的原因?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式监控 docker 容器是不是退出?

如何确定哪些容器使用 docker 卷?

5docker容器数据卷

docker下容器怎么执行命令

docker容器运行后退出,怎么才能一直运行?

如何避免Docker容器启动脚本运行后自动退出