PEBD6027 · RPS minggu 4 · 2x50 menit
Virtualisasi & Containerization VM (Hypervisor) vs Container (Docker) — Cloud System Bisdig Hari ini kita masuk ke lapisan teknis yang menjadi fondasi seluruh cloud modern: virtualisasi dan container. Kita akan bedakan VM tradisional dengan container Docker, kenapa Docker revolusioner sejak 2013, dan bagaimana container memungkinkan microservices. Bawa laptop dengan Docker Desktop terinstall karena ada hands-on menulis Dockerfile dan menjalankan container. Pemahaman hari ini adalah prasyarat P11 Kubernetes. Peta Pembelajaran Hari Ini Sub-CPMK 4: membuat dan menjalankan container Docker. Empat indikator capaian.
VM Hypervisor Type 1 vs Type 2 Container Docker: share kernel host Komparasi VM vs container (overhead, density) 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.
Empat indikator hari ini: perbedaan VM vs container, Dockerfile dasar, docker run dengan port mapping, dan justifikasi pilihan VM vs container. Saya akan pakai studi kasus Tokopedia yang migrasi dari VM ke container. Hands-on di jam kedua wajib bawa laptop dengan Docker Desktop sudah terinstall. Pemahaman ini kunci untuk P11 Kubernetes dan P12 CI/CD. 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?
Mari kita mulai dengan motivasi bisnis. Pada era VM sekitar 2010, satu server fisik hanya bisa menampung sekitar 10 aplikasi karena setiap VM butuh OS guest lengkap. Container sejak Docker 2013 mengubah ini: share kernel host sehingga density naik 10 kali lipat. Tokopedia pindah ke container karena butuh deploy ratusan microservices dengan efisien. Pertanyaan pemantik: apa yang dibagikan container? Jawabannya kernel OS host, bukan hardware saja seperti VM. Bagian 1 · 1/4
VM vs Container
Diskusi kelas: bila container lebih efisien, mengapa bank masih pakai VM untuk core banking?
Pertanyaan diskusi tadi menyorot trade-off security. Bank core banking sering tetap pakai VM karena isolasi kernel penuh — bila satu VM kena hack, tidak menyebar ke kernel host. Container share kernel, jadi vulnerability kernel berdampak semua container. Pilihan VM vs container tergantung kebutuhan isolasi vs efisiensi. VM: Hypervisor Type 1 vs Type 2 Hypervisor adalah software yang membuat dan mengelola VM. Dua tipe dengan use case berbeda.
Langsung di hardware (tanpa host OS) Contoh: VMware ESXi, Hyper-V, KVM, Xen Performa maksimal Dipakai AWS, Azure, GCP 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.
Hypervisor Type 1 berjalan langsung di hardware tanpa host OS — performa maksimal, dipakai AWS KVM Nitro Azure Hyper-V GCP. Hypervisor Type 2 berjalan di atas host OS seperti Windows atau Mac — overhead lebih besar, dipakai untuk dev/test di laptop seperti VirtualBox VMware Workstation Parallels. AWS memakai KVM modified sebagai Nitro hypervisor yang performanya near-bare-metal. Pemahaman tipe ini penting ketika Anda memilih teknologi virtualisasi internal perusahaan. Container: Share Kernel Host Container tidak punya kernel sendiri — share kernel Linux host via namespace & cgroup. Inilah alasan efisiensinya.
VIRTUAL MACHINE App A Libs Guest OS App B Guest OS Hypervisor CONTAINER App A Libs App B App C App D KERNEL HOST (Linux namespace + cgroup) VM: tiap instance punya Guest OS (ratusan MB) | Container: share kernel host (MB) Diagram ini inti perbedaan VM dan container. Pada VM setiap instance punya Guest OS lengkap ratusan MB overhead. Pada container semua instance share kernel host via Linux namespace untuk isolasi dan cgroup untuk resource limit. Inilah alasan density container jauh lebih tinggi: tidak ada duplikasi OS guest. Catatan: container Linux butuh host Linux, untuk Windows/Mac pakai VM Linux tersembunyi (Docker Desktop). Komparasi VM vs Container Lima dimensi trade-off. Pilih berdasarkan kebutuhan isolasi vs efisiensi vs portabilitas.
Dimensi VM Container Overhead resource Tinggi (guest OS ~500MB-1GB) Rendah (share kernel, ~10-100MB) Startup time Lambat (menit) Cepat (detik) Density per host Rendah (~10 VM) Tinggi (~100 container) Isolasi Kuat (kernel terpisah) Sedang (share kernel) Portabilitas Rendah (OS-specific) Tinggi (Docker image)
Aturan praktis: VM untuk isolasi kuat (bank core, compliance), container untuk microservices & dev velocity (startup, e-commerce).
Lima dimensi trade-off: overhead resource, startup time, density, isolasi, portabilitas. VM overhead tinggi karena guest OS, startup lambat menit, density rendah, isolasi kuat kernel terpisah. Container overhead rendah, startup detik, density tinggi, isolasi sedang share kernel, portabilitas tinggi via Docker image. Aturan praktis: VM untuk bank core dan compliance, container untuk microservices dan dev velocity. Tokopedia pakai container untuk ratusan microservices. Hitung dari Nol: Density Container vs VM Host 64 GB RAM, 16 vCPU. Berapa container vs VM yang muat?
Langkah Model Perhitungan Hasil 1 VM (4GB + 1 vCPU per VM) min(64/4, 16/1) = 16 VM maksimum 2 VM overhead guest OS 800MB × 16 16 × 0,8GB = 12,8 GB terbuang OS guest 3 Container (512MB-1GB, share kernel) 64GB / 0,7GB avg = ~90 container realistis 4 Container overhead host kernel ~2GB tetap = headroom besar 5 Ratio density 90 / 16 = ~6× container lebih padat 6 Implikasi cost (m5.large $0,096/jam) 50 container: 1 node vs 50 VM: 4 node container hemat ~75% infra
Angka ilustratif — realitas bervariasi per workload. Tapi orde besarnya: container 4-8× lebih efisien dari VM.
Mari kita hitung konkret density. Host 64 GB 16 vCPU. VM butuh 4 GB per instance sehingga maksimum 16 VM dengan overhead guest OS 800 MB per VM total 12,8 GB terbuang. Container 512 MB sampai 1 GB rata-rata 0,7 GB sehingga muat sekitar 90 container realistis. Ratio density 6 kali container lebih padat. Implikasi cost: untuk 50 instance, container butuh 1 node m5 large sementara VM butuh 4 node. Container hemat sekitar 75 persen infra. Inilah alasan ekonomis migrasi ke container. Bagian 2 · 2/4
Dockerfile & Image
Diskusi: apakah Dockerfile sama dengan shell script? Mengapa deklaratif penting di sini?
Dockerfile mirip shell script tapi deklaratif dan layered. Setiap instruksi membuat layer yang dapat di-cache, sehingga rebuild cepat. Deklaratif penting karena idempoten — build berkali-kali hasil sama. Ini selaras dengan P10 Terraform IaC yang juga deklaratif. Budaya deklaratif adalah pondasi modern DevOps. 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"]
FROM — base image (node, python, ubuntu)RUN — eksekusi command saat buildCOPY — salin file dari host ke imageCMD — command default saat container jalanCOPY package.json SEBELUM COPY . Manfaatkan cache layer (dependency stabil) Pakai base image resmi (node:18-alpine) alpine = ukuran kecil (~5MB base) Empat instruksi utama Dockerfile: FROM untuk base image, RUN untuk command saat build, COPY untuk salin file host ke image, CMD untuk command default saat container jalan. Best practice: COPY package.json sebelum COPY titik-titik agar cache layer tidak invalidasi saat kode berubah tapi dependency tetap. Pakai base image resmi seperti node 18 alpine ukuran kecil sekitar 5 MB. Saya akan demo tulis Dockerfile ini di kelas. Layer & Cache Build Setiap instruksi Dockerfile = 1 layer. Cache membuat rebuild cepat — hanya layer yang berubah yang di-rebuild.
Layer Instruksi Cache? 1 FROM node:18-alpine Cache (base tetap) 2 WORKDIR /app Cache (jarang berubah) 3 COPY package*.json ./ Cache (jika package.json tak berubah) 4 RUN npm install Cache (ikut package.json) 5 COPY . . Invalid (kode berubah tiap build)6 CMD ["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.
Setiap instruksi Dockerfile membuat satu layer yang dapat di-cache. Build kedua dan seterusnya akan pakai cache untuk layer yang tidak berubah. Trik penting: COPY package.json sebelum COPY kode agar saat kode berubah, layer npm install masih cache. Bila salah urutan, setiap ubah kode akan trigger npm install dari nol yang lambat. Urutan layer menentukan efisiensi rebuild. Build ulang hanya butuh detik bukan menit jika cache dimanfaatkan dengan benar. Best Practice Dockerfile Produksi-grade Dockerfile butuh pertimbangan ekstra: ukuran, keamanan, reproducibility.
Build tool di stage 1 Runtime image minimal di stage 2 Hasil: image 20-50MB bukan 500MB Abaikan node_modules, .git, test Build context kecil = build cepat Cegah secret bocor ke image 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.
Tiga best practice produksi: multi-stage build untuk image kecil, dockerignore untuk build context kecil dan cegah secret bocor, non-root user untuk mitigasi privilege escalation. Multi-stage memisahkan stage build dengan tool lengkap dari stage runtime yang minimal, hasil image 20-50 MB bukan 500 MB. Dockerignore abaikan node_modules git test supaya build context kecil dan cepat, juga cegah secret bocor ke image. Non-root user jangan jalan sebagai root di container, buat user khusus. Image produksi tanpa tiga praktik ini tanda engineer pemula. Bagian 3 · 3/4
Run Container: docker run
Diskusi: apa beda docker run -p dengan -v? Kapan pakai keduanya?
Pertanyaan diskusi menyentuh dua flag paling sering dipakai. dash p untuk port mapping supaya container bisa diakses dari host, dash v untuk volume mapping supaya data persisten saat container dihapus. Untuk database wajib dash v. Untuk web server wajib dash p. Realitas sering 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
Format: HOST:CONTAINER -p 8080:3000 = host 8080 → container 3000 Tanpa -p, container isolasi (hanya jaringan internal) Format: VOLUME_NAME:CONTAINER_PATH Data persisten saat container rm Wajib untuk database, file upload, logs Dua flag paling sering: dash p untuk port mapping format HOST COLON CONTAINER, dash 8080 COLON 3000 berarti host 8080 redirect ke container 3000. Tanpa dash p container isolasi hanya jaringan internal. dash v untuk volume mapping format VOLUME_NAME COLON CONTAINER_PATH, data persisten saat container rm. Wajib untuk database, file upload, dan logs. Saya akan demo kedua flag ini menjalankan web app dan PostgreSQL. Lifecycle: pull, create, start, stop, rm Container punya siklus hidup. Memahami ini kunci debugging sehari-hari.
Command Fungsi Effect docker pull IMAGE Unduh image dari registry Image tersimpan lokal, container belum jalan docker create IMAGE Buat container dari image Container status created, belum start docker start NAME Jalankan container Status running docker stop NAME Hentikan graceful Status exited, data volume tetap docker rm NAME Hapus container Hilang, volume tetap kecuali -v docker run IMAGE create + start sekali jalan Shortcut paling sering dipakai
docker ps untuk lihat container running, docker ps -a untuk semua termasuk exited. docker logs NAME untuk debugging.
Siklus hidup container: pull untuk unduh image dari registry, create untuk buat container, start untuk jalankan, stop untuk hentikan graceful, rm untuk hapus. docker run adalah shortcut create plus start yang paling sering dipakai. docker ps untuk lihat container running, docker ps dash a untuk semua termasuk exited, docker logs NAME untuk debugging. Pemahaman lifecycle ini kunci untuk troubleshooting sehari-hari di production. Hands-on: Web Node.js Containerized Mari containerize web server Express sederhana — simulasi realistis startup Bisdig.
1. Buat app.js Express "Hello Cloud"2. Tulis package.json + npm install3. Tulis Dockerfile (lihat Slide 10)4. .dockerignore: node_modules, .git5. docker build -t myapp:1.0 .6. docker run -p 3000:3000 myapp:1.07. Buka http://localhost:30008. docker logs <id> untuk debugSelamat! Anda baru saja containerize aplikasi — skill fundamental yang dipakai semua startup modern. Push ke Docker Hub untuk share.
Mari hands-on containerize web server Express sederhana simulasi startup Bisdig. Buat app.js Express Hello Cloud, tulis package.json dan npm install, tulis Dockerfile seperti Slide 10, buat dockerignore untuk node_modules dan git. Build image dengan docker build tag myapp 1.0. Run dengan docker run dash p 3000 COLON 3000. Buka localhost 3000 di browser. docker logs untuk debug bila gagal. Selamat Anda baru saja containerize aplikasi — skill fundamental semua startup modern. Push ke Docker Hub untuk share ke tim. Bagian 4 · 4/4
Registry & Ekosistem Container
Diskusi: mengapa Docker bukan satu-satunya? Apa itu OCI standard?
Docker adalah pionir container modern tapi bukan satu-satunya. Open Container Initiative OCI 2015 membuat standar image dan runtime supaya image bisa jalan di Docker Podman containerd CRI-O. Standar ini penting menghindari vendor lock-in ke Docker Inc. Ekosistem container sehat karena ada kompetisi dan interoperabilitas. Docker Hub, ECR, GAR, ACR Registry = tempat menyimpan & distribusi image. Public untuk open-source, private untuk perusahaan.
Registry Provider Use Case Docker Hub Docker Inc. Public image, free tier 1 private repo Amazon ECR AWS Integrasi EC2, ECS, EKS, Lambda Google GAR / GCR GCP Integrasi GKE, Cloud Run Azure ACR Microsoft Integrasi AKS, App Service GitHub Packages GitHub Integrasi CI/CD GitHub Actions Harbor / Quay Open-source/CNCF Private on-prem, multi-tenant
Pilih registry sesuai provider cloud untuk integrasi & transfer cepat (no cross-region egress cost).
Registry adalah tempat menyimpan dan distribusi image. Docker Hub untuk public image dengan free tier satu private repo. Amazon ECR untuk integrasi EC2 ECS EKS Lambda. Google GAR untuk GKE Cloud Run. Azure ACR untuk AKS App Service. GitHub Packages untuk CI/CD GitHub Actions. Harbor dan Quay open-source CNCF untuk private on-prem multi-tenant. Pilih registry sesuai provider cloud untuk integrasi dan transfer cepat tanpa cross-region egress cost. Ekosistem: Podman, containerd, OCI Docker pionir, tapi standar OCI 2015 membuat image portable antar runtime.
Open Container Initiative 2015 Image spec + runtime spec Image Docker = image Podman Anti vendor lock-in Runtime minimal produksi Dipakai K8s managed (EKS/GKE) Lebih ringan dari Docker daemon CNCF graduated project 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.
Ekosistem container sehat dengan kompetisi. OCI Open Container Initiative 2015 membuat standar image dan runtime supaya image bisa jalan lintas runtime. containerd dan CRI-O runtime minimal produksi dipakai K8s managed seperti EKS GKE, lebih ringan dari Docker daemon. Podman dari Red Hat daemonless drop-in Docker CLI lebih aman rootless default, kompatibel Dockerfile. Di produksi K8s modern runtime biasanya containerd bukan Docker. Docker tetap dipakai untuk dev karena UX familiar. 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.
Baik, sekarang mari satu mahasiswa maju dan geser slider jumlah instance ke 8, RAM biarkan di 256 MB. Perhatikan diagram kiri, 8 VM berisi 8 OS Guest, masing-masing 256 MB overhead. Total RAM host jadi 4 GB. Sekarang lihat diagram kanan, 8 container hanya berisi app, total 2 GB. Hemat 50 persen. Itulah kenapa Tokopedia bisa muat 6 sampai 8 kali lebih banyak workload per server setelah migrasi ke container. Coba geser ke skala kecil, 2 instance, lihat savings turun di bawah 30 persen, inilah trade-off, container menang di skala banyak bukan di skala satu dua. 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.
Tiga pesan kunci: container share kernel sehingga 6-8 kali lebih padat dari VM, Dockerfile deklaratif dengan layer cache untuk build cepat, docker run dengan flag p untuk port dan v untuk volume adalah dua flag wajib sehari-hari. P5 kita masuk AWS EC2 hands-on — pastikan akun AWS Free Tier aktif. Install AWS CLI dan konfigurasi credentials sebelum kelas. Sampai jumpa minggu depan dengan laptop siap hands-on.