Как Docker помогает устранить проблему недоступности сервиса?

«Как Docker помогает устранить проблему недоступности сервиса?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Docker сам по себе не является оркестратором, но его экосистема предоставляет инструменты для повышения доступности сервисов.

Основные подходы:

  1. Перезапуск контейнеров (Restart Policies): Политика перезапуска контейнера при его сбое.

    docker run --restart=always my-service
    • no (по умолчанию): Не перезапускать.
    • on-failure[:max-retries]: Перезапускать при ошибке выхода.
    • always: Всегда перезапускать.
    • unless-stopped: Всегда, кроме случаев явной остановки пользователем.
  2. Оркестрация (Docker Swarm / Kubernetes): Эти системы поверх Docker обеспечивают высокую доступность:

    • Репликация: Запуск нескольких экземпляров (реплик) сервиса на разных узлах.
    • Self-healing: Автоматический перезапуск контейнеров при их падении и пересоздание на других узлах при отказе узла.
    • Балансировка нагрузки: Входящий трафик распределяется между здоровыми репликами.
    • Rolling updates: Постепенное обновление без простоя.
  3. Мониторинг и оповещение: Интеграция с системами мониторинга (Prometheus, cAdvisor) для отслеживания здоровья контейнеров и своевременного реагирования.

  4. Healthchecks: Определение в Dockerfile или docker-compose.yml команды для проверки здоровья приложения. Оркестратор использует её, чтобы определять, готов ли контейнер принимать трафик.

    HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 
    CMD curl -f http://localhost:8080/health || exit 1

Таким образом, Docker является фундаментом для построения отказоустойчивых систем в сочетании с политиками перезапуска и оркестраторами.