Healthcheck #
Dalam arsitektur berbasis container, container yang berjalan belum tentu berarti aplikasinya siap digunakan. Aplikasi bisa saja masih proses booting, gagal koneksi ke database, atau berada dalam kondisi error meskipun container berstatus running.
Di sinilah health check berperan penting. Docker menyediakan mekanisme health check untuk menentukan apakah sebuah container berada dalam kondisi healthy, unhealthy, atau starting. Docker Compose kemudian bisa memanfaatkan status ini untuk:
- Mengatur urutan startup antar service
- Mencegah service lain bergantung pada aplikasi yang belum siap
- Membantu observability dan troubleshooting
- Menjadi fondasi untuk orchestration yang lebih matang
Artikel ini akan membahas health check secara mendalam di Docker Compose: konsep, konfigurasi, contoh nyata, best practice, dan kesalahan umum.
Apa Itu Health Check? #
Health check adalah perintah periodik yang dijalankan Docker di dalam container untuk mengevaluasi kondisi aplikasi.
Docker akan mengeksekusi command tertentu (misalnya curl, wget, atau script custom) dan menilai hasilnya berdasarkan exit code:
0→ container healthynon-zero→ container unhealthy
Status ini bisa dilihat menggunakan:
docker ps
docker inspect <container>
Perbedaan Status Container #
Docker mengenal beberapa status health:
| Status | Arti |
|---|---|
| starting | Health check belum cukup dijalankan untuk menentukan status |
| healthy | Aplikasi berjalan dan siap digunakan |
| unhealthy | Aplikasi gagal merespons sesuai kriteria health check |
⚠️ Catatan penting: container unhealthy tetap berjalan, Docker tidak otomatis me-restart kecuali dikombinasikan dengan mekanisme lain.
Health Check di Dockerfile vs Docker Compose #
Health Check di Dockerfile #
Health check bisa didefinisikan langsung di Dockerfile:
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
Kelebihan:
- Portable (ikut ke mana pun image dipakai)
- Cocok untuk reusable image
Kekurangan:
- Kurang fleksibel untuk environment berbeda
Health Check di Docker Compose #
Docker Compose memungkinkan override atau definisi langsung di docker-compose.yml:
services:
app:
image: my-app
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
Kelebihan:
- Fleksibel per environment
- Mudah diubah tanpa rebuild image
Properti Health Check di Docker Compose #
test
#
Menentukan command yang dijalankan untuk health check.
Bentuk yang umum:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
Atau menggunakan shell:
test: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"]
Untuk menonaktifkan health check:
test: ["NONE"]
interval
#
Jeda antar eksekusi health check.
interval: 30s
Rekomendasi:
- Jangan terlalu pendek (beban berlebih)
- Jangan terlalu panjang (deteksi lambat)
timeout
#
Batas waktu maksimal satu kali health check.
timeout: 5s
Jika melebihi timeout → dianggap gagal.
retries #
Jumlah kegagalan berturut-turut sebelum container dianggap unhealthy.
retries: 3
start_period
#
Waktu toleransi saat container baru start.
start_period: 20s
Sangat penting untuk aplikasi yang:
- Booting lama
- Menunggu dependency (DB, message broker)
Contoh Kasus Nyata #
Aplikasi + Database #
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
app:
image: my-app
depends_on:
db:
condition: service_healthy
Di sini:
apptidak akan dijalankan sampaidbberstatushealthy
depends_on dan Health Check
#
Secara default, depends_on hanya menunggu container berjalan, bukan sehat.
Dengan health check:
depends_on:
service_name:
condition: service_healthy
Condition yang tersedia:
| Condition | Arti |
|---|---|
| service_started | Container sudah running |
| service_healthy | Container healthy |
| service_completed_successfully | Untuk job / batch |
Health Check untuk Non-HTTP Service #
Health check tidak terbatas HTTP.
Database #
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
Redis #
test: ["CMD", "redis-cli", "ping"]
Message Queue #
Gunakan CLI bawaan atau script custom untuk verifikasi koneksi.
Script Health Check Custom #
Untuk logic kompleks:
#!/bin/sh
if curl -f http://localhost:8080/health && nc -z localhost 5432; then
exit 0
else
exit 1
fi
healthcheck:
test: ["CMD", "/healthcheck.sh"]
Best Practice Health Check #
1. Fokus pada Readiness, Bukan Liveness #
- Health check sebaiknya memastikan aplikasi siap melayani request
- Bukan hanya proses masih hidup
2. Endpoint Khusus /health
#
Pisahkan:
/healthatau/ready- Jangan gunakan endpoint bisnis
3. Gunakan start_period #
Hampir selalu dibutuhkan di aplikasi produksi.
4. Jangan Terlalu Agresif #
Health check terlalu sering = overhead.
5. Jangan Letakkan Logic Berat #
- Hindari query berat
- Hindari dependency eksternal yang tidak stabil
Kesalahan Umum #
❌ Menganggap running = siap
❌ Tidak menggunakan start_period
❌ Health check terlalu kompleks
❌ Bergantung penuh pada health check untuk auto-recovery
Health Check dan Produksi #
Docker Compose bukan orchestration production-grade, namun:
Health check tetap sangat berguna untuk:
- Local development
- Staging
- CI environment
Untuk produksi skala besar:
- Kubernetes (readiness & liveness probe)
- ECS / Nomad / Swarm
Health check di Docker Compose adalah fondasi konsep yang sama.
Penutup #
Health check di Docker Compose adalah fitur sederhana namun krusial untuk membangun sistem container yang lebih stabil, terprediksi, dan mudah di-debug.
Dengan konfigurasi yang tepat, health check membantu:
- Menghindari race condition saat startup
- Meningkatkan keandalan dependency
- Menjadi jembatan menuju orchestration yang lebih matang
Memahami dan menerapkannya dengan benar adalah salah satu ciri engineer yang peduli pada kualitas sistem, bukan sekadar membuat container bisa jalan.