如何知道 docker 容器退出的原因?
How to know the reason why a docker container exits?
我有一个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 桌面,您可以在 docker 设置中调整分配给嵌入式 Linux VM 的内存。
您可以通过查看日志了解容器内的进程是否被OOMkilled。 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
或者如果对于终端缓冲区而言太长,则将输出管道化为 less
sudo journalctl -xn -u docker | less
我有一个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 桌面,您可以在 docker 设置中调整分配给嵌入式 Linux VM 的内存。
您可以通过查看日志了解容器内的进程是否被OOMkilled。 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
或者如果对于终端缓冲区而言太长,则将输出管道化为 less
sudo journalctl -xn -u docker | less