Як дізнатись причину виходу контейнера докера?


99

У мене є контейнер Docker, який працює в хості оперативної пам’яті 1G (є й інші контейнери, що працюють на тому ж хості). Додаток у цьому контейнері Docker декодує деякі зображення, які можуть зайняти багато пам'яті.

Час від часу цей контейнер буде виходити. Сумніваюсь, це пов'язано із втратою пам'яті, але не дуже впевненою. Мені потрібен метод знайти першопричину. То чи є спосіб дізнатися, що сталося загибель цього контейнера?


5
Ви можете перевірити журнали для цього контейнера через docker logs <container-id>.
технобу

2
але контейнер вийшов, я думаю, я більше не можу його записувати?
Лі Бін

Щойно спробував на моїй машині. Ви можете отримати доступ до журналів, навіть коли контейнер вийшов.
Самуель Тох

Ви хоча б спробували?
технобу

технобу, так, я зробив. Це ніяк не допомагає
Лі Бін

Відповіді:


118

Інші згадували, 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"
    },

Важливим рядком є ​​"OOMKilled", який буде істинним, якщо ви перевищите обмеження обсягу пам'яті контейнера і Docker вбиває ваш додаток. Ви також можете знайти код виходу, щоб дізнатися, чи визначає він причину виходу вашим додатком.

Зауважте, це вказує лише на те, якщо сам докер вбиває ваш процес, і вимагає, щоб ви встановили обмеження пам’яті для вашого контейнера. За межами докера, ядро ​​Linux може виконувати ваш процес, якщо у самого хоста не вистачає пам'яті. Linux часто записує у вхід / var / log, коли це відбувається. За допомогою програми Docker Desktop для Windows та Mac ви можете налаштувати пам'ять, виділену вбудованому Linux VM, у налаштуваннях докера.


9
Я не розумію тут, оскільки мій контейнер зник, як працюватиме "перевірка"? З обговорення вище, як тільки програма помирає, контейнер також помре. Ви маєте на увазі перезапустити те саме зображення, а потім перевірити?
Лі Бін

9
@LiBin контейнер не стирається, коли він гине, він просто переходить у стан зупинки, наприклад статус = зупинений або вийшов. 'docker ps -a' і переконайтесь у цьому
Samuel Toh

Я отримував вихід 0 щоразу, коли виконував операцію, що займає пам'ять, і OOMKilled було помилковим. Збільшення пам’яті змусило її знову працювати.
Андрій

1
Це може статися, якщо ядро ​​Linux, а не докер-механізм, вбиває процеси в контейнері. Ви часто будете бачити, що в ОС журнали хостів під / var / log на хості.
BMitch

5

Ви можете дізнатися, чи був процес всередині контейнера OOMкваліфікований, прочитавши журнали. 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

Ця відповідь допомогла мені знайти те, що не так з контейнером, який докер перезапустить при виході (докер перевірити тут не дуже допомагає).
m90

0

Хоча прийнята відповідь є найкращим варіантом, іноді може бути корисним також ознайомитись із хостом і вмістом журналу (на Linux).

Це можна зробити, ввівши:

sudo journalctl -u docker

або хвостик

sudo journalctl -u docker -f

або трубопровідний висновок менше, якщо він занадто довгий для термінального буфера

journalctl -xn -u docker | less
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.