Docker aneh: kontainer hanyalah proses biasa
Judul asli: Docker is weird
Mengapa Ini Penting
Memahami fondasi teknis Docker penting bagi pengembang yang mengandalkannya di produksi.
Seorang pengembang membuat container runtime sendiri dan menemukan fakta teknis mengejutkan tentang Docker, mulai dari struktur image hingga ketergantungan root.
Kontainer bukan entitas nyata seperti VM. Mereka hanyalah proses Linux biasa yang dibatasi oleh lima fitur kernel sekaligus: namespaces, cgroups, dan tumpukan jaringan yang kompleks. Prosesnya bahkan bisa ditemukan di /proc jika tahu cara mencarinya.
Image Docker pun tak lebih dari folder biasa. Saat menjalankan `docker run -it --rm ubuntu /bin/bash`, Docker mengunduh image, menaruhnya di suatu direktori, lalu memanggil `chroot` atau `pivot_root` agar folder itu menjadi root directory proses kontainer.
Bahasa Go yang dipakai `runc` — runtime resmi Docker — ternyata punya keterbatasan serius. Go berjalan multi-threaded secara native, padahal banyak syscall Linux untuk container runtime harus dijalankan di lingkungan single-threaded. Solusinya: modul C khusus yang berjalan sebelum runtime Go terinisialisasi. Go juga tak punya `fork`, sehingga `runc` terpaksa mengeksekusi `/proc/self/exe` dengan argumen khusus untuk meniru perilaku fork.
Satu fakta sering terlewat pengguna macOS: Docker daemon biasanya berjalan sebagai root karena banyak API kernel Linux memang memerlukannya. Untuk container rootless, seluruh networking stack harus diimplementasi ulang di userspace agar fiturnya setara.