Kami menggunakan cookies untuk meningkatkan pengalaman Anda di website ini. Dengan melanjutkan, Anda menyetujui penggunaan cookies sesuai Kebijakan Privasi kami.
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
Berapa kali kamu dengar kalimat ini: "Di laptop saya jalan, di server tidak"? Docker menghilangkan masalah ini selamanya.
# 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",
}
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
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"]
# 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
node_modules, .git, .envDengan Docker Compose, onboarding developer baru jadi semudah docker compose up. Tidak perlu install PostgreSQL, Redis, atau konfigurasi apapun secara manual.
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.
Dapatkan tips & insight teknologi terbaru langsung ke inbox Anda.
© 2026 PT Digital Uptime Teknologi Informasi. Hak cipta dilindungi.