Docker Compose untuk Local Development: Lebih Cepat dan Tidak Ribet
Jadi lo developer dan pernah mengalami masalah kayak “di laptopWorks, di server error”? Atau pernah spend berjam-jam nurunin dependensi karena mismatch versi? Nah, solusi yang bisa membantu adalah Docker Compose. Di artikel ini, saya bakal share cara setup environment development pakai Docker Compose yang benar — supaya lo bisa kerja lebih fokus ke code, bukan ke konfigurasi.
Kenapa Harus Pakai Docker Compose?
Sebelum masuk ke teknis, kita bahas dulu kenapa Docker Compose penting buat development. Jadi ceritanya, aplikasi modern itu jarang berdiri sendiri. Pasti ada database, cache, message queue, dan service-service lain yang harus jalan bareng.
Tanpa Docker Compose, lo harus:
- Install database(MySQL, PostgreSQL, MongoDB) satu-satu di laptop
- Kadang-kadang ada konflik versi antar project
- Setup environment variables yang berbeda-beda per project
- Susah share konfigurasi sama tim
Dengan Docker Compose, semua service didefinisikan dalam satu file, lalu dijalankan sekaligus dengan satu command. Gampang, kan?
Struktur Dasar docker-compose.yml
File docker-compose.yml itu sebenarnya simple. Contoh paling dasar kayak gini:
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
command: npm run dev
db:
image: postgres:15
environment:
POSTGRES_USER: dev
POSTGRES_PASSWORD: devpass
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Dari contoh di atas, lo punya dua service: app (Node.js) dan db (PostgreSQL). Mereka saling kenal karena berada di network yang sama secara default.
Cara Kerja development vs production
Nah, ini yang sering dilupakan orang. Konfigurasi development itu harus berbeda dari production. Di development, lo butuh:
- Hot reload — code berubah langsung tercermin tanpa rebuild
- Volume mounting — source code di-mount ke container
- Debugging tools — lo perlu lihat logs, masuk container, dll
- Port yang accessible — buat testing dari host
Contoh konfigurasi yang mendukung hot reload:
services:
app:
build:
context: .
target: development
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
- DEBUG=true
command: npm run dev
stdin_open: true
tty: true
stdin_open: true dan tty: true penting buat aplikasi yang pake nodemon atau dev server yang perlu interactive input.
Multi-Stage Build untuk Node.js
Supaya image lebih kecil dan build lebih cepat, lo bisa pake multi-stage build. Ini contoh lengkapnya:
FROM node:20-alpine AS base
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-alpine AS development
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
FROM base AS production
COPY --from=development /app/dist ./dist
USER node
CMD ["node", "dist/index.js"]
Terus di docker-compose.yml, specify target build:
services:
app:
build:
context: .
target: development
# ... konfigurasi lain
Tips dan Best Practices
1. Gunakan .dockerignore
Supaya build tidak lambat karena kebawa file yang tidak perlu:
node_modules
.git
*.log
.DS_Store
dist
coverage
.env.local
2. Jangan Mount Langsung node_modules
Kadang-kadang ada issue kalau lo mount langsung folder node_modules dari host. Solusinya:
volumes:
- .:/app
- /app/node_modules # anonymous volume, tidak di-override mount dari host
3. Healthcheck untuk Service Dependency
Aplikasi lo kadang perlu tunggu database benar-benar ready sebelum connect. Pakai healthcheck:
services:
db:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready -U dev -d myapp"]
interval: 5s
timeout: 5s
retries: 5
app:
depends_on:
db:
condition: service_healthy
4. Override Config untuk Kebutuhan Khusus
Kadang lo butuh konfigurasi berbeda di laptop sendiri. Bisa buat docker-compose.override.yml:
version: '3.8'
services:
app:
ports:
- "3001:3000" # Port berbeda untuk local override
environment:
- DEBUG=true
Docker Compose akan merge otomatis file override ini dengan file utama.
Command Penting yang Harus Lo Tahu
Ini command yang sering dipake sehari-hari:
# Start semua service
docker compose up
# Start di background
docker compose up -d
# Build ulang images
docker compose build
# Lihat logs
docker compose logs -f
# Masuk ke container
docker compose exec app sh
# Stop semua service
docker compose down
# Stop dan hapus volume (reset total)
docker compose down -v
Kesimpulan
Docker Compose bukan sekadar alat, tapi investasi buat workflow development lo. Dengan setup yang benar, lo bisa:
- Hemat waktu setup environment baru
- Samakan environment dengan tim
- Cepat switching antar project tanpa conflict
- Mudah onboard developer baru
Bool, itu dia panduan Docker Compose untuk local development. Jangan lupa buat .dockerignore dan pakai multi-stage build biar build semakin cepat. Kalau ada pertanyaan atau mau tau topik lain, langsung aja komentar!
