Стани контейнера:
created → running → (paused) → exited → (removed)
↑______restart______|
- created - створений (
docker create), але не запущений; - running - головний процес працює;
- paused - процеси заморожено (
docker pause), пам'ять зберігається; - exited - головний процес завершився; файлова система контейнера й логи лишаються, доки контейнер не видалено;
- removed -
docker rm: контейнер і його записуваний шар знищено (томи - ні).
Головне правило: контейнер живе, поки працює його головний процес (PID 1). Процес завершився - контейнер зупинився. Тому контейнер з CMD ["php", "artisan", "migrate"] зупиняється одразу після міграцій - це нормально.
Команди:
docker stop app # SIGTERM, а через 10 с - SIGKILL
docker kill app # одразу SIGKILL (чи інший сигнал: --signal)
docker restart app
docker ps -a # усі контейнери, включно з exited, і їхні коди завершення
Коди завершення - діагностика:
| Код | Значення |
|---|---|
0 |
процес завершився нормально |
1 |
помилка застосунку (виняток, невдала команда) |
126 / 127 |
команду неможливо виконати / не знайдено (помилка в CMD/ENTRYPOINT) |
137 |
128 + 9 (SIGKILL) - процес убито примусово |
143 |
128 + 15 (SIGTERM) - процес завершився на запит зупинки |
Код 137 - найчастіше:
- OOM-killer: контейнер перевищив ліміт пам'яті. Перевірка:
docker inspect app --format '{{.State.OOMKilled}}'-true; docker stopне дочекався: процес не обробив SIGTERM за 10 секунд і отримав SIGKILL (проблема з PID 1 чи довге завершення).
Код 143 при docker stop - очікуваний: процес коректно відреагував на SIGTERM.
Політики перезапуску (--restart) визначають, що відбувається після завершення: no, on-failure[:N] (лише при ненульовому коді), always, unless-stopped. Контейнер, що падає одразу після старту, з always потрапляє в цикл перезапусків з наростаючою затримкою - видно в docker ps як Restarting (1) ....
Перша дія при падінні: docker logs app (логи зупиненого контейнера доступні, доки його не видалено) і docker inspect для коду й причини.
Докладніше в документації: Docker: автоматичний запуск контейнерів