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 healthy
  • non-zero → container unhealthy

Status ini bisa dilihat menggunakan:

docker ps
docker inspect <container>

Perbedaan Status Container #

Docker mengenal beberapa status health:

StatusArti
startingHealth check belum cukup dijalankan untuk menentukan status
healthyAplikasi berjalan dan siap digunakan
unhealthyAplikasi 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:

  • app tidak akan dijalankan sampai db berstatus healthy

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:

ConditionArti
service_startedContainer sudah running
service_healthyContainer healthy
service_completed_successfullyUntuk 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:

  • /health atau /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.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact