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 APIworker→ background jobscheduler→ 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
.envuntuk:- 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→ basedocker-compose.dev.ymldocker-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.