Salah satu use case paling berharga Docker bukan di production — melainkan di local development. Dengan Docker, seluruh tim bisa memiliki environment yang identik tanpa harus menginstal PostgreSQL, Redis, atau service lain langsung di mesin masing-masing. Tidak ada lagi “di komputer saya jalan” karena semua memang menggunakan environment yang sama persis.
Masalah yang Dipecahkan
Tanpa Docker, onboarding developer baru butuh:
- Install Node.js versi yang tepat
- Install PostgreSQL dan buat database
- Install Redis
- Konfigurasi environment variables
- Jalankan migrasi
- … dan seterusnya
Dengan Docker, cukup:
git clone repo
docker compose up
Semua service langsung berjalan, versi sudah dikunci, konfigurasi sudah tersedia.
Setup Development dengan Docker Compose
docker-compose.yml (untuk development):
version: '3.8'
services:
# Aplikasi — jalankan dengan bind mount untuk hot reload
api:
build:
context: .
target: development # gunakan stage development dari Dockerfile
ports:
- "3000:3000"
- "9229:9229" # port Node.js debugger
environment:
- NODE_ENV=development
- DATABASE_URL=postgresql://dev:devpass@db:5432/devdb
- REDIS_URL=redis://cache:6379
volumes:
- .:/app # bind mount source code
- /app/node_modules # jangan override node_modules container
command: npm run dev # nodemon untuk hot reload
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
# Database PostgreSQL
db:
image: postgres:16-alpine
ports:
- "5432:5432" # expose ke host untuk koneksi dari tools (TablePlus, DBeaver)
environment:
POSTGRES_USER: dev
POSTGRES_PASSWORD: devpass
POSTGRES_DB: devdb
volumes:
- postgres_dev:/var/lib/postgresql/data
- ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql # seed awal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U dev -d devdb"]
interval: 5s
timeout: 3s
retries: 10
# Redis
cache:
image: redis:7-alpine
ports:
- "6379:6379"
# Redis GUI (opsional, berguna untuk debugging)
redis-gui:
image: redislabs/redisinsight:latest
ports:
- "8001:8001"
profiles:
- tools # hanya jalan jika eksplisit diaktifkan
# Mailhog — email catcher untuk development
mailhog:
image: mailhog/mailhog
ports:
- "1025:1025" # SMTP
- "8025:8025" # Web UI
volumes:
postgres_dev:
Dockerfile dengan Multiple Stage
# Stage: base
FROM node:20-alpine AS base
WORKDIR /app
COPY package*.json ./
# Stage: development
FROM base AS development
RUN npm install # install semua deps termasuk devDependencies
COPY . .
EXPOSE 3000 9229
CMD ["npm", "run", "dev"]
# Stage: builder
FROM base AS builder
RUN npm ci
COPY . .
RUN npm run build
# Stage: production
FROM node:20-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/index.js"]
Workflow Harian Developer
# Pertama kali setup (sekali saja)
cp .env.example .env
docker compose up --build
# Setelah clone atau pull changes
docker compose up -d
# Saat bekerja — service sudah berjalan di background
# Edit code → hot reload otomatis via nodemon
# Jalankan perintah di dalam container
docker compose exec api npm test
docker compose exec api npx prisma migrate dev --name add_column
docker compose exec api npx prisma studio
# Akses database langsung
docker compose exec db psql -U dev devdb
# Lihat log
docker compose logs -f api
# Restart satu service (misalnya setelah ubah env)
docker compose restart api
# Reset total — hapus semua data dan mulai ulang
docker compose down -v
docker compose up --build
Makefile untuk Shortcut Perintah
Buat Makefile di root project agar perintah lebih pendek:
.PHONY: up down logs shell db migrate seed test
up:
docker compose up -d
down:
docker compose down
build:
docker compose up -d --build
logs:
docker compose logs -f api
shell:
docker compose exec api sh
db:
docker compose exec db psql -U dev devdb
migrate:
docker compose exec api npx prisma migrate dev
seed:
docker compose exec api npx prisma db seed
test:
docker compose exec api npm test
reset:
docker compose down -v && docker compose up -d --build
Penggunaan:
make up # jalankan semua service
make shell # masuk ke shell container api
make migrate # jalankan migrasi
make reset # reset total
Tips Performa Docker Desktop di Windows/macOS
Docker Desktop di Windows dan macOS menggunakan VM Linux di belakang layar. Bind mount ke folder host bisa lambat. Beberapa tips:
Gunakan WSL2 di Windows
Pastikan Docker Desktop menggunakan WSL2 backend dan simpan project di filesystem WSL2 (/home/user/), bukan di Windows (/mnt/c/).
Batasi Resource Docker Desktop
Di Docker Desktop Settings → Resources:
- CPU: sesuaikan, jangan beri semua core
- Memory: 4-8GB sudah cukup untuk kebanyakan proyek
.dockerignore yang Baik
File yang masuk ke build context mempengaruhi kecepatan build. Pastikan .dockerignore sudah mengecualikan semua yang tidak perlu:
node_modules
.git
.env*
*.log
dist
coverage
.nyc_output
Kesimpulan
Docker untuk development environment adalah investasi kecil yang memberikan manfaat besar: konsistensi antar mesin, onboarding yang cepat, dan tidak ada lagi konflik versi. Dengan docker-compose.yml yang baik dan Makefile untuk shortcut, developer bisa fokus menulis kode tanpa khawatir soal setup infrastruktur.
Di artikel berikutnya, kita bahas Docker Security — praktik keamanan yang harus diterapkan saat menggunakan Docker di production.
Kiki/🎮🍉⌨️🍩💻