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

新手上路,请多包涵

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

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

原文由 Li Bin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

其他人提到 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 的内存。

原文由 BMitch 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 styrofoam fly 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进