Best Practice Docker Compose #

Docker Compose adalah tool penting untuk mengelola aplikasi multi-container, terutama pada fase development, testing, hingga staging. Dengan Docker Compose, kita dapat mendefinisikan seluruh stack aplikasi (service, network, volume, environment) dalam satu file deklaratif (docker-compose.yml).

Namun, seiring kompleksitas aplikasi meningkat, penggunaan Docker Compose tanpa best practice justru dapat menimbulkan masalah: konfigurasi sulit dirawat, environment tidak konsisten, risiko keamanan, hingga performa yang buruk.

Artikel ini membahas best practice Docker Compose secara mendalam dan agnostik terhadap bahasa pemrograman, sehingga dapat diterapkan untuk berbagai jenis stack (backend, frontend, database, message broker, dsb).

Pisahkan Tanggung Jawab Setiap Service #

Prinsip #

Satu service dalam Docker Compose sebaiknya merepresentasikan satu proses utama (single responsibility).

Contoh Buruk #

  • Satu container menjalankan:

    • Web server
    • Worker background
    • Cron job

Contoh Baik #

  • api → HTTP API
  • worker → background job
  • scheduler → cron / scheduled task

Manfaat #

  • Mudah di-scale
  • Mudah di-debug
  • Lebih dekat ke arsitektur produksi

Gunakan .env untuk Konfigurasi Environment #

Prinsip #

Hindari hardcode konfigurasi di dalam docker-compose.yml.

Praktik #

  • Gunakan file .env untuk:

    • Port
    • Credential
    • Environment flag (APP_ENV, DEBUG)

Contoh #

APP_ENV=development
DB_HOST=db
DB_PORT=5432
services:
  api:
    env_file:
      - .env

Manfaat #

  • Konfigurasi lebih rapi
  • Mudah dibedakan antar environment
  • Lebih aman (terutama jika digabung dengan .gitignore)

Jangan Gunakan latest Tag Image #

Prinsip #

Tag latest bersifat ambigu dan tidak deterministik.

Praktik #

Gunakan versi spesifik:

image: postgres:16-alpine

Manfaat #

  • Build reproducible
  • Menghindari bug mendadak akibat update image

Gunakan Build Context dan Dockerfile yang Jelas #

Prinsip #

Pisahkan tanggung jawab antara:

  • Dockerfile → bagaimana image dibangun
  • Docker Compose → bagaimana container dijalankan

Praktik #

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile

Manfaat #

  • Lebih mudah di-debug
  • Konsisten dengan pipeline CI/CD

Gunakan Network Default, Jangan Over-Expose Port #

Prinsip #

Service dalam Compose otomatis berada dalam satu network internal.

Praktik #

  • Expose port hanya jika perlu diakses dari host
services:
  api:
    ports:
      - "8080:8080"

  db:
    image: postgres:16
    # tidak perlu ports

Manfaat #

  • Lebih aman
  • Menyerupai kondisi produksi

Gunakan Volume Secara Bijak #

Prinsip #

Volume digunakan untuk:

  • Persistensi data
  • Development convenience (hot reload)

Praktik #

volumes:
  db_data:

services:
  db:
    volumes:
      - db_data:/var/lib/postgresql/data

Hindari #

  • Mount seluruh project ke container production-like

Tambahkan depends_on, Tapi Jangan Andalkan untuk Readiness #

Fakta Penting #

depends_on tidak menjamin service sudah siap, hanya container sudah dijalankan.

Praktik #

services:
  api:
    depends_on:
      - db

###** Best Practice Tambahan

  • Gunakan:

    • healthcheck
    • retry logic di aplikasi

Gunakan healthcheck #

Prinsip #

Healthcheck membantu:

  • Observability
  • Dependency readiness

Contoh #

services:
  api:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 10s
      timeout: 3s
      retries: 3

Bedakan File Compose per Environment #

Pola Umum #

  • docker-compose.yml → base
  • docker-compose.dev.yml
  • docker-compose.prod.yml

Contoh Penggunaan #

docker compose -f docker-compose.yml -f docker-compose.dev.yml up

Manfaat #

  • Konfigurasi tidak tercampur
  • Lebih aman untuk production

Gunakan Resource Limit #

Prinsip #

Mencegah satu container memakan seluruh resource host.

Contoh #

services:
  api:
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: 512M

Catatan: sebagian limit hanya efektif di Docker Swarm / environment tertentu, namun tetap baik untuk dokumentasi intent.


Logging: Biarkan ke STDOUT / STDERR #

Prinsip #

Docker Compose bukan tempat logging logic.

Praktik #

  • Aplikasi log ke STDOUT
  • Gunakan logging driver jika perlu
services:
  api:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Jangan Perlakukan Docker Compose sebagai Production Orchestrator #

Prinsip Penting #

Docker Compose bukan Kubernetes.

Cocok Untuk #

  • Development
  • Testing
  • Demo
  • Local staging

Untuk Production Skala Besar #

  • Kubernetes
  • Nomad
  • ECS / EKS / GKE

Dokumentasikan Docker Compose Anda #

Praktik #

  • Gunakan comment

  • Jelaskan:

    • Peran service
    • Alasan konfigurasi tertentu
# API utama aplikasi
api:
  ...

Penutup #

Docker Compose adalah fondasi penting dalam workflow modern berbasis container. Dengan menerapkan best practice:

  • Konfigurasi menjadi lebih bersih dan terawat
  • Environment lebih konsisten
  • Risiko bug dan security issue berkurang

Docker Compose yang ditulis dengan baik akan mempermudah transisi ke environment produksi yang lebih kompleks seperti Docker Swarm atau Kubernetes.

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