如何知道码头集装箱退出的原因?

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

这个容器会时不时地退出。我怀疑这是由于失忆,但不是很肯定。我需要找到根本原因的方法。有没有办法知道这个集装箱的死亡原因?

126700 次浏览

其他人提到了 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"
},

重要的一行是“ OOMKkill”,如果你超过容器内存限制,Docker 会杀死你的应用程序。您可能还想查找退出代码,看看它是否确定了应用程序退出的原因。

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

通过读取日志,您可以查明容器中的进程是否被 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

虽然接受的答案是最好的选择,但有时也可以从主机(在 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选项,并在收集日志后注意手动删除容器。