TLDR #
Aplikasi modern jarang berdiri sendiri — biasanya butuh database, cache, dan service lain. Docker Compose memungkinkan kamu mendefinisikan semua container itu dalam satu file docker-compose.yml dan menjalankannya dengan satu perintah docker compose up. Artikel ini memandu dari nol sampai aplikasi + database jalan berdampingan.
Pendahuluan #
Menjalankan container satu per satu dengan docker run cepat jadi repot ketika aplikasi punya banyak bagian: aplikasi web, database, Redis, worker, dan seterusnya. Tiap container butuh opsi network, volume, dan environment sendiri.
Docker Compose menyelesaikan ini dengan deklarasi: kamu tulis apa yang kamu mau (container apa, image apa, port berapa, volume apa) dalam file YAML, lalu Compose yang mengatur semuanya.
Prasyarat #
Siapkan:
- Docker terpasang.
- Docker Compose (sudah termasuk di Docker Desktop; di Linux biasanya
docker-compose-plugin).
Verifikasi:
docker --version
docker compose versionContoh Aplikasi Sederhana #
Bayangkan aplikasi web Node.js yang butuh database MariaDB. Struktur minimal:
proyek/
├── app/
│ ├── package.json
│ └── server.js
└── docker-compose.ymlFile docker-compose.yml:
services:
app:
build: ./app
ports:
- "3000:3000"
environment:
DB_HOST: db
DB_USER: user
DB_PASSWORD: password
DB_NAME: appdb
depends_on:
- db
db:
image: mariadb:11
environment:
MARIADB_ROOT_PASSWORD: rootpassword
MARIADB_DATABASE: appdb
MARIADB_USER: user
MARIADB_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:Menjalankan Compose #
Naikkan semua service:
docker compose upMenjalankan di background:
docker compose up -dMelihat status:
docker compose psMenghentikan:
docker compose downMenghentikan sekaligus menghapus volume:
docker compose down -vMemahami Bagian File YAML #
| Bagian | Fungsi |
|---|---|
services |
Daftar container yang akan dijalankan |
image |
Image siap pakai dari registry |
build |
Build image dari Dockerfile |
ports |
Pemetaan port host ke container |
environment |
Environment variable |
volumes |
Penyimpanan persisten |
depends_on |
Urutan start antar service |
depends_on vs healthcheck
#
depends_on hanya mengatur urutan start, bukan memastikan database sudah siap menerima koneksi. Untuk itu, tambahkan healthcheck:
services:
db:
image: mariadb:11
environment:
MARIADB_ROOT_PASSWORD: rootpassword
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
app:
build: ./app
depends_on:
db:
condition: service_healthyEnvironment Variable #
Simpan konfigurasi sensitif di file .env (jangan di-commit):
DB_PASSWORD=rahasiaReferensikan di compose:
services:
db:
image: mariadb:11
environment:
MARIADB_PASSWORD: ${DB_PASSWORD}Volume vs Bind Mount #
| Jenis | Sintaks | Kapan dipakai |
|---|---|---|
| Named volume | db_data:/var/lib/mysql |
Data persisten yang dikelola Docker |
| Bind mount | ./app:/app |
Kode source saat development |
Bind mount berguna untuk hot-reload saat development:
services:
app:
build: ./app
volumes:
- ./app:/appPerintah Umum #
| Perintah | Fungsi |
|---|---|
docker compose up -d |
Jalankan semua service di background |
docker compose down |
Stop & hapus container |
docker compose logs -f |
Lihat log mengalir |
docker compose ps |
Status service |
docker compose restart app |
Restart satu service |
docker compose exec app sh |
Masuk ke shell container |
docker compose build |
Rebuild image |
docker compose pull |
Update image |
Troubleshooting #
Port sudah dipakai #
Ubah pemetaan port host:
ports:
- "3001:3000" # host 3001 → container 3000Service app tidak bisa konek ke db #
Gunakan nama service sebagai hostname (misal DB_HOST: db), bukan localhost. Compose membuat network internal otomatis.
Perubahan kode tidak muncul #
Rebuild image:
docker compose up -d --buildatau gunakan bind mount untuk development.
Keamanan #
- Jangan hardcode password di file compose yang di-commit — gunakan
.env. - Tambahkan
.envke.gitignore. - Batasi port yang di-expose ke host — hanya buka yang benar-benar perlu.
- Jangan expose database ke
0.0.0.0jika tidak perlu.
Ringkasan #
# Mulai semua service
docker compose up -d
# Lihat status & log
docker compose ps
docker compose logs -f
# Stop & bersihkan
docker compose downDokumentasi resmi: docs.docker.com/compose/