Docker untuk Developer Web: Dari "Apa Itu Container?" sampai Docker Compose
Lupakan "works on my machine". Docker memastikan kode kamu berjalan identik di semua environment. Panduan praktis dari nol sampai multi-container setup.
"Works on my machine" adalah lelucon lama yang tidak lucu kalau kamu yang kena masalahnya. Docker mengakhiri masalah ini dengan cara yang elegan.
Container vs Virtual Machine
VM menjalankan sistem operasi penuh di dalam sistem operasi. Container hanya mengisolasi proses — lebih ringan, start lebih cepat, dan lebih portabel.
Analogi: VM adalah membangun rumah baru untuk setiap proyek. Container adalah membawa koper berisi semua yang dibutuhkan — bisa dibuka di mana saja.
Konsep Dasar
- Image — blueprint/template (seperti class di OOP)
- Container — instance yang berjalan dari image (seperti object)
- Dockerfile — instruksi untuk membangun image
- Registry — tempat menyimpan image (Docker Hub, GHCR)
Dockerfile untuk Node.js App
# Mulai dari base image resmi Node.js
FROM node:20-alpine
# Set working directory di dalam container
WORKDIR /app
# Copy package files dulu (untuk cache layer)
COPY package*.json ./
# Install dependencies
RUN npm ci --only=production
# Copy source code
COPY . .
# Build aplikasi (kalau ada build step)
RUN npm run build
# Expose port yang digunakan aplikasi
EXPOSE 3000
# Perintah untuk jalankan aplikasi
CMD ["node", "dist/index.js"]
Perintah Docker yang Sering Dipakai
# Build image dari Dockerfile di folder saat ini
docker build -t nama-app:v1 .
# Jalankan container dari image
docker run -p 3000:3000 nama-app:v1
# Jalankan di background (detached)
docker run -d -p 3000:3000 nama-app:v1
# Lihat container yang berjalan
docker ps
# Stop container
docker stop [container-id]
# Lihat log container
docker logs [container-id] -f
Docker Compose — Multi-Container Setup
Aplikasi nyata biasanya butuh beberapa service: app server, database, cache. Docker Compose mengelola semua dalam satu file.
# docker-compose.yml
version: "3.9"
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
cache:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
# Jalankan semua service
docker compose up -d
# Lihat log semua service
docker compose logs -f
# Stop semua service
docker compose down
# Stop dan hapus semua data (volume)
docker compose down -v
.dockerignore — Jangan Lupa Ini
node_modules
.git
.env
*.log
dist
coverage
Sama seperti .gitignore, file ini mencegah file yang tidak perlu masuk ke image.