1. Pengenalan Docker
Docker adalah platform open-source yang memungkinkan developer untuk mengemas aplikasi beserta seluruh dependensinya ke dalam satu unit yang disebut container. Diperkenalkan oleh Solomon Hykes pada tahun 2013 melalui perusahaan Docker Inc., platform ini telah mengubah cara developer membangun, mengirim, dan menjalankan aplikasi secara drastis.
Sebelum Docker, masalah klasik yang sering dihadapi tim developer adalah "works on my machine" — aplikasi berjalan sempurna di komputer developer, tetapi gagal di lingkungan production. Docker memecahkan masalah ini dengan memastikan bahwa aplikasi berjalan di lingkungan yang konsisten di mana pun — dari laptop developer hingga server production.
Mengapa Docker Penting?
| Keunggulan | Penjelasan |
|---|---|
| Konsistensi | Aplikasi berjalan sama di semua environment — development, staging, production |
| Isolasi | Setiap container terisolasi, tidak saling mengganggu satu sama lain |
| Portabilitas | Container bisa dipindahkan antar server tanpa perubahan kode |
| Ringan | Container berbagi host OS kernel, jauh lebih ringan dari VM |
| Cepat | Container bisa dimulai dalam hitungan detik, bukan menit |
| Skalabel | Mudah menambah atau mengurangi container sesuai beban |
| Ekosistem Luas | Docker Hub menyediakan jutaan image siap pakai |
Konsep dasar Docker melibatkan tiga komponen utama:
- Docker Engine — runtime yang menjalankan container (terdiri dari daemon dan CLI)
- Docker Image — template read-only yang berisi kode aplikasi dan dependencies
- Docker Container — instance yang berjalan dari sebuah image
2. Containers vs Virtual Machines
Banyak developer pemula bingung antara container dan virtual machines (VM). Meskipun keduanya bertujuan untuk mengisolasi aplikasi, cara kerjanya sangat berbeda dan masing-masing memiliki kelebihan tersendiri.
Apa itu Virtual Machine?
Virtual Machine mensimulasikan seluruh komputer — termasuk hardware virtual, operating system, dan aplikasi. Setiap VM menjalankan OS sendiri (guest OS) di atas hypervisor yang berjalan di host OS. Ini membuat VM sangat berat karena setiap instance membawa overhead OS lengkap.
Apa itu Container?
Container berbagi kernel host OS dan hanya mengisolasi aplikasi beserta dependensinya. Container menggunakan fitur Linux kernel seperti namespaces dan cgroups untuk isolasi dan pembatasan resource. Ini membuat container jauh lebih ringan dan cepat dibanding VM.
Perbandingan Detail
| Aspek | Container (Docker) | Virtual Machine |
|---|---|---|
| Ukuran | 🟢 MB (ringan) | 🔴 GB (berat) |
| Startup Time | 🟢 Detik | 🔴 Menit |
| Isolasi | 🟡 Process-level | 🟢 Hardware-level |
| OS | Berbagi host kernel | OS sendiri per VM |
| Resource Usage | 🟢 Rendah | 🔴 Tinggi |
| Portability | 🟢 Sangat portable | 🟡 Terbatas |
| Keamanan | 🟡 Cukup aman | 🟢 Lebih aman |
| Density | Ratusan per host | Puluhan per host |
| Contoh Tool | Docker, Podman | VMware, VirtualBox, KVM |
Container dan VM bukan saling menggantikan — mereka bisa digunakan bersama. Banyak perusahaan besar menjalankan Docker containers di dalam VM untuk mendapatkan keuntungan dari keduanya: isolasi hardware VM dan efisiensi container.
3. Instalasi Docker
Docker tersedia untuk berbagai platform. Berikut panduan instalasi untuk masing-masing sistem operasi:
Linux (Ubuntu/Debian)
8. Docker Compose
Docker Compose adalah tool untuk mendefinisikan dan menjalankan aplikasi multi-container. Dengan satu file YAML (docker-compose.yml), Anda bisa mendefinisikan semua layanan, jaringan, dan volumes yang dibutuhkan aplikasi Anda. Compose sangat memudahkan setup development dan deployment.
Contoh docker-compose.yml Lengkap
# docker-compose.yml
# Aplikasi Web + Database + Redis
version: "3.8"
services:
# === Aplikasi Web (Node.js) ===
web:
build:
context: .
dockerfile: Dockerfile
container_name: web-app
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:password@db:5432/myapp
- REDIS_URL=redis://cache:6379
volumes:
- ./uploads:/app/uploads
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
networks:
- app-network
restart: unless-stopped
# === Database PostgreSQL ===
db:
image: postgres:16-alpine
container_name: postgres-db
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- postgres-data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-network
restart: unless-stopped
# === Redis Cache ===
cache:
image: redis:7-alpine
container_name: redis-cache
command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes:
- redis-data:/data
networks:
- app-network
restart: unless-stopped
# === Nginx Reverse Proxy ===
nginx:
image: nginx:alpine
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- web
networks:
- app-network
restart: unless-stopped
volumes:
postgres-data:
redis-data:
networks:
app-network:
driver: bridge
Perintah Docker Compose
# Jalankan semua layanan (foreground)
docker compose up
# Jalankan di background (detached)
docker compose up -d
# Build ulang image sebelum start
docker compose up --build
# Hentikan semua layanan
docker compose down
# Hentikan dan hapus volumes (HATI-HATI: data hilang!)
docker compose down -v
# Lihat status layanan
docker compose ps
# Lihat log layanan tertentu
docker compose logs web
docker compose logs -f db # -f = follow (live)
# Jalankan perintah di dalam container
docker compose exec web npm run migrate
docker compose exec db psql -U user -d myapp
# Scale layanan tertentu
docker compose up -d --scale web=3
# Restart satu layanan
docker compose restart web
Gunakan depends_on dengan health check untuk memastikan layanan dependency benar-benar siap sebelum layanan utama dimulai. Tanpa ini, aplikasi bisa gagal karena database belum siap menerima koneksi.
9. Docker Hub
Docker Hub adalah registry publik terbesar untuk Docker images. Di Docker Hub, Anda bisa menemukan jutaan image siap pakai — dari database, web server, bahasa pemrograman, hingga aplikasi lengkap. Docker Hub juga mendukung automated builds yang bisa membangun image langsung dari repository GitHub atau Bitbucket.
Perintah Docker Hub
# Login ke Docker Hub
docker login
# Masukkan username dan password
# Tarik image dari Docker Hub
docker pull nginx:latest
docker pull postgres:16-alpine
docker pull python:3.12-slim
# Cari image di Docker Hub
docker search mysql
docker search redis
# Push image ke Docker Hub
# 1. Tag image dengan format username/repo:tag
docker tag my-app:v1.0 username/my-app:v1.0
docker tag my-app:v1.0 username/my-app:latest
# 2. Push ke Docker Hub
docker push username/my-app:v1.0
docker push username/my-app:latest
# Logout dari Docker Hub
docker logout
Private Registry
Selain Docker Hub, Anda juga bisa menggunakan private registry untuk keamanan lebih:
# Jalankan registry lokal (untuk development)
docker run -d -p 5000:5000 --name registry registry:2
# Tag dan push ke registry lokal
docker tag my-app:v1.0 localhost:5000/my-app:v1.0
docker push localhost:5000/my-app:v1.0
# Tarik dari registry lokal
docker pull localhost:5000/my-app:v1.0
# Cloud registries:
# - AWS ECR: aws ecr
# - Google GCR: gcr.io
# - Azure ACR: azurecr.io
# - GitHub GHCR: ghcr.io
# - GitLab: registry.gitlab.com
10. Best Practices Docker
Mengikuti best practices saat bekerja dengan Docker sangat penting untuk keamanan, performa, dan maintainability. Berikut adalah panduan lengkap yang harus Anda ikuti:
1. Gunakan Multi-Stage Build
# ❌ JELEK — image besar dengan semua build tools
FROM node:20
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
CMD ["node", "dist/server.js"]
# ✅ BAIK — multi-stage, image kecil
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]
2. Gunakan .dockerignore
node_modules
.git
.gitignore
.env
.env.local
*.md
docker-compose*.yml
Dockerfile
.dockerignore
coverage
.nyc_output
dist
build
*.log
.vscode
.idea
3. Best Practices Lainnya
| Praktik | Alasan |
|---|---|
| Gunakan image versi spesifik | node:20.11-alpine lebih stabil dari node:latest |
| Jangan pakai root user | Serangan container escape bisa akses host |
| Minimalkan layers | Gabungkan RUN commands untuk kurangi ukuran |
| Copy requirements dulu | Manfaatkan layer caching saat dependency tidak berubah |
| Gunakan HEALTHCHECK | Docker bisa monitor kesehatan container |
| Scan image untuk vulnerabilities | Gunakan docker scout atau Trivy |
| Jangan simpan secrets di image | Gunakan environment variable atau Docker secrets |
| Gunakan restart policy | restart: unless-stopped untuk high availability |
| Set resource limits | Batasi CPU dan memory agar container tidak rakus |
# Scan image untuk vulnerabilities
docker scout cves my-app:v1.0
# Batasi resource container
docker run -d \
--name my-app \
--memory="512m" \
--cpus="1.5" \
--restart=unless-stopped \
my-app:v1.0
# Lihat resource usage container
docker stats
# Bersihkan semua resource tidak terpakai
docker system prune -a --volumes
# Lihat ukuran image
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
11. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Docker: