Політика перезапуску визначає, що Docker робить, коли процес контейнера завершився, і чи запускати контейнер після перезапуску самого Docker (наприклад, після перезавантаження сервера).
docker run -d --restart unless-stopped myapp:1.4
# compose.yaml
services:
app:
image: myapp:1.4
restart: unless-stopped
Варіанти:
| Політика | Поведінка |
|---|---|
no (за замовчуванням) |
не перезапускати ніколи |
on-failure[:N] |
лише якщо процес завершився з ненульовим кодом; :N - максимум спроб |
always |
перезапускати завжди; після перезапуску Docker - запустити знову, навіть якщо контейнер зупинили вручну |
unless-stopped |
як always, але якщо контейнер зупинили вручну (docker stop), після перезапуску Docker він лишиться зупиненим |
Різниця always і unless-stopped проявляється саме після перезавантаження сервера: вручну зупинений для обслуговування контейнер з always «воскресне», з unless-stopped - ні. Для більшості сервісів зручніший unless-stopped.
Що варто знати:
- перезапуск з наростаючою затримкою: якщо контейнер падає одразу після старту, Docker збільшує паузу між спробами (подвоюючи її), щоб не створювати навантаження нескінченним циклом. Затримка скидається, якщо контейнер пропрацював хоча б 10 секунд;
on-failureдоречний для задач, які мають завершитися (міграції, одноразові скрипти): успішне завершення з кодом 0 - не привід запускати знову;- політика перезапуску не перевіряє здоров'я: контейнер, що «завис», але процес живий, не буде перезапущений. Для цього потрібні перевірки стану (healthcheck) і оркестратор, який на них реагує;
- у Swarm і Kubernetes перезапуском керує сам оркестратор (
deploy.restart_policy,restartPolicyу pod), і він може перенести контейнер на інший вузол.
Типова помилка: без політики перезапуску після перезавантаження сервера (оновлення ядра, збій живлення) застосунок просто не підніметься, доки хтось не зайде й не запустить його вручну.