Docker Compose adalah: Pengertian, Contoh, dan Perintah Dasar
Docker Compose adalah tool untuk mendefinisikan dan menjalankan aplikasi yang terdiri dari beberapa container sekaligus, cukup dari satu file YAML. Misalnya aplikasi web yang butuh database PostgreSQL dan cache Redis: daripada menjalankan tiga perintah docker run panjang, kamu menulis semuanya di compose.yaml lalu menjalankan satu perintah.
Compose sangat populer untuk development lokal karena semua anggota tim bisa menyalakan lingkungan yang sama persis dengan satu perintah. Compose juga sering dipakai untuk menjalankan aplikasi kecil di satu VPS.
Artikel ini membahas pengertian Docker Compose, bedanya dengan Dockerfile, contoh compose.yaml yang realistis, perintah dasar, volume dan network, serta cara membawa aplikasi ke production.
Baca juga: Kubernetes adalah: Pengertian dan Komponennya
Docker Compose adalah Apa dan Bedanya dengan Dockerfile#
Dua istilah ini sering tertukar, padahal fungsinya berbeda:
| Aspek | Dockerfile | Docker Compose |
|---|---|---|
| Fungsi | Resep untuk membangun satu image | Mengatur beberapa container yang berjalan bersama |
| Nama file | Dockerfile |
compose.yaml (atau docker-compose.yml) |
| Isi | Base image, install dependency, copy kode, perintah start | Daftar service, port, volume, network, environment |
| Perintah | docker build |
docker compose up |
Jadi keduanya saling melengkapi. Dockerfile membangun image aplikasimu, lalu Compose menjalankan image itu bersama container lain seperti database dan Redis.
Catatan versi: dulu Compose adalah program terpisah bernama docker-compose (dengan tanda hubung). Sekarang Compose v2 menjadi plugin Docker dan dipanggil dengan docker compose (dengan spasi). Nama file yang direkomendasikan juga compose.yaml, walaupun docker-compose.yml tetap dikenali.
Contoh compose.yaml: App, PostgreSQL, dan Redis#
Misalkan kamu punya aplikasi Node.js dengan Dockerfile di folder yang sama. Berikut compose.yaml yang menjalankan aplikasi, PostgreSQL, dan Redis:
services:
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://app:rahasia@db:5432/appdb
REDIS_URL: redis://cache:6379
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
restart: unless-stopped
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: rahasia
POSTGRES_DB: appdb
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d appdb"]
interval: 5s
retries: 10
cache:
image: redis:7-alpine
volumes:
pgdata:
Penjelasan:
servicesberisi tiga container:app,db, dancache.build: .artinya imageappdibangun dari Dockerfile di folder saat ini. Servicedbdancachememakai image jadi dari Docker Hub.portsmemetakan port 3000 di container ke port 3000 di komputermu. Database dan Redis tidak diberiports, jadi tidak terbuka ke luar.environmentmengisi environment variables. Perhatikan host diDATABASE_URLadalahdb, yaitu nama service.depends_ondenganservice_healthymembuatappmenunggu sampai PostgreSQL benar-benar siap menerima koneksi.volumesmenyimpan data PostgreSQL di named volumepgdata, sehingga data tidak hilang saat container dihapus.
Perintah Dasar Docker Compose#
| Perintah | Fungsi |
|---|---|
docker compose up -d |
Membangun (kalau perlu) dan menjalankan semua service di background |
docker compose ps |
Melihat status container |
docker compose logs -f app |
Mengikuti log service app |
docker compose build |
Membangun ulang image |
docker compose up -d --build |
Build ulang lalu jalankan versi terbaru |
docker compose exec app sh |
Masuk ke shell di container app |
docker compose down |
Menghentikan dan menghapus container serta network |
docker compose down -v |
Sama seperti di atas, plus menghapus volume (data ikut hilang) |
Hati-hati dengan down -v: perintah ini menghapus volume database.
Volume, Network, dan Environment#
Volume#
Container bersifat sementara. Data yang perlu bertahan (database, file upload) harus disimpan di volume. Ada dua jenis yang umum: named volume seperti pgdata yang dikelola Docker, dan bind mount seperti ./src:/app/src yang memetakan folder di komputermu, berguna untuk hot reload saat development.
Network#
Compose otomatis membuat satu network untuk semua service di file yang sama. Setiap service bisa dipanggil memakai namanya sebagai hostname, jadi app cukup terhubung ke db:5432 tanpa tahu IP-nya.
Environment dan File .env#
Daripada menulis password langsung di compose.yaml, simpan di file .env di folder yang sama:
POSTGRES_PASSWORD=ganti-dengan-password-kuat
Lalu panggil di compose dengan ${POSTGRES_PASSWORD}. Jangan commit file .env ke Git.
Kapan Docker Compose Sudah Cukup#
Compose cocok untuk:
- Development lokal: seluruh tim punya stack yang sama dengan satu perintah.
- Aplikasi kecil di satu VPS: misalnya aplikasi internal, landing page dengan backend, atau side project.
- Testing di CI: menyalakan database sementara untuk integration test.
Keterbatasannya mulai terasa ketika aplikasi butuh berjalan di lebih dari satu server, autoscaling, atau rilis tanpa downtime. Compose memang tidak dirancang untuk mengatur container di banyak mesin. Untuk itu orang biasanya beralih ke orchestrator seperti Kubernetes.
Membawa Aplikasi Compose ke Production#
Opsi 1: VPS dengan Docker Compose#
Cara paling langsung: sewa VPS, install Docker, salin proyek, lalu jalankan docker compose up -d. Kamu mendapat kontrol penuh, tapi juga tanggung jawab penuh: update sistem, backup database, firewall, reverse proxy, dan SSL. VPS Linux Helipod di Jakarta dan Singapura mulai Rp 64.900 per bulan (VPS S, 2 vCPU, 2 GB RAM), dan VPS S - EU di Jerman Rp 27.900 per bulan. Harga bisa berubah, cek halaman harga untuk angka terbaru. Lihat pilihannya di VPS murah dan panduan cara akses VPS Linux.
Opsi 2: Service Terpisah di Helipod#
Helipod tidak mengimpor file compose.yaml. Yang dilakukan adalah memecah stack menjadi service terpisah di dalam satu project:
- App: deploy dari repository GitHub/GitLab memakai Dockerfile yang sama dengan yang dipakai Compose, atau biarkan Helipack membuatnya otomatis. Lihat Dockerfile custom di Helipod.
- PostgreSQL: pakai managed Postgres di /database, yang punya paket gratis 1 GB storage dan 100 compute hours per bulan.
- Redis: deploy sebagai service lain dari image
redisdi project yang sama. - Koneksi: service dalam satu project terhubung lewat internal network, mirip network Compose.
- Konfigurasi: isi
DATABASE_URL,REDIS_URL, dan secret lain di environment variables.
Isi environment di compose.yaml kamu bisa langsung jadi daftar environment variables di Helipod.
FAQ#
Docker Compose adalah bagian dari Docker?#
Ya. Compose v2 sudah menjadi plugin resmi Docker dan terpasang bersama Docker Desktop. Di Linux, biasanya dipasang lewat paket docker-compose-plugin.
Apa beda docker-compose dan docker compose?#
docker-compose adalah versi lama (v1) yang terpisah. docker compose adalah versi v2 yang sekarang direkomendasikan.
Apakah Docker Compose bisa untuk production?#
Bisa, untuk aplikasi yang cukup berjalan di satu server. Untuk banyak server dan autoscaling, orchestrator seperti Kubernetes lebih cocok.
Apakah Helipod bisa membaca file compose.yaml?#
Tidak. Di Helipod, setiap container di compose dijadikan service terpisah dalam satu project, dideploy dari Dockerfile, repository, atau Docker image.
Kenapa app saya error "connection refused" ke database saat compose up?#
Biasanya karena app menyala sebelum database siap. Tambahkan healthcheck di service database dan depends_on dengan condition: service_healthy.
Dari Laptop ke Production#
Docker Compose adalah cara terbaik untuk menyatukan stack di laptop. Saat siap online, pilih VPS kalau ingin kontrol penuh, atau deploy servicenya di Helipod. Bandingkan biayanya di halaman harga.