Saya memutuskan untuk membuat container runtime sendiri sebagai hobi, dan meskipun saya masih di tahap awal, saya sudah belajar bahwa Docker itu aneh. Berikut beberapa hal aneh yang saya pelajari tentang Docker.
Container itu tidak nyata. Berbeda dengan VM, container hanyalah proses dengan batasan khusus. Kernel Anda masih menjalankan proses tersebut, dan Anda bisa menemukannya di /proc. Tidak ada satu fitur container di Linux — container sebenarnya adalah 5 fitur kernel Linux yang berbeda yang dibungkus dalam satu jas hujan. Namespace menyembunyikan apa yang bisa dilihat oleh host dan container, cgroups membatasi penggunaan sumber daya, dan sihir jaringan mengisolasi jaringan container.
Image hanyalah folder. Docker menempatkannya di suatu tempat lalu memanggil chroot (atau pivot_root) untuk menjadikan folder itu sebagai direktori root baru container. Go agak merupakan bahasa yang buruk untuk container runtime. Runtime Docker, runc, ditulis dalam Go, dan pilihan desain Go membuatnya kurang cocok. Runtime Go secara native bersifat multi-thread, tetapi banyak syscall Linux membutuhkan lingkungan single-thread, sehingga runc memiliki modul C yang berjalan sebelum Go diinisialisasi. Go juga tidak memiliki fork, jadi runc menjalankan exec pada /proc/self/exe untuk mendekati fork.
Docker membutuhkan root. Banyak API kernel Linux memerlukan root, sehingga daemon Docker biasanya berjalan sebagai root. Runtime rootless mungkin harus mengimplementasikan ulang seluruh tumpukan jaringan di userspace. Belajar itu menyenangkan! Menulis versi Anda sendiri dari alat yang Anda gunakan adalah cara yang bagus untuk memahaminya.
Sumber: Hacker News · Diringkas oleh HeadlinesBriefing