Ответ
Да, Docker-контейнер может быть настроен на автоматический перезапуск при помощи политики перезапуска (restart policy). Это базовая, но критически важная функция для обеспечения отказоустойчивости сервисов в production-среде. Я настраиваю её практически для всех долгоживущих контейнеров (веб-серверы, базы данных, брокеры сообщений).
Доступные политики и сценарии их использования в моей практике:
no(по умолчанию): Контейнер не перезапускается никогда. Использую только для одноразовых задач или отладки.on-failure[:max-retries]: Самый частый выбор. Контейнер перезапускается, если он завершился с ошибкой (ненулевой код выхода). Можно указать максимальное число попыток. Идеально для обработчиков задач (workers), которые могут падать из-за временных ошибок.docker run -d --restart=on-failure:5 my-worker-imageunless-stopped: Основной выбор для production-сервисов. Контейнер всегда перезапускается, если он не был явно остановлен командойdocker stop. После перезагрузки хоста Docker демон автоматически запустит такие контейнеры. Это гарантирует, что сервис будет работать после сбоя системы.docker run -d --name nginx --restart=unless-stopped -p 80:80 nginx:alpinealways: Контейнер перезапускается всегда, даже после ручной остановки. Использую с осторожностью, так как это может привести к неожиданному поведению. Обычно заменяю наunless-stopped.
Важные технические детали:
- Политика применяется при использовании
docker run. Для уже запущенного контейнера её можно изменить командой:docker update --restart=unless-stopped <container_name> - Перезапуск осуществляется демоном Docker, а не изнутри контейнера. Если сам Docker демон не запущен, перезапуск не произойдёт — для этого нужен внешний оркестратор (systemd, k8s).
- При перезапуске с
alwaysилиunless-stoppedпорядок запуска контейнеров не гарантирован. Для зависимостей (например, БД должна запуститься до приложения) нужно использовать health checks и логику ожидания в entrypoint-скриптах или оркестраторы вроде Docker Compose (depends_on) и Kubernetes.