[英]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.