web-dev-qa-db-ja.com

Dockerコンテナが終了する理由を知る方法は?

1G RAMのホストで実行されているDockerコンテナーがあります(同じホストで実行されている他のコンテナーもあります)。このDockerコンテナのアプリケーションはいくつかの画像をデコードしますが、これはメモリを大量に消費する可能性があります。

時々、このコンテナは終了します。私はそれがメモリ不足によるのではないかと疑っていますが、よくわかりません。根本原因を見つける方法が必要です。それで、このコンテナの死のために何が起こったのかを知る方法はありますか?

65
Li Bin

他の人は、アプリケーションの出力を表示するために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がアプリを強制終了した場合に当てはまります。また、終了コードを検索して、アプリによる終了の原因を特定できるかどうかを確認することもできます。

84
BMitch

ログを読むことで、コンテナ内のプロセスが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
2
styrofoam fly