Cara Kerja Docker #
Docker sering dipersepsikan sebagai “alat untuk menjalankan aplikasi dalam container”. Namun, di balik kesederhanaan perintah seperti docker run, terdapat mekanisme kompleks di level Operating System (OS) yang membuat container menjadi ringan, cepat, dan terisolasi.
Banyak developer menggunakan Docker setiap hari tanpa benar-benar memahami bagaimana Docker bekerja di level OS, apa bedanya dengan virtual machine, dan mengapa Docker bisa begitu efisien.
Pada artikel ini, kita akan membedah:
- Bagaimana Docker bekerja secara internal
- Peran kernel Linux dalam container
- Komponen utama seperti namespace, cgroups, dan filesystem
- Alur lengkap dari
docker runhingga aplikasi berjalan
Gambaran Arsitektur Docker di Level OS #
+--------------------------------------------------+
| User Space |
| |
| docker CLI |
| | |
| v |
| Docker Daemon (dockerd) |
| | |
| | Container Runtime (containerd, runc) |
| | |
+-----|--------------------------------------------+
|
v
+--------------------------------------------------+
| Linux Kernel |
| |
| - Namespaces (pid, net, mount, ipc, uts, user) |
| - Cgroups (CPU, Memory, I/O limits) |
| - Union File System (OverlayFS) |
| - Seccomp / AppArmor / SELinux |
+--------------------------------------------------+
|
v
+--------------------------------------------------+
| Hardware |
| CPU • Memory • Disk • Network |
+--------------------------------------------------+
Diagram ini akan menjadi peta utama kita sepanjang artikel.
Apa Itu Container Sebenarnya? #
Secara teknis:
Container bukanlah virtual machine.
Container adalah sekumpulan proses biasa di OS, tetapi:
- Terisolasi
- Memiliki filesystem sendiri
- Memiliki network sendiri
- Dibatasi resource-nya
Semua ini dicapai tanpa membuat OS baru.
Perbedaan Fundamental dengan Virtual Machine #
| Virtual Machine | Container |
|---|---|
| Menjalankan OS sendiri | Berbagi kernel host |
| Heavy (GB) | Lightweight (MB) |
| Boot lambat | Start dalam hitungan ms |
| Hypervisor | Kernel feature |
Docker memanfaatkan fitur bawaan kernel Linux, bukan meniru hardware.
Peran Linux Kernel dalam Docker #
Docker sangat bergantung pada kernel Linux. Inilah alasan:
- Docker berjalan native di Linux
- Docker Desktop di macOS/Windows menggunakan VM Linux di balik layar
Ada 4 pilar utama di kernel Linux yang memungkinkan Docker:
- Namespaces
- Control Groups (cgroups)
- Union File System
- Security Modules
Mari kita bahas satu per satu.
Namespaces: Ilusi Isolasi #
Namespaces membuat sebuah proses merasa memiliki dunianya sendiri.
Jenis Namespace yang Digunakan Docker #
| Namespace | Fungsi |
|---|---|
| pid | Isolasi process ID |
| net | Isolasi network (IP, port, interface) |
| mount | Isolasi filesystem mount |
| ipc | Isolasi inter-process communication |
| uts | Isolasi hostname |
| user | Isolasi user & UID |
Contoh Sederhana #
Proses di dalam container:
- Melihat dirinya sebagai PID 1
- Tidak melihat proses host
- Memiliki hostname sendiri
Padahal, itu hanyalah proses biasa di host.
Inilah trik utama Docker.
Cgroups: Mengontrol Resource #
Tanpa cgroups, container bisa:
- Menghabiskan seluruh CPU
- Menguras memory host
- Membuat sistem crash
Apa Itu Cgroups? #
Control Groups (cgroups) memungkinkan kernel:
- Membatasi CPU
- Membatasi memory
- Membatasi disk I/O
- Monitoring penggunaan resource
Contoh #
docker run \
--memory=512m \
--cpus=1.5 \
nginx
Artinya:
- Container tidak boleh memakai lebih dari 512MB RAM
- Maksimal 1.5 core CPU
Tanpa cgroups, container hanyalah proses tanpa rem.
Filesystem: Kenapa Container Terasa Punya OS Sendiri? #
Ini bagian yang sering bikin bingung.
Image ≠ Container #
- Image → template read-only
- Container → image + writable layer
Docker menggunakan Union File System (umumnya OverlayFS).
OverlayFS Secara Konsep #
+---------------------+
| Writable Layer | <-- perubahan runtime
+---------------------+
| Image Layer 3 |
+---------------------+
| Image Layer 2 |
+---------------------+
| Image Layer 1 |
+---------------------+
Ketika container berjalan:
- File asli tidak diubah
- Semua perubahan masuk ke writable layer
Inilah alasan:
- Image bisa di-share
- Container cepat dibuat
- Storage efisien
Networking: Container Mendapat IP dari Mana? #
Docker membuat virtual network menggunakan:
- Linux bridge
- veth pair
- iptables
Alur Singkat #
[ Container ]
|
veth
|
[ docker0 bridge ]
|
[ Host Network ]
Setiap container:
- Mendapat IP private
- Bisa saling komunikasi
- NAT ke network host
Semua ini dikelola otomatis oleh Docker daemon.
Security: Container Bukan Sandbox Sempurna #
Docker menambahkan lapisan keamanan tambahan:
- Seccomp → filter system call
- AppArmor / SELinux → mandatory access control
- Capabilities → drop privilege root
Namun penting dipahami:
Container ≠ VM security boundary
Inilah alasan best practice:
- Jangan jalankan container sebagai root
- Gunakan minimal capability
- Gunakan image terpercaya
Alur Lengkap: Apa yang Terjadi Saat docker run
#
Mari kita rangkum step-by-step:
- Docker CLI mengirim perintah ke Docker Daemon
- Daemon memeriksa image (pull jika perlu)
- Docker membuat filesystem layer
- Namespace dibuat (pid, net, mount, dll)
- Cgroups diset
- Network virtual dibuat
runcmengeksekusi process di namespace baru- Process berjalan sebagai container
Semua ini terjadi dalam hitungan milidetik.
Kenapa Pemahaman Ini Penting? #
Dengan memahami cara kerja Docker di level OS, kamu akan:
- Lebih paham soal security
- Lebih tepat mengatur resource
- Tidak salah menganggap container sebagai VM
- Lebih percaya diri desain arsitektur production
Docker itu sederhana di permukaan, tapi sangat elegan di dalam.
Penutup #
Docker bukan sihir. Ia adalah hasil eksploitasi cerdas dari fitur kernel Linux yang sudah ada bertahun-tahun.
Ketika kamu menjalankan container, sebenarnya kamu sedang:
- Menjalankan proses biasa
- Dengan ilusi isolasi
- Dikontrol ketat oleh kernel
Dan di situlah keindahan Docker ✨.