17. Health Checks
Docker healthcheck позволяет Docker Engine периодически проверять, работает ли контейнер корректно. На основе результатов Docker помечает контейнер как healthy, unhealthy или starting.
Инструкция HEALTHCHECK в Dockerfile
Заголовок раздела «Инструкция HEALTHCHECK в Dockerfile»# Базовый синтаксисHEALTHCHECK [OPTIONS] CMD command
# Основные параметры:# --interval=30s — интервал между проверками (по умолчанию 30с)# --timeout=30s — максимальное время ожидания ответа (по умолчанию 30с)# --start-period=0s — время перед первой проверкой (для медленного запуска)# --retries=3 — количество неудачных проверок до unhealthy
# Пример для Node.js APIHEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
# Пример с curlHEALTHCHECK --interval=15s --timeout=5s --retries=3 \ CMD curl -f http://localhost:3000/health || exit 1
# Пример для PostgreSQLHEALTHCHECK --interval=10s --timeout=5s --retries=5 \ CMD pg_isready -U postgres -d mydb || exit 1
# Пример для RedisHEALTHCHECK --interval=10s --timeout=3s --retries=3 \ CMD redis-cli ping || exit 1
# Отключить healthcheck из родительского образаHEALTHCHECK NONEСтатусы healthcheck
Заголовок раздела «Статусы healthcheck»| Статус | Описание |
|---|---|
starting | Контейнер только запустился, ожидание start-period |
healthy | Последняя проверка прошла успешно |
unhealthy | Последние retries проверок провалились |
Просмотр статуса healthcheck
Заголовок раздела «Просмотр статуса healthcheck»# Статус в docker psdocker ps# CONTAINER ID ... STATUS# abc123 ... Up 5 minutes (healthy)# def456 ... Up 2 minutes (unhealthy)# ghi789 ... Up 30 seconds (health: starting)
# Подробная информацияdocker inspect --format='{{json .State.Health}}' mycontainer
# Вывод JSON с историей проверок{ "Status": "healthy", "FailingStreak": 0, "Log": [ { "Start": "2024-01-15T10:00:00Z", "End": "2024-01-15T10:00:01Z", "ExitCode": 0, "Output": "OK" } ]}Endpoint /health в приложении
Заголовок раздела «Endpoint /health в приложении»// Express.js health endpointapp.get('/health', (req, res) => { // Проверить зависимости const dbOk = checkDatabase(); const cacheOk = checkRedis();
if (!dbOk || !cacheOk) { return res.status(503).json({ status: 'unhealthy', db: dbOk ? 'ok' : 'error', cache: cacheOk ? 'ok' : 'error', }); }
res.json({ status: 'healthy', uptime: process.uptime(), timestamp: new Date().toISOString(), });});Healthcheck в Docker Compose
Заголовок раздела «Healthcheck в Docker Compose»version: '3.8'services: api: image: myapi healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # подождать 40с перед первой проверкой
worker: image: myworker depends_on: api: condition: service_healthy # ждать healthy статуса! postgres: condition: service_healthyРеакция на unhealthy контейнер
Заголовок раздела «Реакция на unhealthy контейнер»Docker сам не перезапускает unhealthy контейнеры — это задача оркестратора:
# Docker Compose: restart policyservices: api: restart: unless-stopped # перезапуск при сбое
# Docker Swarm автоматически заменяет unhealthy контейнеры# Kubernetes использует liveness и readiness probes