Как настроить перезапуск контейнера при ошибке

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

Ответ

В Docker политика перезапуска контейнера задается флагом --restart. Я использую её для обеспечения отказоустойчивости сервисов.

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

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

Пример запуска с политикой перезапуска:

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

В Docker Compose политика указывается в секции сервиса:

services:
  web:
    image: nginx:alpine
    restart: unless-stopped

Диагностика: Количество перезапусков контейнера можно проверить командой:

docker inspect --format='{{.RestartCount}}' <container_name>

Для тонкой настройки также можно использовать --restart-delay, чтобы задать паузу между попытками перезапуска.