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

Li *_*Bin 75 containers exit docker

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

有时,这个容器会退出.我怀疑这是由于内存不足但不是很确定.我需要一种方法来找到根本原因.那么有什么方法可以知道这个容器的死亡发生了什么?

BMi*_*tch 94

其他人提到docker logs $container_id了查看应用程序的输出.这总是我要检查的第一件事.

接下来,您可以运行a 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"
    },
Run Code Online (Sandbox Code Playgroud)

重要的是"OOMKilled",如果超出容器内存限制并且Docker杀死你的应用程序,那将是真的.您可能还希望查找退出代码,以查看它是否标识了应用退出的原因.

  • @LiBin容器在它死亡时不会被擦掉,它只是停止状态,如状态=停止或退出.'docker ps -a'并亲眼看看 (8认同)
  • 我不明白这是因为我的容器消失了,"检查"将如何工作?从上面的讨论,一旦应用程序死亡,容器也将死亡.你的意思是重启相同的图像然后检查? (6认同)
  • 我知道这是一个错字,但是让 Linux 内核“lol”你的进程似乎很合适 (2认同)

sty*_*fly 7

通过查看日志可以知道容器内的进程是否被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
Run Code Online (Sandbox Code Playgroud)


Rob*_*eda 5

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

您可以通过键入:

sudo journalctl -u docker
Run Code Online (Sandbox Code Playgroud)

或拖尾

sudo journalctl -u docker -f
Run Code Online (Sandbox Code Playgroud)

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

sudo journalctl -xn -u docker | less
Run Code Online (Sandbox Code Playgroud)