Какие политики перезапуска Docker-контейнера вы знаете?

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

Ответ

В Docker есть четыре основные политики перезапуска, управляемые флагом --restart в команде docker run или в docker-compose.yml:

  • no (по умолчанию): Контейнер никогда не перезапускается автоматически.
  • on-failure: Контейнер перезапускается только в случае завершения с ненулевым кодом ошибки. Можно указать максимальное количество попыток: --restart=on-failure:5.
  • always: Docker всегда перезапускает контейнер, независимо от кода выхода. Если контейнер остановлен вручную, демон Docker перезапустит его при своей перезагрузке.
  • unless-stopped: Поведение схоже с always, но если контейнер был явно остановлен (командой docker stop), он не будет перезапущен даже после перезагрузки демона Docker.

Практическое применение и нюансы:

# Запуск контейнера с политикой unless-stopped
sudo docker run -d --name my_app --restart unless-stopped nginx:alpine

# В docker-compose.yml
services:
  app:
    image: nginx:alpine
    restart: unless-stopped
  • Экспоненциальная задержка: Docker использует экспоненциальную задержку между попытками перезапуска, чтобы избежать нагрузки на систему при сбоях.
  • Управление через systemd: Для гарантированного запуска контейнеров при загрузке всей системы необходимо, чтобы сам демон Docker был настроен на автозапуск (например, через systemctl enable docker).