Engine & Daemon #
Docker sering dipahami sebagai tool tunggal untuk menjalankan container. Padahal, di balik perintah sederhana seperti docker run atau docker build, terdapat arsitektur internal yang cukup kompleks. Dua komponen paling penting di dalamnya adalah Docker Daemon dan Docker Engine.
Memahami perbedaan dan peran daemon serta engine sangat krusial, terutama jika kamu:
- Mengelola server Docker di production
- Menghadapi isu performa atau keamanan
- Menggunakan Docker secara remote (CI/CD, Docker context, atau API)
Artikel ini akan membahas secara mendalam apa itu Docker Daemon, apa itu Docker Engine, bagaimana keduanya bekerja, serta best practice penggunaannya.
Gambaran Arsitektur #
Secara konseptual, Docker menggunakan arsitektur client–server:
+-------------+ REST API +-------------------+
| Docker CLI | <-----------------> | Docker Daemon |
+-------------+ | (dockerd) |
+---------+---------+
|
v
+------------------------+
| Container Runtime |
| (containerd, runc) |
+------------------------+
- Docker CLI: antarmuka yang kita gunakan (
docker run,docker ps, dll) - Docker Daemon (dockerd): proses utama yang mengatur container
- Docker Engine: paket lengkap yang mencakup daemon, API, dan CLI
Docker CLI ke Daemon menggunakan REST API via Unix Socket.
Apa Itu Docker Daemon? #
Definisi #
Docker Daemon adalah proses background yang berjalan terus-menerus di sistem operasi host dan bertanggung jawab penuh atas:
- Membuat dan menjalankan container
- Mengelola image
- Mengatur network dan volume
- Berkomunikasi dengan container runtime
Docker Daemon dijalankan sebagai proses bernama:
dockerd
Peran Utama Docker Daemon #
Docker Daemon bertindak sebagai otak Docker. Semua perintah yang kamu jalankan melalui Docker CLI pada akhirnya akan dieksekusi oleh daemon.
Tugas utamanya meliputi:
Container Lifecycle Management
- create
- start
- stop
- restart
- remove
Image Management
- pull image dari registry
- build image dari Dockerfile
- menyimpan image di local cache
Network Management
- bridge
- host
- overlay
- macvlan
Volume Management
- create volume
- mount volume ke container
API Provider
- menyediakan REST API yang bisa diakses oleh Docker CLI maupun tool lain
Docker Daemon dan REST API #
Docker Daemon menyediakan REST API yang secara default diakses melalui:
Unix socket:
/var/run/docker.sockTCP socket (jika diaktifkan)
Docker CLI tidak menjalankan container secara langsung, melainkan:
- Mengirim request ke Docker Daemon
- Docker Daemon memproses request
- Hasil dikembalikan ke CLI
Inilah alasan kenapa Docker bisa dikontrol secara remote.
Docker Daemon di Sistem Operasi #
Linux: berjalan sebagai service systemd
systemctl status dockermacOS & Windows:
- Docker Daemon berjalan di dalam VM (Linux VM)
- Di-manage oleh Docker Desktop
Ini penting karena container selalu berjalan di kernel Linux, bahkan di Mac dan Windows.
Apa Itu Docker Engine? #
Definisi #
Docker Engine adalah platform lengkap untuk membangun dan menjalankan container. Docker Engine bukan hanya daemon, melainkan satu paket yang terdiri dari beberapa komponen utama.
Komponen Docker Engine #
Docker Engine terdiri dari:
Docker Daemon (dockerd)
Docker REST API
Docker CLI
Container Runtime
containerdrunc
Secara sederhana:
Docker Engine = semua yang kamu butuhkan untuk menjalankan Docker
Peran Docker Engine #
Docker Engine menyediakan:
- Abstraksi container
- Konsistensi environment
- Standar runtime berbasis OCI
Dengan Docker Engine, developer tidak perlu:
- Berurusan langsung dengan cgroups
- Mengatur namespace Linux secara manual
- Mengelola dependency OS
Hubungan Docker Engine, Daemon, containerd, dan runc #
Ini bagian yang sering membingungkan, jadi kita luruskan.
Lapisan Eksekusi Container #
Docker CLI
↓
Docker Daemon (dockerd)
↓
containerd
↓
runc
↓
Linux Kernel (cgroups, namespaces)
Penjelasan Singkat #
dockerd
- Mengatur high-level logic Docker
containerd
- Mengelola lifecycle container secara low-level
- Image pull, snapshot, execution
runc
- Menjalankan container sesuai spesifikasi OCI
- Berinteraksi langsung dengan kernel Linux
Docker sejak versi modern tidak lagi menjalankan container langsung, melainkan mendelegasikannya ke containerd.
Docker Daemon vs Docker Engine #
| Aspek | Docker Daemon | Docker Engine |
|---|---|---|
| Bentuk | Proses | Platform / Paket |
| Nama | dockerd | Docker Engine |
| Fungsi | Mengatur container | Menyediakan seluruh ekosistem Docker |
| Termasuk CLI | ❌ | ✅ |
| Termasuk Runtime | ❌ | ✅ |
Intinya:
- Docker Daemon adalah bagian dari Docker Engine
- Docker Engine adalah keseluruhan sistem Docker
Mode Komunikasi Docker Daemon #
Local Mode #
Docker CLI dan daemon berada di mesin yang sama:
docker ps
Remote Mode #
Docker CLI mengontrol daemon di server lain:
docker -H tcp://server:2375 ps
Atau menggunakan Docker context:
docker context use production
Ini sangat umum di:
- CI/CD
- Remote build
- Server production
Aspek Keamanan Docker Daemon #
⚠️ Docker Daemon adalah komponen yang sangat sensitif.
Beberapa fakta penting:
- Akses ke
docker.sock≈ akses root - Container bisa mount filesystem host
- Bisa menjalankan container privileged
Best Practice Keamanan #
- Jangan expose Docker Daemon tanpa TLS
- Batasi akses ke
/var/run/docker.sock - Gunakan user group
dockerdengan hati-hati - Gunakan rootless Docker jika memungkinkan
- Isolasi environment production
Rootless Docker dan Dampaknya ke Daemon #
Rootless Docker menjalankan Docker Daemon tanpa hak akses root.
Kelebihan:
- Lebih aman
- Mengurangi risiko privilege escalation
Kekurangan:
- Beberapa fitur terbatas (port <1024, overlay tertentu)
Cocok untuk:
- Development
- Shared environment
Kapan Perlu Memahami Daemon dan Engine Secara Mendalam? #
Pemahaman ini sangat penting jika kamu:
- Debug container yang tidak mau start
- Mengalami issue resource (CPU / memory)
- Mengelola Docker di server besar
- Menggunakan Kubernetes (karena konsepnya mirip)
Penutup #
- Docker Daemon (dockerd) adalah proses inti yang mengatur semua aktivitas Docker
- Docker Engine adalah platform lengkap yang mencakup daemon, API, CLI, dan runtime
- Docker menggunakan arsitektur client–server
- Keamanan Docker sangat bergantung pada bagaimana daemon dikelola
Dengan memahami daemon dan engine, kamu tidak hanya menggunakan Docker, tapi benar-benar menguasainya.