Agustus 20, 2026
ChatGPT Image 7 Agu 2026, 09.56.17
Pelajari cara pakai Docker Compose untuk orkestrasi multi-container di satu host lewat docker-compose.yml. Panduan lengkap dari nol hingga siap produksi kecil.

Bayangkan Anda sedang membangun aplikasi web sederhana: butuh satu container untuk backend API, satu untuk database, satu lagi untuk cache Redis, dan mungkin satu reverse proxy di depannya. Kalau semua container itu harus dijalankan satu-satu lewat perintah docker run yang panjang, dengan opsi network, volume, dan environment variable yang berbeda-beda, prosesnya akan sangat merepotkan dan rawan salah ketik.

Di sinilah Docker Compose berperan. Dengan satu file konfigurasi berformat YAML, Anda bisa mendefinisikan seluruh service, jaringan, dan volume yang dibutuhkan aplikasi, lalu menjalankan semuanya dengan satu perintah saja. Bagi developer, sysadmin, maupun pelajar yang baru masuk ke dunia containerization, memahami Docker Compose adalah langkah penting sebelum melangkah ke orkestrasi skala besar seperti Kubernetes.

Artikel ini akan membahas Docker Compose secara menyeluruh: konsep dasar, cara menulis docker-compose.yml yang benar, praktik terbaik, kesalahan umum, hingga tutorial step-by-step yang bisa langsung Anda praktikkan di komputer sendiri.

Apa Itu Docker Compose?

Docker Compose adalah alat bawaan Docker yang digunakan untuk mendefinisikan dan menjalankan aplikasi multi-container. Alih-alih menjalankan setiap container secara manual, Anda cukup menulis satu file compose.yaml (atau docker-compose.yml) yang mendeskripsikan:

  • Services โ€” container apa saja yang dibutuhkan (misalnya app, db, redis)
  • Networks โ€” bagaimana container-container itu saling terhubung
  • Volumes โ€” di mana data disimpan agar tidak hilang saat container dihapus
  • Environment variables โ€” konfigurasi yang disuntikkan ke setiap container

Perlu dicatat, sejak Docker Compose versi 2 (V2) menjadi standar, perintah yang digunakan adalah docker compose (dengan spasi), bukan lagi docker-compose (dengan tanda hubung) seperti pada versi lama (V1). V2 sudah terintegrasi sebagai plugin dari Docker CLI, sehingga performanya lebih cepat dan lebih terintegrasi dengan ekosistem Docker terbaru. Perintah lama docker-compose masih bisa dipakai di banyak sistem lewat symlink kompatibilitas, tapi sebaiknya mulai membiasakan diri dengan sintaks baru.

Satu hal lagi yang sering bikin bingung pemula: dulu file Compose selalu diawali dengan key version: '3.8' di baris paling atas. Sekarang, key ini sudah usang (obsolete) dan sebaiknya dihapus sama sekali dari file Anda. Docker Compose V2 otomatis menggunakan skema terbaru tanpa perlu deklarasi versi, dan menyertakan version: justru akan memicu warning saat Anda menjalankan compose.

Mengapa Docker Compose Penting?

Analoginya begini: kalau docker run itu seperti menyalakan mesin satu per satu dengan tuas manual, maka Docker Compose itu seperti panel kontrol terpusat yang menyalakan seluruh mesin dengan satu tombol, sesuai urutan dan konfigurasi yang sudah Anda tentukan sebelumnya.

Beberapa alasan mengapa Docker Compose sangat berguna untuk development dan skala kecil:

  • Reproducibility โ€” konfigurasi tersimpan dalam file, sehingga tim lain bisa menjalankan environment yang identik hanya dengan git clone lalu docker compose up.
  • Isolasi service โ€” setiap service berjalan di container terpisah, tapi tetap bisa saling berkomunikasi lewat network internal.
  • Manajemen dependency antar-service โ€” Anda bisa mengatur urutan startup, misalnya database harus siap dulu sebelum aplikasi backend jalan.
  • Cocok untuk local development โ€” jauh lebih ringan dibanding Kubernetes untuk kebutuhan development sehari-hari atau proyek skala kecil-menengah.

Struktur Dasar File docker-compose.yml

Berikut contoh struktur dasar untuk aplikasi web dengan tiga service: aplikasi backend, database PostgreSQL, dan Redis sebagai cache.

services:
  app:
    build: ./app
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/appdb
      - REDIS_URL=redis://cache:6379
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    networks:
      - app-network

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=appdb
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d appdb"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - app-network

  cache:
    image: redis:7-alpine
    restart: unless-stopped
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  db-data:

Perhatikan bahwa file di atas tidak menyertakan key version: di baris paling atas โ€” sesuai praktik terbaik terkini.

Penjelasan Tiap Bagian

  • services โ€” daftar container yang akan dijalankan. Setiap service punya nama unik (app, db, cache) yang otomatis menjadi hostname internal untuk komunikasi antar-container.
  • build vs image โ€” gunakan build jika Anda ingin membangun image dari Dockerfile sendiri, atau image jika ingin memakai image jadi dari Docker Hub.
  • ports โ€” memetakan port host ke port container, format "host:container".
  • environment โ€” variabel lingkungan yang disuntikkan ke dalam container.
  • depends_on โ€” mengatur urutan startup. Dengan condition: service_healthy, service app baru akan dijalankan setelah db benar-benar siap menerima koneksi, bukan sekadar sudah “menyala”.
  • volumes โ€” menyimpan data secara persisten agar tidak hilang saat container dihapus atau di-restart.
  • networks โ€” mendefinisikan jaringan virtual internal agar service saling terhubung tanpa perlu expose port ke luar.
  • healthcheck โ€” memberi tahu Docker bagaimana cara mengecek apakah service benar-benar sehat, bukan hanya “running”.

Tutorial Step-by-Step: Menjalankan Multi-Container dengan Docker Compose

Berikut langkah praktis dari nol, cocok dipraktikkan langsung di laptop Anda.

Langkah 1: Pastikan Docker dan Docker Compose Terinstal

Cek versi dengan:

docker --version
docker compose version

Jika muncul versi seperti Docker Compose version v2.x.x, berarti Anda sudah memakai Compose V2 dan siap lanjut.

Langkah 2: Siapkan Struktur Folder Proyek

myproject/
โ”œโ”€โ”€ app/
โ”‚   โ”œโ”€โ”€ Dockerfile
โ”‚   โ””โ”€โ”€ (source code aplikasi)
โ”œโ”€โ”€ compose.yaml
โ””โ”€โ”€ .env

Gunakan nama file compose.yaml sebagai standar terbaru (meskipun docker-compose.yml masih didukung penuh untuk kompatibilitas).

Langkah 3: Buat File .env untuk Menyimpan Secret

Jangan menaruh password langsung di compose.yaml. Simpan di file .env terpisah:

DB_USER=user
DB_PASSWORD=password
DB_NAME=appdb

Lalu panggil di compose.yaml dengan ${DB_USER}, ${DB_PASSWORD}, dan seterusnya. Jangan lupa tambahkan .env ke .gitignore agar tidak ikut ter-commit ke repository.

Langkah 4: Tulis File compose.yaml

Gunakan contoh struktur pada bagian sebelumnya sebagai acuan, sesuaikan dengan kebutuhan service Anda.

Langkah 5: Validasi Konfigurasi

Sebelum menjalankan, validasi dulu sintaksnya:

docker compose config

Perintah ini akan menampilkan konfigurasi final setelah semua variabel di-resolve, sekaligus mendeteksi kesalahan sintaks.

Langkah 6: Jalankan Seluruh Service

docker compose up -d

Flag -d (detached) membuat container berjalan di background sehingga terminal Anda tetap bisa dipakai.

Langkah 7: Cek Status dan Log

docker compose ps
docker compose logs -f app

ps menampilkan status semua service, sementara logs -f menampilkan log secara real-time untuk debugging.

Langkah 8: Hentikan dan Bersihkan

docker compose down

Jika ingin sekaligus menghapus volume data:

docker compose down --volumes

Gunakan opsi ini dengan hati-hati karena data di database akan ikut terhapus.

Studi Kasus Sederhana

Misalkan Anda membangun aplikasi blog kecil dengan backend Node.js, database PostgreSQL, dan Redis untuk session cache. Tanpa Docker Compose, Anda perlu menjalankan tiga perintah docker run terpisah, membuat network manual dengan docker network create, lalu menghubungkan setiap container satu per satu โ€” proses yang memakan waktu dan rawan human error.

Dengan Docker Compose, seluruh proses itu diringkas menjadi satu file compose.yaml dan satu perintah docker compose up -d. Ketika ada anggota tim baru bergabung, mereka tinggal clone repository dan menjalankan perintah yang sama untuk mendapatkan environment development yang identik โ€” tanpa perlu instalasi manual PostgreSQL atau Redis di komputer masing-masing.

Best Practice Profesional

  • Hapus key version: dari file Compose Anda karena sudah usang di Compose V2.
  • Gunakan .env untuk data sensitif seperti password dan API key, jangan hardcode di compose.yaml.
  • Selalu tambahkan healthcheck pada service seperti database agar depends_on benar-benar menunggu service siap, bukan sekadar container menyala.
  • Gunakan named volumes, bukan bind mount, untuk data produksi agar lebih portable dan aman.
  • Pisahkan network per kebutuhan, misalnya network internal untuk database yang tidak perlu terekspos ke luar.
  • Gunakan restart: unless-stopped untuk service penting agar otomatis pulih jika container crash.
  • Beri nama image dan tag yang eksplisit (postgres:16-alpine, bukan postgres:latest) agar build lebih konsisten dan mudah di-reproduce.
  • Manfaatkan docker compose config sebelum deploy untuk memvalidasi konfigurasi.

Kesalahan yang Sering Terjadi

1. Masih Menyertakan Key version:

Penyebab: kebiasaan lama dari tutorial-tutorial sebelum Compose V2 populer. Dampak: memicu warning saat menjalankan compose, meskipun tidak menghentikan proses. Solusi: hapus baris version: dari file Anda; Compose V2 otomatis memakai skema terbaru.

2. Menggunakan depends_on Tanpa Healthcheck

Penyebab: menganggap depends_on menunggu service benar-benar siap. Dampak: aplikasi backend gagal connect ke database karena database masih dalam proses inisialisasi saat container “app” sudah start. Solusi: tambahkan healthcheck pada service database dan gunakan condition: service_healthy di depends_on.

3. Hardcode Password Langsung di File Compose

Penyebab: ingin cepat tanpa memikirkan keamanan. Dampak: risiko kebocoran credential jika file ikut ter-commit ke repository publik. Solusi: gunakan file .env dan pastikan masuk daftar .gitignore.

4. Menghapus Volume Tanpa Sadar

Penyebab: menjalankan docker compose down --volumes tanpa memahami dampaknya. Dampak: seluruh data di database hilang permanen. Solusi: pahami perbedaan docker compose down biasa (data tetap aman) dengan opsi --volumes (data ikut terhapus).

5. Konflik Port di Host

Penyebab: dua service atau proyek berbeda memetakan ke port host yang sama. Dampak: container gagal start dengan error “port already in use”. Solusi: cek port yang sudah dipakai dengan docker compose ps di seluruh proyek aktif, atau ubah pemetaan port di compose.yaml.

Tips dan Rekomendasi Tambahan

  • Gunakan docker compose up --build saat ada perubahan pada Dockerfile agar image di-build ulang.
  • Manfaatkan docker compose exec <service> sh untuk masuk ke dalam container yang sedang berjalan untuk debugging.
  • Untuk proyek dengan banyak environment (development, staging), gunakan multiple compose file dengan -f, misalnya docker compose -f compose.yaml -f compose.override.yaml up -d.
  • Pantau resource pemakaian container dengan docker stats agar tahu kapan perlu membatasi CPU/memory lewat key deploy.resources (di Compose V2, key ini bisa dipakai juga di luar Swarm mode untuk local development).

Kesimpulan

Docker Compose adalah alat yang sangat efektif untuk mengorkestrasi beberapa container dalam satu host, terutama untuk kebutuhan development dan proyek skala kecil hingga menengah. Dengan satu file compose.yaml, Anda bisa mendefinisikan service, network, dan volume secara deklaratif, sehingga environment aplikasi menjadi konsisten dan mudah direproduksi oleh siapa pun di tim Anda.

Poin penting yang perlu diingat:

  • Gunakan perintah docker compose (dengan spasi), bukan docker-compose yang sudah lama.
  • Hapus key version: dari file Compose karena sudah usang.
  • Gunakan healthcheck dan depends_on dengan condition agar urutan startup benar-benar tepat.
  • Simpan data sensitif di .env, bukan langsung di file Compose.
  • Pahami perbedaan docker compose down dan docker compose down --volumes sebelum menjalankannya di lingkungan yang berisi data penting.

Menguasai Docker Compose adalah fondasi yang solid sebelum melangkah ke orkestrasi container skala besar seperti Kubernetes atau Docker Swarm.

Sudah coba menjalankan Docker Compose di proyek Anda sendiri? Bagikan pengalaman atau kendala yang Anda temui di kolom komentar di bawah ini โ€”

mari berdiskusi bersama! Jangan lupa bagikan artikel ini ke rekan developer lain yang sedang belajar containerization, dan pantau terus artikel-artikel terkait Docker, Kubernetes, serta infrastruktur IT lainnya di blog ini.


Frequently Asked Questions (FAQ)

Pertanyaan: Apa perbedaan Docker Compose dengan Docker Swarm atau Kubernetes? Jawaban: Docker Compose ditujukan untuk menjalankan multi-container di satu host, cocok untuk development dan skala kecil. Docker Swarm dan Kubernetes dirancang untuk orkestrasi lintas banyak host (cluster) dengan fitur scaling dan high availability yang lebih kompleks.

Pertanyaan: Apakah docker-compose (dengan tanda hubung) masih bisa dipakai? Jawaban: Secara umum masih bisa lewat kompatibilitas di banyak sistem, tapi standar resmi saat ini adalah docker compose (dengan spasi) sebagai plugin dari Docker CLI versi 2.

Pertanyaan: Apakah saya masih perlu menulis version: '3.8' di file compose.yaml? Jawaban: Tidak perlu. Key version sudah usang di Compose V2 dan sebaiknya dihapus karena akan memicu warning saat dijalankan.

Pertanyaan: Bagaimana cara memastikan database sudah siap sebelum aplikasi mulai berjalan? Jawaban: Tambahkan konfigurasi healthcheck pada service database, lalu gunakan depends_on dengan condition: service_healthy pada service yang bergantung padanya.

Pertanyaan: Apakah data di database akan hilang jika container di-restart? Jawaban: Tidak, selama Anda menggunakan volumes untuk menyimpan data secara persisten. Data hanya akan hilang jika Anda menjalankan docker compose down --volumes secara eksplisit.


Kalau artikel ini membantu, yuk tinggalkan komentar tentang pengalaman Anda memakai Docker Compose

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Dilindungi Oleh
Shield Security