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

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

Ответ

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

Доступные политики перезапуска:

  • no (значение по умолчанию): Контейнер не перезапускается автоматически.
  • on-failure[:max-retries]: Перезапуск происходит только если контейнер завершился с ненулевым кодом выхода (т.е. с ошибкой). Можно указать максимальное количество попыток.
  • unless-stopped: Контейнер всегда перезапускается, если только он не был явно остановлен пользователем (командой docker stop). Это наиболее полезная политика для production-сервисов, которые должны быть всегда запущены, даже после перезагрузки демона Docker или хоста.
  • always: Контейнер всегда перезапускается. Даже если он был остановлен вручную, демон Docker перезапустит его при старте. Это может быть нежелательно, поэтому unless-stopped часто предпочтительнее.

Пример запуска контейнера Nginx с политикой unless-stopped:

docker run -d --name my-nginx --restart unless-stopped -p 80:80 nginx:alpine

Как это работает на практике:

  1. Если контейнер падает из-за ошибки в приложении (exit code != 0), Docker перезапускает его.
  2. Если хост перезагружается, демон Docker при старте автоматически запустит все контейнеры с политикой always или unless-stopped.
  3. Политика применяется к контейнеру, а не к образу. Её можно изменить для уже запущенного контейнера с помощью docker update.
    # Изменить политику перезапуска для running-контейнера
    docker update --restart unless-stopped my-nginx

Важные нюансы для DevOps:

  • Зацикливание перезапусков: Если контейнер падает сразу после старта (например, из-за ошибки конфигурации), Docker будет пытаться перезапускать его с экспоненциальной задержкой (backoff), что может создать нагрузку. Нужно мониторить логи (docker logs --tail 50 my-nginx) и метрики.
  • Интеграция с оркестраторами: В production-средах (Kubernetes, Docker Swarm) политики перезапуска контейнеров обычно управляются оркестратором (через livenessProbe, restartPolicy), а не флагом --restart.
  • Состояние файловой системы: При перезапуске контейнера по умолчанию используется тот же самый образ. Изменения в файловой системе, сделанные в предыдущем запуске (если не использовались volumes), будут потеряны.