繁体   English   中英

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

[英]How to know the reason why a docker container exits?

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

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

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

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

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

您可以通过键入:

sudo journalctl -u docker

或拖尾

sudo journalctl -u docker -f

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

sudo journalctl -xn -u docker | less

docker inspect -f '{{.State }}' $container_id并检查第 8 个属性,即 ExitCode。

如果您无法访问容器的日志,尤其是当您使用 docker API - 例如因为docker.errors.NotFound: 404 Client Error - 原因可能是容器在退出后已自动删除。

可能是运行容器时加上docker run --rm选项引起的,也就是: Automatically remove the container when it exits 届时您将无法再获取日志。

只需删除--rm选项并注意在收集日志后手动删除容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM