Может ли Docker-контейнер самостоятельно перезапускаться?

«Может ли Docker-контейнер самостоятельно перезапускаться?» — вопрос из категории DevOps, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, Docker-контейнер может быть настроен на автоматический перезапуск при помощи политики перезапуска (restart policy). Это базовая, но критически важная функция для обеспечения отказоустойчивости сервисов в production-среде. Я настраиваю её практически для всех долгоживущих контейнеров (веб-серверы, базы данных, брокеры сообщений).

Доступные политики и сценарии их использования в моей практике:

  • no (по умолчанию): Контейнер не перезапускается никогда. Использую только для одноразовых задач или отладки.
  • on-failure[:max-retries]: Самый частый выбор. Контейнер перезапускается, если он завершился с ошибкой (ненулевой код выхода). Можно указать максимальное число попыток. Идеально для обработчиков задач (workers), которые могут падать из-за временных ошибок.
    docker run -d --restart=on-failure:5 my-worker-image
  • unless-stopped: Основной выбор для production-сервисов. Контейнер всегда перезапускается, если он не был явно остановлен командой docker stop. После перезагрузки хоста Docker демон автоматически запустит такие контейнеры. Это гарантирует, что сервис будет работать после сбоя системы.
    docker run -d --name nginx --restart=unless-stopped -p 80:80 nginx:alpine
  • always: Контейнер перезапускается всегда, даже после ручной остановки. Использую с осторожностью, так как это может привести к неожиданному поведению. Обычно заменяю на 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.