Какие политики перезапуска (restart policies) есть в Docker?

«Какие политики перезапуска (restart policies) есть в Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Docker есть четыре основные политики перезапуска, которые определяют поведение демона Docker при завершении работы контейнера:

  1. no (значение по умолчанию): Контейнер не будет перезапущен автоматически ни при каких обстоятельствах. Используется для одноразовых задач или контейнеров, управляемых внешними оркестраторами (Kubernetes).
  2. on-failure: Контейнер будет перезапущен только если он завершился с ненулевым кодом выхода (т.е. с ошибкой). Можно указать максимальное количество попыток: --restart=on-failure:5. Это полезно для долгоживущих сервисов, которые должны восстанавливаться после сбоев.
  3. always: Демон Docker будет всегда перезапускать контейнер, независимо от кода выхода. Даже если контейнер был корректно остановлен командой docker stop, он будет перезапущен после перезагрузки демона Docker или хоста. Риск этой политики — бесконечный цикл перезапусков для контейнера с фатальной ошибкой на старте.
  4. 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), у которых свои, более продвинутые механизмы проверки здоровья и перезапуска.