Ответ
В Docker есть четыре основные политики перезапуска, которые определяют поведение демона Docker при завершении работы контейнера:
no(значение по умолчанию): Контейнер не будет перезапущен автоматически ни при каких обстоятельствах. Используется для одноразовых задач или контейнеров, управляемых внешними оркестраторами (Kubernetes).on-failure: Контейнер будет перезапущен только если он завершился с ненулевым кодом выхода (т.е. с ошибкой). Можно указать максимальное количество попыток:--restart=on-failure:5. Это полезно для долгоживущих сервисов, которые должны восстанавливаться после сбоев.always: Демон Docker будет всегда перезапускать контейнер, независимо от кода выхода. Даже если контейнер был корректно остановлен командойdocker stop, он будет перезапущен после перезагрузки демона Docker или хоста. Риск этой политики — бесконечный цикл перезапусков для контейнера с фатальной ошибкой на старте.unless-stopped: Наиболее часто используемая мной политика для сервисов. Поведение похоже наalways, но с одним ключевым отличием: если контейнер был явно остановлен пользователем (командойdocker stop), он не будет перезапущен автоматически даже после перезагрузки демона или системы. Это интуитивно понятное поведение для сервисов.
Пример использования в Docker CLI и Compose:
# Запуск сервиса с политикой unless-stopped
docker run -d --name my-app --restart=unless-stopped my-app:latest
# docker-compose.yml
services:
database:
image: postgres:15
restart: unless-stopped
backend:
build: .
restart: on-failure:3 # Перезапустить до 3 раз при ошибке
Важно помнить, что эти политики управляются демоном Docker на уровне хоста. В продакшене для управления жизненным циклом сложных приложений используются оркестраторы (Kubernetes, Docker Swarm), у которых свои, более продвинутые механизмы проверки здоровья и перезапуска.