
Apa itu Docker dan bagaimana cara kerjanya?
docker mengirimkan perintah melalui REST API ke daemon dockerd, yang
membuat gambar dan menjalankan container dari gambar tersebut.Mengapa hal ini ada. Docker memungkinkan Anda mengemas aplikasi dengan semua dependensinya (perpustakaan, konfigurasi, waktu proses) ke dalam satu artefak — sebuah gambar — dan menjalankannya secara identik di laptop pengembang, di CI, dan dalam produksi. Ini menyelesaikan masalah klasik "berfungsi di mesin saya".
Container vs. mesin virtual. VM memvirtualisasikan perangkat keras dan mengirimkan seluruh OS tamu dengan kernelnya sendiri. Kontainer adalah proses terisolasi yang menggunakan kernel host. Hasilnya, container menjadi lebih ringan, dapat dijalankan dalam sepersekian detik, dan menggunakan lebih sedikit sumber daya. Namun container bukan VM ringan: container terikat dengan kernel host, dan batas isolasinya lebih lemah dibandingkan VM. VM memiliki isolasi yang didukung perangkat keras, sedangkan kerentanan dalam kernel bersama berpotensi dapat di-escape dari sebuah container — itulah yang menjadi trade-off untuk kecepatan dan kepadatan. Host harus cocok dengan jenis kontainer: kontainer Linux memerlukan kernel Linux, kontainer Windows memerlukan kernel Windows. Di macOS dan Windows, Docker Desktop secara transparan menjalankan VM Linux kecil (misalnya melalui WSL2), sehingga container Linux di sana berbagi kernel VM tersebut, bukan kernel OS Anda.
Arsitektur (client-server). Sesuai dokumentasi Docker:
- Klien
dockeradalah cara utama pengguna berinteraksi dengan Docker; perintah sepertidocker rundikirim ke daemon. - Daemon
dockerd"melakukan pekerjaan berat" dalam membangun, menjalankan, dan mendistribusikan container serta mengelola objek seperti gambar, container, jaringan, dan volume. - Klien berkomunikasi dengan daemon melalui REST API melalui soket UNIX atau antarmuka jaringan, sehingga dapat dijalankan di mesin yang berbeda.
- Registri menyimpan gambar; yang publik default adalah Docker Hub.
Gambar dan kontainer. Analogi praktisnya: gambar seperti kelas (atau program di disk), dan kontainer adalah turunannya (proses yang sedang berjalan); Anda dapat memulai banyak container dari satu gambar.
- gambar adalah templat hanya-baca dengan instruksi untuk membuat wadah, yang dibuat dari lapisan. Ini ditentukan oleh Dockerfile; ketika Anda mengubahnya, hanya lapisan yang diubah yang dibangun kembali.
- container adalah instance gambar yang dapat dijalankan. Di atas lapisan gambar yang hanya dapat dibaca, ia menambahkan lapisan tipis yang dapat ditulis (copy-on-write); apa pun yang tertulis di sana akan hilang ketika wadahnya dihapus — itulah sebabnya data persisten memerlukan volume.
Cara kerja isolasi (di balik terpal). dockerd tidak memanggil kernel secara langsung — ia mendelegasikan pengelolaan siklus hidup container ke containerd, yang memanggil runtime OCI; di Docker defaultnya adalah runc, tetapi runtime dapat dicolokkan (crun, gVisor, Kata, dll.). Isolasi sebenarnya berasal dari fitur kernel Linux:
- namespace mengisolasi sumber daya (per halaman man7 ada 8 jenis: PID, jaringan, mount, UTS, IPC, pengguna, cgroup, waktu). Suatu proses hanya "melihat" PID-nya sendiri, tumpukan jaringannya sendiri, dan seterusnya.
- Batas cgroups (grup kontrol) dan memperhitungkan penggunaan sumber daya (CPU, memori, I/O).
Tindak lanjut yang umum. Lapisan gambar disimpan dalam cache; docker compose menjalankan aplikasi multi-kontainer; data tetap ada melalui volume (kontainer bersifat sementara secara default); dan OCI menstandarkan format gambar (spesifikasi gambar), waktu proses (spesifikasi runtime), dan protokol distribusi registri (spesifikasi distribusi) — ketiga spesifikasi ini menjaga ekosistem tetap dapat dioperasikan.
