Kembali ke Blog
DevOps#docker#devops#deployment#backend#tutorial#2026

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

Muhamad Putra Aulia Hidayat

14 Maret 20263 menit baca

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

  1. Selalu pakai .dockerignore — exclude node_modules, .git, .env
  2. Layer caching — taruh yang jarang berubah di atas (COPY package.json sebelum COPY . .)
  3. Health checks — selalu definisikan healthcheck untuk database
  4. Non-root user — jangan run container sebagai root
  5. 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.

dockerdevopsdeploymentbackendtutorial2026

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.

Tidak ada spam. Unsubscribe kapan saja.

Artikel Terkait

Kami menggunakan cookies untuk meningkatkan pengalaman Anda di website ini. Dengan melanjutkan, Anda menyetujui penggunaan cookies sesuai Kebijakan Privasi kami.