stdsquare²
🎓 Kelas
stdsquare / materi / slides / pertemuan-04
Tema
Japan
Arcade
Dark Retro
Font
‹ Daftar slide Pertemuan 4: Virtualisasi & Containerization (VM vs Docker, Dockerfile)
PEBD6027 · RPS minggu 4 · 2x50 menit

Virtualisasi & Containerization

VM (Hypervisor) vs Container (Docker) — Cloud System Bisdig

Peta Pembelajaran Hari Ini

Sub-CPMK 4: membuat dan menjalankan container Docker. Empat indikator capaian.

Jam ke-1 (50 menit)
  • VM Hypervisor Type 1 vs Type 2
  • Container Docker: share kernel host
  • Komparasi VM vs container (overhead, density)
Jam ke-2 (50 menit)
  • Dockerfile anatomi (FROM, RUN, COPY, CMD)
  • docker run: port & volume mapping
  • Hands-on: containerize web Node.js
Posisi alur 14P: setelah deployment (P3), hari ini fondasi teknis P11 Kubernetes & P12 CI/CD. Install Docker Desktop sebelum kelas.

Mengapa Tokopedia Pindah ke Container

Container memungkinkan microservices, deploy cepat, dan density tinggi — alasan enterprise pindah dari VM.

Era VM (2010)
~10 app/host
utilisasi ~15-30%, OS overhead besar
Era Container (2015+)
~100 app/host
utilisasi 60-80%, share kernel
Pertanyaan pemantik: mengapa density naik 10×? Apa yang dibagikan container yang tidak dibagi VM?
Bagian 1 · 1/4
VM vs Container
Diskusi kelas: bila container lebih efisien, mengapa bank masih pakai VM untuk core banking?

VM: Hypervisor Type 1 vs Type 2

Hypervisor adalah software yang membuat dan mengelola VM. Dua tipe dengan use case berbeda.

Type 1 — Bare Metal
  • Langsung di hardware (tanpa host OS)
  • Contoh: VMware ESXi, Hyper-V, KVM, Xen
  • Performa maksimal
  • Dipakai AWS, Azure, GCP
Type 2 — Hosted
  • Di atas host OS (Windows, Mac, Linux)
  • Contoh: VirtualBox, VMware Workstation, Parallels
  • Overhead lebih besar
  • Dipakai dev/test di laptop
AWS memakai KVM (Type 1 modified) sebagai hypervisorNitro — performa near-bare-metal untuk EC2 instance.

Container: Share Kernel Host

Container tidak punya kernel sendiri — share kernel Linux host via namespace & cgroup. Inilah alasan efisiensinya.

VIRTUAL MACHINEApp ALibsGuest OSApp BGuest OSHypervisorCONTAINERApp ALibsApp BApp CApp DKERNEL HOST (Linux namespace + cgroup)VM: tiap instance punya Guest OS (ratusan MB) | Container: share kernel host (MB)

Komparasi VM vs Container

Lima dimensi trade-off. Pilih berdasarkan kebutuhan isolasi vs efisiensi vs portabilitas.

DimensiVMContainer
Overhead resourceTinggi (guest OS ~500MB-1GB)Rendah (share kernel, ~10-100MB)
Startup timeLambat (menit)Cepat (detik)
Density per hostRendah (~10 VM)Tinggi (~100 container)
IsolasiKuat (kernel terpisah)Sedang (share kernel)
PortabilitasRendah (OS-specific)Tinggi (Docker image)
Aturan praktis: VM untuk isolasi kuat (bank core, compliance), container untuk microservices & dev velocity (startup, e-commerce).

Hitung dari Nol: Density Container vs VM

Host 64 GB RAM, 16 vCPU. Berapa container vs VM yang muat?

LangkahModelPerhitunganHasil
1VM (4GB + 1 vCPU per VM)min(64/4, 16/1)= 16 VM maksimum
2VM overhead guest OS 800MB × 1616 × 0,8GB= 12,8 GB terbuang OS guest
3Container (512MB-1GB, share kernel)64GB / 0,7GB avg= ~90 container realistis
4Container overhead host kernel~2GB tetap= headroom besar
5Ratio density90 / 16= ~6× container lebih padat
6Implikasi cost (m5.large $0,096/jam)50 container: 1 node vs 50 VM: 4 nodecontainer hemat ~75% infra
Angka ilustratif — realitas bervariasi per workload. Tapi orde besarnya: container 4-8× lebih efisien dari VM.
Bagian 2 · 2/4
Dockerfile & Image
Diskusi: apakah Dockerfile sama dengan shell script? Mengapa deklaratif penting di sini?

Anatomi Dockerfile

Empat instruksi utama: FROM, RUN, COPY, CMD. Cukup untuk membangun image aplikasi web.

# Dockerfile web Node.js sederhana
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Instruksi Inti
  • FROM — base image (node, python, ubuntu)
  • RUN — eksekusi command saat build
  • COPY — salin file dari host ke image
  • CMD — command default saat container jalan
Best Practice
  • COPY package.json SEBELUM COPY .
  • Manfaatkan cache layer (dependency stabil)
  • Pakai base image resmi (node:18-alpine)
  • alpine = ukuran kecil (~5MB base)

Layer & Cache Build

Setiap instruksi Dockerfile = 1 layer. Cache membuat rebuild cepat — hanya layer yang berubah yang di-rebuild.

LayerInstruksiCache?
1FROM node:18-alpineCache (base tetap)
2WORKDIR /appCache (jarang berubah)
3COPY package*.json ./Cache (jika package.json tak berubah)
4RUN npm installCache (ikut package.json)
5COPY . .Invalid (kode berubah tiap build)
6CMD ["node", "server.js"]Invalid (ikut layer 5)
Urutan layer menentukan efisiensi rebuild. Letakkan instruksi stabil di atas, yang sering berubah di bawah. Build ulang hanya butuh detik bukan menit.

Best Practice Dockerfile

Produksi-grade Dockerfile butuh pertimbangan ekstra: ukuran, keamanan, reproducibility.

Multi-stage Build
  • Build tool di stage 1
  • Runtime image minimal di stage 2
  • Hasil: image 20-50MB bukan 500MB
.dockerignore
  • Abaikan node_modules, .git, test
  • Build context kecil = build cepat
  • Cegah secret bocor ke image
Non-root User
  • Jangan jalan sebagai root di container
  • Buat user khusus (USER app)
  • Mitigasi privilege escalation
Image produksi tanpa multi-stage & non-root = tanda engineer pemula. Audit Dockerfile jadi tugas security reviewer.
Bagian 3 · 3/4
Run Container: docker run
Diskusi: apa beda docker run -p dengan -v? Kapan pakai keduanya?

docker run: Port & Volume Mapping

Dua flag paling sering: -p untuk port (akses eksternal), -v untuk volume (persistensi data).

# Web server akses http://localhost:8080
docker run -d -p 8080:3000 --name web myapp:latest

# Database PostgreSQL dengan data persisten
docker run -d -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  postgres:15
-p PORT MAPPING
  • Format: HOST:CONTAINER
  • -p 8080:3000 = host 8080 → container 3000
  • Tanpa -p, container isolasi (hanya jaringan internal)
-v VOLUME MAPPING
  • Format: VOLUME_NAME:CONTAINER_PATH
  • Data persisten saat container rm
  • Wajib untuk database, file upload, logs

Lifecycle: pull, create, start, stop, rm

Container punya siklus hidup. Memahami ini kunci debugging sehari-hari.

CommandFungsiEffect
docker pull IMAGEUnduh image dari registryImage tersimpan lokal, container belum jalan
docker create IMAGEBuat container dari imageContainer status created, belum start
docker start NAMEJalankan containerStatus running
docker stop NAMEHentikan gracefulStatus exited, data volume tetap
docker rm NAMEHapus containerHilang, volume tetap kecuali -v
docker run IMAGEcreate + start sekali jalanShortcut paling sering dipakai
docker ps untuk lihat container running, docker ps -a untuk semua termasuk exited. docker logs NAME untuk debugging.

Hands-on: Web Node.js Containerized

Mari containerize web server Express sederhana — simulasi realistis startup Bisdig.

Langkah 1-3
  • 1. Buat app.js Express "Hello Cloud"
  • 2. Tulis package.json + npm install
  • 3. Tulis Dockerfile (lihat Slide 10)
  • 4. .dockerignore: node_modules, .git
Langkah 5-7
  • 5. docker build -t myapp:1.0 .
  • 6. docker run -p 3000:3000 myapp:1.0
  • 7. Buka http://localhost:3000
  • 8. docker logs <id> untuk debug
Selamat! Anda baru saja containerize aplikasi — skill fundamental yang dipakai semua startup modern. Push ke Docker Hub untuk share.
Bagian 4 · 4/4
Registry & Ekosistem Container
Diskusi: mengapa Docker bukan satu-satunya? Apa itu OCI standard?

Docker Hub, ECR, GAR, ACR

Registry = tempat menyimpan & distribusi image. Public untuk open-source, private untuk perusahaan.

RegistryProviderUse Case
Docker HubDocker Inc.Public image, free tier 1 private repo
Amazon ECRAWSIntegrasi EC2, ECS, EKS, Lambda
Google GAR / GCRGCPIntegrasi GKE, Cloud Run
Azure ACRMicrosoftIntegrasi AKS, App Service
GitHub PackagesGitHubIntegrasi CI/CD GitHub Actions
Harbor / QuayOpen-source/CNCFPrivate on-prem, multi-tenant
Pilih registry sesuai provider cloud untuk integrasi & transfer cepat (no cross-region egress cost).

Ekosistem: Podman, containerd, OCI

Docker pionir, tapi standar OCI 2015 membuat image portable antar runtime.

OCI Standard
  • Open Container Initiative 2015
  • Image spec + runtime spec
  • Image Docker = image Podman
  • Anti vendor lock-in
containerd / CRI-O
  • Runtime minimal produksi
  • Dipakai K8s managed (EKS/GKE)
  • Lebih ringan dari Docker daemon
  • CNCF graduated project
Podman
  • Daemonless, drop-in Docker CLI
  • Red Hat RHEL default
  • Lebih aman (rootless default)
  • Kompatibel Dockerfile
Di produksi K8s modern, runtime biasanya containerd (bukan Docker). Docker tetap dipakai untuk dev.

Widget: Docker Container vs VM Density

Geser jumlah instance app dan RAM per instance. Lihat diagram kiri (VM) bertumpuk OS Guest per instance, sedangkan kanan (Container) hanya berisi app. Bandingkan total RAM host dan persentase hemat.

Ringkasan Kunci Pertemuan 4

VM vs Container
Container share kernel → 6-8× density VM. VM isolasi kuat.
Dockerfile
FROM, RUN, COPY, CMD + layer cache untuk build cepat
docker run
-p port mapping, -v volume persisten — dua flag wajib

Tiga lensa P4: VM vs container · Dockerfile deklaratif · docker run lifecycle.

Persiapan P5: AWS EC2 hands-on. Pastikan akun AWS Free Tier aktif (daftar di P1). Baca Wittig bab 3. Install AWS CLI & konfigurasi credentials. Kuis 5 menit soal Dockerfile & perbedaan VM vs container.