"It works on my machine" — kalimat klasik yang setiap dev pernah ucapkan. Kode jalan di laptop kamu, tapi pas dideploy ke server: error. Beda Node version, beda library version, beda OS, beda env variable. **Docker** = solusi yang ngebungkus aplikasi + semua dependencies-nya jadi satu paket (container) yang bisa jalan identical di mana saja: laptop dev, CI server, production cloud. Sekarang jadi standar industri DevOps.
💡 Docker mengubah dunia DevOps 2013. Sebelum Docker: "deployment" = SSH ke server, install dependencies manual, copy file, restart service. Setelah Docker: `docker run` = aplikasi siap jalan. Speed deployment naik 10x, "deployment failure" turun drastis.
Masalah yang Diselesaikan Docker
"It works on my machine" — ini masalah klasik saat kode berjalan di laptop developer tapi error di server. Docker menyelesaikan ini dengan membungkus aplikasi beserta semua dependensinya ke dalam container.
Container vs Virtual Machine
Virtual Machine: Container (Docker):
┌──────────────┐ ┌──────────────┐
│ App A │ │ App A │
│ Libs │ │ Libs │
│ Guest OS │ └──────────────┘
│ Hypervisor │ ┌──────────────┐
│ Host OS │ │ App B │
│ Hardware │ │ Libs │
└──────────────┘ └──────────────┘
│ Docker Engine │
│ Host OS │
│ Hardware │
└──────────────┘
Container lebih ringan karena berbagi kernel Host OS
Konsep Utama Docker
- Image — Blueprint/template untuk membuat container (seperti class di OOP)
- Container — Instance dari image yang sedang berjalan (seperti object)
- Dockerfile — File instruksi untuk membuat image
- Registry — Tempat menyimpan image (Docker Hub, GitHub Container Registry)
Command Dasar Docker
# Pull image dari registry
docker pull node:20-alpine
# Jalankan container
docker run -d -p 3000:3000 --name my-app node:20-alpine
# Lihat container yang berjalan
docker ps
docker ps -a # termasuk yang stopped
# Stop & remove
docker stop my-app
docker rm my-app
# Lihat logs
docker logs my-app -f
🎭 Analogi sehari-hari
Sebelum Docker = kirim makanan ke kafe lain dengan resep tertulis. Kafe tujuan punya kompor beda, panci beda, bahan beda — hasilnya sering gak konsisten ("kok rasanya beda?"). Docker = kirim makanan dalam wadah hermetic + dapur portable — kompor, panci, bahan, semua di dalam satu paket. Buka di kafe manapun, hasilnya identik.
⚠️ Jebakan yang sering ditemui
- Image gede banget — pakai base image alpine (lebih kecil dari ubuntu) + multi-stage build
- Lupa `.dockerignore` = `node_modules` lokal ke-copy ke image. Image meledak
- Run sebagai root di container = security hole. Pakai non-root user
- Ngebuild tiap deploy lambat — Docker cache layer. Order COPY/RUN di Dockerfile matters
- Volume mount production bingung — "kok data hilang restart?". Persist via volume bukan bind mount
TL;DR: Docker = container yang ngebungkus aplikasi + semua dependencies jadi paket portable yang jalan identical di mana saja. Solve "works on my machine" problem. Container vs VM: container share kernel host (lebih ringan). Konsep: image (blueprint), container (running instance), Dockerfile (instruksi build), registry (Docker Hub). Standar industri DevOps. Foundation Kubernetes + cloud deployment modern.