我有一个Docker容器在1G RAM的主机中运行(还有其他容器在同一主机中运行)。此Docker容器中的应用程序将解码一些图像,这可能会消耗很多内存。
有时,这个容器会退出。我怀疑这是由于内存不足但不是很确定。我需要一种方法来找到根本原因。那么有什么方法可以知道这个容器的死亡发生了什么?
其他人提到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的内存。
您可以通过读取日志来确定容器内的进程是否已完成。 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