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 clonelaludocker 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.buildvsimageโ gunakanbuildjika Anda ingin membangun image dari Dockerfile sendiri, atauimagejika 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. Dengancondition: service_healthy, serviceappbaru akan dijalankan setelahdbbenar-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
.envuntuk data sensitif seperti password dan API key, jangan hardcode dicompose.yaml. - Selalu tambahkan
healthcheckpada service seperti database agardepends_onbenar-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-stoppeduntuk service penting agar otomatis pulih jika container crash. - Beri nama image dan tag yang eksplisit (
postgres:16-alpine, bukanpostgres:latest) agar build lebih konsisten dan mudah di-reproduce. - Manfaatkan
docker compose configsebelum 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 --buildsaat ada perubahan pada Dockerfile agar image di-build ulang. - Manfaatkan
docker compose exec <service> shuntuk masuk ke dalam container yang sedang berjalan untuk debugging. - Untuk proyek dengan banyak environment (development, staging), gunakan multiple compose file dengan
-f, misalnyadocker compose -f compose.yaml -f compose.override.yaml up -d. - Pantau resource pemakaian container dengan
docker statsagar tahu kapan perlu membatasi CPU/memory lewat keydeploy.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), bukandocker-composeyang sudah lama. - Hapus key
version:dari file Compose karena sudah usang. - Gunakan
healthcheckdandepends_ondenganconditionagar urutan startup benar-benar tepat. - Simpan data sensitif di
.env, bukan langsung di file Compose. - Pahami perbedaan
docker compose downdandocker compose down --volumessebelum 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.