Перейти к содержимому

17. Health Checks

Docker healthcheck позволяет Docker Engine периодически проверять, работает ли контейнер корректно. На основе результатов Docker помечает контейнер как healthy, unhealthy или starting.

# Базовый синтаксис
HEALTHCHECK [OPTIONS] CMD command
# Основные параметры:
# --interval=30s — интервал между проверками (по умолчанию 30с)
# --timeout=30s — максимальное время ожидания ответа (по умолчанию 30с)
# --start-period=0s — время перед первой проверкой (для медленного запуска)
# --retries=3 — количество неудачных проверок до unhealthy
# Пример для Node.js API
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
# Пример с curl
HEALTHCHECK --interval=15s --timeout=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
# Пример для PostgreSQL
HEALTHCHECK --interval=10s --timeout=5s --retries=5 \
CMD pg_isready -U postgres -d mydb || exit 1
# Пример для Redis
HEALTHCHECK --interval=10s --timeout=3s --retries=3 \
CMD redis-cli ping || exit 1
# Отключить healthcheck из родительского образа
HEALTHCHECK NONE
СтатусОписание
startingКонтейнер только запустился, ожидание start-period
healthyПоследняя проверка прошла успешно
unhealthyПоследние retries проверок провалились
Окно терминала
# Статус в docker ps
docker 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"
}
]
}
// Express.js health endpoint
app.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(),
});
});
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

Docker сам не перезапускает unhealthy контейнеры — это задача оркестратора:

Окно терминала
# Docker Compose: restart policy
services:
api:
restart: unless-stopped # перезапуск при сбое
# Docker Swarm автоматически заменяет unhealthy контейнеры
# Kubernetes использует liveness и readiness probes