Overview #
Docker bukan sekadar tool untuk menjalankan container, tetapi sebuah platform dengan arsitektur yang cukup matang dan saling terintegrasi. Untuk benar-benar memahami Docker—baik untuk development maupun production—kita perlu memahami bagaimana Docker Engine, Docker Daemon, Image, Container, dan Registry saling berinteraksi.
Artikel ini akan membahas gambaran besar arsitektur Docker secara menyeluruh, dimulai dari konsep tingkat tinggi hingga alur kerja internalnya.
Gambaran Umum Arsitektur Docker #
Diagram Arsitektur Docker (High-Level) #
Diagram berikut menggambarkan hubungan antar komponen utama dalam arsitektur Docker dan alur komunikasi di antaranya:
+-------------------+
| Developer / CI |
+-------------------+
|
| docker CLI / REST API
v
+-------------------+
| Docker Client |
+-------------------+
|
| Docker API
v
+-----------------------------------+
| Docker Engine |
| |
| +-----------------------------+ |
| | Docker Daemon | |
| | (dockerd) | |
| +-----------------------------+ |
| | | |
| | | |
| Image Mgmt Container Mgmt |
| | | |
| v v |
| Docker Image Docker Container |
| |
| | |
| v |
| Container Runtime |
| (containerd → runc) |
+-----------------------------------+
|
| pull / push
v
+-------------------+
| Docker Registry |
+-------------------+
Diagram ini akan menjadi acuan utama untuk memahami pembahasan pada section-section berikutnya.
Secara garis besar, Docker menggunakan arsitektur client–server:
- Docker Client → antarmuka pengguna (CLI / API)
- Docker Engine → inti platform Docker
- Docker Daemon → proses utama pengelola container
- Docker Image → blueprint aplikasi
- Docker Container → instance runtime dari image
- Docker Registry → tempat penyimpanan image
Alur sederhananya:
Developer → Docker Client → Docker Daemon → Image / Container → Registry
Docker Engine #
Apa itu Docker Engine? #
Docker Engine adalah jantung dari Docker. Ia merupakan runtime yang memungkinkan kita untuk:
- Membangun image
- Menjalankan container
- Mengelola network dan volume
- Berkomunikasi dengan registry
Docker Engine terdiri dari tiga komponen utama:
- Docker Daemon (dockerd)
- Docker API
- Docker Client (CLI)
Docker Client #
Peran Docker Client #
Docker Client adalah antarmuka yang digunakan oleh user untuk berinteraksi dengan Docker.
Contoh perintah:
docker build
docker run
docker pull
docker push
Saat kita menjalankan perintah tersebut:
- Docker Client tidak melakukan eksekusi langsung
- Ia mengirim request ke Docker Daemon melalui Docker API
Client bisa berkomunikasi dengan:
- Daemon lokal
- Daemon remote (via TCP / SSH)
Docker Daemon (dockerd) #
Fungsi Docker Daemon #
Docker Daemon adalah proses background yang berjalan terus-menerus dan bertanggung jawab penuh terhadap:
- Membangun image
- Menjalankan & menghentikan container
- Mengelola network
- Mengelola volume
- Menarik dan mendorong image ke registry
Docker Daemon berinteraksi langsung dengan:
- Kernel Linux (cgroups, namespaces)
- Container runtime (containerd, runc)
Tanpa daemon, Docker tidak dapat menjalankan container sama sekali.
Docker Image #
Apa itu Docker Image? #
Docker Image adalah template read-only yang berisi:
- Base OS (Alpine, Debian, Ubuntu, dll)
- Runtime (Go, Node.js, Java, dll)
- Library dan dependency
- Aplikasi
Image dibangun menggunakan Dockerfile dan bersifat immutable.
Layered Architecture #
Docker Image terdiri dari layer-layer:
- Setiap instruksi di Dockerfile menghasilkan 1 layer
- Layer bersifat cacheable dan reusable
- Image yang berbeda bisa berbagi layer yang sama
Keuntungan:
- Build lebih cepat
- Ukuran image lebih kecil
- Distribusi image lebih efisien
Docker Container #
Apa itu Docker Container? #
Docker Container adalah instance runtime dari Docker Image.
Jika image adalah blueprint, maka container adalah objek nyata yang sedang berjalan.
Karakteristik container:
- Memiliki filesystem sendiri
- Terisolasi menggunakan namespaces
- Resource dibatasi menggunakan cgroups
- Lifecycle terkontrol (start, stop, restart, remove)
Satu image bisa menghasilkan banyak container.
Container Runtime #
Di balik layar, Docker menggunakan container runtime:
- containerd → high-level container runtime
- runc → low-level runtime yang berinteraksi dengan kernel
Alurnya:
Docker Daemon → containerd → runc → Linux Kernel
Ini membuat Docker:
- Stabil
- Modular
- Sesuai standar OCI (Open Container Initiative)
Docker Registry #
Fungsi Docker Registry #
Docker Registry adalah tempat penyimpanan dan distribusi Docker Image.
Contoh registry:
- Docker Hub
- AWS ECR
- Google Artifact Registry
- GitHub Container Registry
- Private Registry (self-hosted)
Operasi Utama #
docker pull→ download imagedocker push→ upload image
Registry memungkinkan:
- Image versioning
- Image sharing
- CI/CD integration
Alur Kerja Docker Secara Menyeluruh #
Contoh alur saat menjalankan aplikasi:
- Developer menjalankan
docker run - Docker Client mengirim request ke Docker Daemon
- Daemon mengecek apakah image tersedia secara lokal
- Jika tidak ada → pull image dari registry
- Daemon membuat container dari image
- containerd & runc menjalankan container
- Aplikasi berjalan di dalam container
Isolasi & Keamanan #
Docker memanfaatkan fitur kernel Linux:
- Namespaces → isolasi process, network, mount
- cgroups → pembatasan CPU & memory
- Capabilities → pembatasan privilege
Ini membuat container:
- Lebih ringan dari VM
- Cepat dijalankan
- Cukup aman jika dikonfigurasi dengan benar
Ringkasan Komponen Arsitektur Docker #
| Komponen | Peran Utama |
|---|---|
| Docker Client | Antarmuka pengguna |
| Docker Engine | Runtime utama Docker |
| Docker Daemon | Pengelola container & image |
| Docker Image | Blueprint aplikasi |
| Docker Container | Aplikasi yang berjalan |
| Docker Registry | Penyimpanan image |
Penutup #
Memahami arsitektur Docker membantu kita:
- Mendesain sistem container yang lebih baik
- Debug masalah dengan lebih cepat
- Mengoptimalkan build & runtime
- Mengambil keputusan arsitektur yang tepat
Docker bukan sekadar tool, tetapi sebuah ekosistem container platform yang kuat dan fleksibel—dan semuanya berawal dari arsitekturnya.