Docker dan Docker Compose: Panduan Praktis untuk Developer Indonesia
Docker sudah jadi skill wajib developer modern. Dari development environment yang konsisten sampai deploy ke production, Docker menyelesaikan masalah "works on my machine" selamanya.
Muhamad Putra Aulia Hidayat
Docker: Solusi "Works on My Machine"
Berapa kali kamu dengar kalimat ini: "Di laptop saya jalan, di server tidak"? Docker menghilangkan masalah ini selamanya.
Konsep Dasar yang Harus Dimengerti
- Image: Blueprint aplikasi — seperti resep masakan
- Container: Aplikasi yang sedang berjalan dari image — seperti masakan yang sudah jadi
- Volume: Storage yang persist antara container restart
- Network: Komunikasi antar container
- Docker Compose: Orkestrasi multiple container sekaligus
Dockerfile untuk Aplikasi Next.js
# Dockerfile
FROM node:22-alpine AS base
# Install dependencies
FROM base AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
# Build
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# Production runner
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
# Jalankan sebagai non-root user
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
// next.config.js - wajib untuk standalone output
module.exports = {
output: "standalone",
}
Docker Compose untuk Development
Ini yang paling berguna: satu file untuk menjalankan seluruh stack — app, database, Redis, semua sekaligus.
# docker-compose.yml
services:
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://postgres:password@db:5432/myapp
REDIS_URL: redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
volumes:
- .:/app
- /app/node_modules # Jangan override node_modules
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
command: redis-server --appendonly yes
# Adminer untuk manage database via browser
adminer:
image: adminer
ports:
- "8080:8080"
depends_on:
- db
volumes:
postgres_data:
redis_data:
# Mulai semua service
docker compose up -d
# Lihat logs
docker compose logs -f app
# Masuk ke container
docker compose exec app sh
# Jalankan migration
docker compose exec app npm run migrate
# Stop semua
docker compose down
# Stop dan hapus volumes (reset database)
docker compose down -v
Dockerfile untuk FastAPI Python
FROM python:3.12-slim
WORKDIR /app
# Install uv untuk dependency management yang cepat
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev
COPY . .
EXPOSE 8000
CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
Multi-Environment dengan .env
# docker-compose.override.yml (development, tidak di-commit)
services:
app:
volumes:
- .:/app # Hot reload di development
environment:
NODE_ENV: development
command: npm run dev
# docker-compose.prod.yml (production)
services:
app:
image: registry.yourdomain.com/myapp:latest
restart: always
environment:
NODE_ENV: production
# Development
docker compose up
# Production
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Tips Penting
- Selalu pakai .dockerignore — exclude
node_modules,.git,.env - Layer caching — taruh yang jarang berubah di atas (COPY package.json sebelum COPY . .)
- Health checks — selalu definisikan healthcheck untuk database
- Non-root user — jangan run container sebagai root
- Multi-stage build — image production jauh lebih kecil
Dengan Docker Compose, onboarding developer baru jadi semudah docker compose up. Tidak perlu install PostgreSQL, Redis, atau konfigurasi apapun secara manual.
Newsletter Digital Uptime
Tips teknologi & bisnis mingguan
Bergabung dengan 2,500+ subscriber yang mendapatkan insight teknologi, tutorial development, dan tips bisnis digital langsung ke inbox mereka setiap minggu.