Docker & Containerization: Panduan Praktis

Docker & Containerization: Panduan Praktis

Docker telah mengubah cara kita membangun, mengirim, dan menjalankan aplikasi. Containerization memastikan bahwa aplikasi berjalan dengan cara yang sama di setiap environment — dari development laptop hingga production server. Ini panduan praktis untuk memulai dan mengoptimalkan penggunaan Docker.


📦 Apa Itu Docker?

Docker adalah platform containerization yang memungkinkan Anda mengemas aplikasi beserta semua dependenciesnya ke dalam satu unit portable yang disebut container.

Perbedaan kunci dengan Virtual Machine:

  • Container — Lightweight, berbagi OS kernel, startup dalam detik
  • VM — Full OS per instance, resource intensive, startup dalam menit

🐳 Docker Basics

Dockerfile

Blueprint untuk membuat Docker image:

# Multi-stage build untuk Node.js app
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]

Docker Compose

Orkestrasi multiple containers:

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
    depends_on:
      - db
      - redis

  db:
    image: postgres:16-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass

  redis:
    image: redis:7-alpine

volumes:
  pgdata:

🔧 Best Practices

1. Image Optimization

  • Gunakan alpine base images (ukuran lebih kecil)
  • Multi-stage builds — Pisahkan build dan runtime
  • Layer caching — Urutkan COPY commands dari yang jarang berubah ke sering berubah
  • .dockerignore — Exclude node_modules, .git, logs

2. Security

  • Jangan jalankan container sebagai root
  • Scan images untuk vulnerabilities (Trivy, Snyk)
  • Pin specific versions, hindari latest tag
  • Gunakan read-only filesystem jika memungkinkan

3. Networking

  • Gunakan Docker networks untuk isolasi antar services
  • Jangan expose port yang tidak diperlukan
  • Gunakan service names sebagai hostname antar container

🚀 Production Deployment

Untuk production, pertimbangkan:

  • Docker Swarm — Simple orchestration built-in Docker
  • Kubernetes — Full-featured orchestration untuk skala besar
  • AWS ECS / Google Cloud Run — Managed container services

💡 Tips Praktis

  • docker system prune — Bersihkan unused images dan containers
  • docker stats — Real-time resource usage monitoring
  • docker logs -f — Follow container logs
  • Health checks — Definisikan di Dockerfile atau Compose
  • Volume mounts — Untuk persistent data dan development hot-reload