Dalam ekosistem container, kebingungan umum sering muncul saat pengembang membandingkan Docker (sebuah platform komprehensif) dengan containerd, yang sebenarnya adalah komponen runtime yang terfokus. Perbandingan ini seperti membandingkan sebuah mobil lengkap dengan mesinnya: keduanya penting, tetapi berfungsi untuk tujuan yang berbeda pada tingkat abstraksi yang berbeda.
Dalam panduan ini, saya akan memperjelas hubungan antara kedua teknologi ini, menelusuri arsitektur, integrasi Kubernetes, dan skenario spesifik tempat masing-masing alat unggul. Baik Anda membuat container secara lokal maupun mengelola klaster Kubernetes produksi, memahami kapan menggunakan Docker versus containerd dapat berdampak signifikan pada keputusan infrastruktur Anda.
Pada akhir artikel ini, Anda akan memiliki pemahaman yang jelas tentang bagaimana Docker dan containerd saling melengkapi, serta cara memilih alat yang tepat untuk kebutuhan spesifik Anda, baik untuk pengembangan lokal yang cepat maupun penyebaran produksi skala besar.
Jika Anda baru mengenal kontainerisasi, saya sangat merekomendasikan mengikuti kursus Konsep Kontainerisasi dan Virtualisasi kami.
Apa Itu Docker?
Docker merevolusi lanskap pengembangan perangkat lunak dengan membuat kontainerisasi menjadi mudah diakses dan praktis bagi pengembang sehari-hari. Sebagai platform komprehensif, Docker menyediakan semua yang dibutuhkan untuk membangun, mengirim, dan menjalankan aplikasi terkontainer.
Bagi pemula, Panduan Praktis tentang Container ini memberikan pengantar yang sangat baik tentang Docker dan container.
Docker berfungsi sebagai platform container serba ada, menawarkan tumpukan alat terintegrasi yang mencakup sebagian besar siklus hidup container. Intinya, Docker mengemas aplikasi beserta semua dependensinya ke dalam image portabel dan mandiri yang dapat berjalan secara konsisten di berbagai lingkungan, mulai dari laptop pengembang hingga server produksi.

Pendekatan komprehensif ini menjadikan Docker standar industri untuk pengembangan lokal dan pengalaman pengembang. Beberapa manfaat utamanya meliputi:
- Ekosistem yang luas: Docker Hub menampung jutaan image siap pakai, dari basis data hingga web server, menghilangkan prosedur instalasi yang rumit
- Portabilitas universal: Sebuah container yang dibangun di macOS berjalan identik di Linux atau Windows, selama Docker terpasang
- Fokus pada pengembang: Mengabstraksi perbedaan infrastruktur sehingga pengembang dapat berfokus pada aplikasi mereka alih-alih kompleksitas deployment
- Onboarding cepat: Anggota tim baru dapat menyiapkan lingkungan pengembangan dalam hitungan menit, bukan jam
Komponen kunci dan alur kerja
Arsitektur Docker terdiri dari beberapa komponen yang saling terhubung dan bekerja mulus bersama.
Docker CLI menyediakan antarmuka yang dihadapi pengguna tempat pengembang menjalankan perintah. Saat Anda menjalankan perintah seperti docker run, CLI berkomunikasi dengan daemon Docker (dockerd), yang berfungsi sebagai layanan inti yang mengelola container, image, jaringan, dan volume.
Bagi pengguna Windows dan macOS, Docker Desktop memberikan lapisan kemudahan tambahan dengan antarmuka grafis, membuat pengelolaan container dapat diakses bahkan oleh mereka yang kurang nyaman dengan alat baris perintah. Lingkungan terintegrasi ini mencakup semua yang dibutuhkan untuk pengembangan lokal, mulai dari dukungan Kubernetes hingga manajemen volume.
Alur kerja tipikal mengikuti pola yang jelas:
- Pengembang membuat image menggunakan Dockerfile
- Mereka mengirimkannya ke registry seperti Docker Hub
- Akhirnya, image dijalankan sebagai container pada host yang mendukung Docker
Yang tidak disadari banyak pengembang adalah Docker tidak mengeksekusi container secara langsung. Sebaliknya, dockerd mendelegasikan eksekusi container sebenarnya ke containerd, yang berjalan di latar belakang sebagai proses terpisah.

Desain modular ini, di mana Docker menggunakan containerd untuk operasi tingkat rendah, memungkinkan setiap komponen berfokus pada keahliannya: Docker menyediakan antarmuka dan ekosistem yang ramah pengembang, sementara containerd menangani detail teknis eksekusi container.
Baik Anda baru mulai menggunakan Docker atau ingin melangkah lebih jauh, lihat 10 Ide Proyek Docker kami untuk berbagai tingkat kemampuan.
Apa Itu Containerd?
Setelah membahas pendekatan platform komprehensif Docker, kini mari kita lihat containerd, runtime khusus yang menjalankan eksekusi container baik di dalam Docker maupun di seluruh ekosistem yang lebih luas.
Runtime container standar industri
Containerd adalah runtime container inti yang ringan dan standar industri yang telah lulus dari Cloud Native Computing Foundation (CNCF), yang menandakan kematangan, keandalan, dan adopsinya yang luas. Awalnya bagian dari Docker, containerd diekstraksi pada 2017 dan disumbangkan ke CNCF untuk memungkinkan adopsi ekosistem yang lebih luas.

Berbeda dengan set fitur komprehensif Docker, cakupan containerd sengaja dibatasi: ia mengelola operasi inti siklus hidup container seperti mulai, henti, jeda, dan hapus, serta menangani transfer dan penyimpanan image. Pendekatan terfokus ini membuat containerd sangat stabil dan efisien, kualitas yang esensial untuk lingkungan produksi.
Anggap containerd sebagai "plumbing": infrastruktur yang dirancang untuk ditanamkan ke dalam sistem yang lebih besar, bukan digunakan langsung oleh manusia. Platform besar seperti Kubernetes, AWS Fargate, dan Google Kubernetes Engine semuanya bergantung pada containerd untuk mengeksekusi container, meskipun pengguna berinteraksi dengan platform tersebut melalui antarmuka masing-masing.
Arsitektur dan desain
Untuk memahami mengapa containerd banyak diadopsi dalam sistem produksi, kita perlu meninjau prinsip arsitekturnya.
Arsitektur containerd mencerminkan prinsip desain modular. Dibangun dengan standar Open Container Initiative (OCI) sebagai inti, containerd memastikan kompatibilitas di seluruh ekosistem container. Artinya, image yang sesuai OCI akan bekerja dengan containerd, terlepas dari alat apa yang membuatnya.
Arsitekturnya terdiri dari beberapa lapisan kunci:
- Lapisan API gRPC: Menyediakan model klien-server tempat banyak klien (Docker, Kubernetes, alat kustom) berkomunikasi dengan satu instance containerd
- Daemon containerd: Memelihara status container yang berjalan, mengelola penyimpanan image melalui snapshotter, dan mengoordinasikan jaringan melalui plugin
- Runtime runc: Runtime ringan yang sesuai OCI yang berinteraksi langsung dengan fitur kernel Linux, membuat namespace, menyiapkan cgroup, dan meluncurkan proses container
- Plugin modular: Snapshotter kustom untuk penyimpanan khusus, runtime alternatif (gVisor, Kata Containers), dan plugin jaringan dapat diintegrasikan tanpa mengubah containerd
Saat containerd perlu memulai sebuah container, ia memunculkan runc, yang melakukan pekerjaan sebenarnya dalam membuat namespace terisolasi, menyiapkan cgroup untuk batas sumber daya, dan meluncurkan proses container.
Pemisahan tanggung jawab ini membuat containerd sangat mudah diperluas. Organisasi dapat menyesuaikan hampir setiap aspek tanpa menyentuh kode inti containerd.
Perbedaan Utama Containerd vs Docker
Dengan pemahaman yang kuat tentang apa yang dilakukan masing-masing alat, mari kita telusuri bagaimana perbedaan keduanya dalam praktik, mulai dari arsitektur hingga pola integrasi.
Perbedaan mendasar terletak pada cakupan dan tujuan.
Docker menggunakan arsitektur daemon terpusat di mana dockerd mengoordinasikan banyak aspek yang berbeda, seperti:
- Pembuatan image
- Eksekusi container
- Jaringan
- Manajemen volume
Desain serba ada ini menyederhanakan pengalaman pengembang tetapi memperkenalkan overhead melalui beberapa lapisan abstraksi.
Sebaliknya, containerd berfokus secara sempit pada eksekusi container. Ia tidak menyertakan kemampuan pembuatan image, fitur orkestrasi, atau antarmuka grafis. Untuk jaringan, Docker menyertakan Libnetwork di dalam daemonnya, sementara containerd mengandalkan plugin Container Network Interface (CNI) eksternal yang dapat ditukar sesuai kebutuhan.
Perbedaan arsitektur ini memiliki implikasi kinerja. Dalam lingkungan dengan perubahan tinggi di mana container sering mulai dan berhenti, seperti klaster Kubernetes yang autoscaling, desain ramping containerd dapat menghasilkan waktu mulai yang lebih cepat dan konsumsi sumber daya yang lebih rendah. Overhead yang berkurang berarti containerd menggunakan lebih sedikit memori dan CPU, yang menjadi signifikan pada skala besar.
Integrasi Kubernetes
Berbicara tentang Kubernetes, hubungan antara runtime container dan platform orkestrasi telah berkembang pesat, khususnya terkait cara Kubernetes terhubung ke containerd.
Hubungan antara Kubernetes dan runtime container mengalami perubahan besar pada Kubernetes 1.24, yang dirilis pada 2022. Versi ini menghapus "Dockershim", lapisan kompatibilitas yang memungkinkan Kubernetes menggunakan Docker sebagai runtime container.
Dockershim selalu dimaksudkan sebagai jembatan sementara. Ketika Kubernetes memperkenalkan Container Runtime Interface (CRI) untuk menstandarkan komunikasi dengan runtime, Docker tidak dapat menerapkannya secara langsung karena Docker sudah ada sebelum desain CRI. Dockershim menerjemahkan antara Kubernetes dan Docker, menambahkan lapisan translasi yang pada akhirnya tidak diperlukan.
Versi Kubernetes modern berkomunikasi langsung dengan containerd melalui CRI, menghilangkan sepenuhnya lapisan translasi Docker. Penyederhanaan ini menghadirkan manfaat nyata:
- Latensi berkurang: Komunikasi langsung menghilangkan overhead translasi pada operasi container
- Stabilitas meningkat: Lebih sedikit komponen berarti lebih sedikit titik potensi kegagalan
- Kinerja lebih baik: Tumpukan runtime yang ramping sangat menguntungkan penyebaran skala besar
- Debugging lebih sederhana: Integrasi CRI langsung membuat pemecahan masalah lebih lugas
Bagi pengguna Kubernetes, perubahan ini sebagian besar bersifat transparan. Image Docker tetap sepenuhnya kompatibel karena mematuhi standar OCI. Dampak praktisnya adalah klaster Kubernetes produksi kini berjalan lebih efisien dengan menggunakan containerd secara langsung, sementara pengembang dapat terus menggunakan Docker secara lokal untuk membangun dan menguji.
Jika Anda ragu tentang kelebihan dan kekurangan menggunakan Kubernetes sejak awal, lihat artikel perbandingan Docker Compose vs Kubernetes ini.
Pembuatan dan manajemen image
Meskipun integrasi runtime sangat penting untuk orkestrasi, alur kerja pengembang sangat bergantung pada cara masing-masing alat menangani pembuatan dan penyimpanan image. Pembuatan image merupakan kesenjangan kapabilitas yang signifikan antara Docker dan containerd.
Docker menyediakan sistem build terintegrasi melalui Dockerfile dan BuildKit, memungkinkan pengembang membangun build multi-tahap yang kompleks dengan caching, paralelisasi, serta fitur lanjutan seperti build secret dan penerusan agen SSH.
Containerd, berdasarkan desain, tidak menyertakan alur kerja build image native. Untuk membangun image dengan containerd, pengembang harus menggunakan alat eksternal. Opsi yang ada termasuk menjalankan BuildKit sebagai daemon terpisah dan menggunakan buildctl untuk build melalui baris perintah, atau mengadopsi nerdctl, sebuah CLI yang kompatibel dengan Docker yang mengintegrasikan BuildKit.
Mekanisme penyimpanan juga berbeda dalam filosofi. Manajemen volume Docker memberikan abstraksi yang terasa alami bagi pengembang, dengan volume bernama yang mempertahankan data secara independen dari siklus hidup container. Containerd menggunakan sistem snapshotter yang lebih tingkat rendah, di mana driver snapshot yang berbeda dapat dipasang untuk menangani filesystem berlapis secara berbeda berdasarkan kebutuhan penyimpanan yang mendasarinya.
Perbedaan ini mencerminkan target audiens alat tersebut:
- Docker mengoptimalkan produktivitas pengembang dengan kemudahan bawaan
- Containerd menyediakan primitif yang fleksibel yang dapat dirangkai pembangun platform sesuai kebutuhan spesifik mereka
CLI, pengalaman pengembang, dan nerdctl
Di luar arsitektur dan fitur, pengalaman harian pengembang paling langsung dibentuk oleh antarmuka baris perintah yang disediakan masing-masing alat. Pengalaman baris perintah paling jelas memperlihatkan perbedaan filosofi desain.
CLI Docker terkenal karena kemudahan penggunaannya. Perintah seperti docker run, docker build, dan docker logs intuitif, terdokumentasi dengan baik, dan dirancang untuk manusia. CLI mencakup default yang membantu, pesan kesalahan yang jelas, dan opsi ekstensif yang mencakup sebagian besar kasus penggunaan.
Containerd menyertakan ctr, sebuah CLI minimal yang ditujukan murni untuk debugging dan pengujian fungsionalitas containerd tingkat rendah. Alat ctr sengaja tidak ramah bagi pengembang. Ia tidak memiliki fitur umum seperti singkatan pemetaan port, kebijakan mulai ulang otomatis, dan integrasi dengan credential helper. Alat ini dirancang untuk pengembang containerd, bukan pengembang aplikasi.
Menjembatani kesenjangan dengan nerdctl
Kesenjangan kegunaan ini memicu pembuatan nerdctl, sebuah CLI yang kompatibel dengan Docker untuk containerd. Menggunakan nerdctl terasa identik dengan menggunakan Docker, dengan sintaks perintah, flag, dan alur kerja yang sama, tetapi menggunakan containerd sebagai runtime yang mendasarinya. Ini menjadikan nerdctl jembatan yang sangat baik bagi tim yang bertransisi dari Docker ke containerd di lingkungan pengembangan.
Dalam praktiknya, pengembang jarang berinteraksi langsung dengan containerd. Saat mereka perlu melakukannya, nerdctl menyediakan antarmuka yang familiar seperti yang diharapkan, sementara operator platform dan administrator menggunakan API containerd secara terprogram melalui sistem orkestrasi seperti Kubernetes.
Untuk mengilustrasikan perbedaan dalam praktik, berikut perbandingan cara operasi container umum di tiga alat CLI tersebut:
|
Tugas
|
Docker
|
nerdctl
|
ctr
|
|
Menjalankan container
|
docker run -d -p 8080:80 nginx
|
nerdctl run -d -p 8080:80 nginx
|
ctr run --net-host -d docker.io/library/nginx:latest nginx_id
|
|
Daftar container
|
docker ps
|
nerdctl ps
|
ctr tasks list
|
|
Membangun image
|
docker build -t myapp .
|
nerdctl build -t myapp .
|
Tidak didukung
|
|
Melihat log
|
docker logs <container>
|
nerdctl logs <container>
|
Tidak didukung
|
|
Memeriksa container
|
docker inspect <container>
|
nerdctl inspect <container>
|
ctr containers info <container>
|
|
Mengambil image
|
docker pull nginx
|
nerdctl pull nginx
|
ctr images pull docker.io/library/nginx:latest
|
|
Dukungan Compose
|
docker compose up
|
nerdctl compose up
|
Tidak didukung
|
Catatan: ctr tidak memiliki pemetaan port (-p) dan memerlukan jaringan host (--net-host) untuk mengekspos layanan. Ia juga tidak secara otomatis mengambil image.
Gambaran perbedaan utama
Sebelum kita masuk ke rekomendasi untuk kasus penggunaan spesifik, mari kita rekap perbedaan yang telah kita bahas sejauh ini. Tabel berikut merangkum perbedaan fungsional utama antara Docker dan containerd, menyoroti kapabilitas dan target audiens yang berbeda:
|
Fitur
|
Docker
|
Containerd
|
|
Pembuatan Image
|
Terintegrasi (Dockerfile, BuildKit)
|
Memerlukan alat eksternal (buildctl, nerdctl)
|
|
Orkestrasi
|
Docker Swarm / Kubernetes
|
Tidak ada (digunakan oleh Kubernetes)
|
|
Manajemen Penyimpanan
|
Manajemen volume
|
Sistem snapshotter
|
|
Antarmuka Grafis
|
Docker Desktop
|
Tidak ada
|
|
Siklus Hidup Container
|
Manajemen penuh (melalui containerd)
|
Fokus inti (kompatibel CRI)
|
|
Pengguna Utama
|
Pengembang Aplikasi
|
Operator Klaster, Pembangun Platform
|
Mengapa Memilih Docker?
Setelah membahas perbedaan teknis, mari kita jelajahi skenario praktis tempat masing-masing alat unggul. Terlepas dari meningkatnya penggunaan containerd di lingkungan produksi, Docker tetap menjadi pilihan unggul untuk skenario tertentu ketika pengalaman pengembang dan tooling komprehensif sangat penting.
Untuk pengembangan lokal dan prototipe
Docker unggul ketika Anda membutuhkan solusi "serba ada" untuk menulis dan menguji kode. Rangkaian alat terintegrasi berarti pengembang dapat beralih dari nol ke menjalankan container dalam hitungan menit, tanpa menyusun banyak komponen atau mengonfigurasi jaringan yang kompleks.
Ekosistem Docker memberikan manfaat produktivitas yang besar:
- Docker Hub: Jutaan image siap pakai untuk basis data, antrian pesan, dan web server
- Docker Compose: Definisikan aplikasi multi-container dalam satu file YAML dan jalankan seluruh lingkungan pengembangan dengan satu perintah
- GUI Docker Desktop: Manajemen container secara visual, penjelajahan volume, penyesuaian batas sumber daya, dan dukungan Kubernetes terintegrasi
- Hambatan masuk lebih rendah: Alat grafis dan perintah yang intuitif membuat container dapat diakses oleh pengembang yang baru memulai

Untuk tim yang menggunakan Docker Desktop, GUI menyediakan kemudahan tambahan yang secara signifikan mempercepat onboarding dan alur kerja harian.
Untuk pipeline build yang kompleks
Di luar pengembangan, kapabilitas build Docker menjadikannya pilihan alami untuk alur kerja integrasi dan deployment berkelanjutan yang canggih.
BuildKit terintegrasi Docker menyediakan fitur lanjutan yang esensial untuk pipeline CI/CD modern. Build multi-tahap meminimalkan ukuran image sambil menjaga Dockerfile tetap mudah dibaca. Mekanisme caching BuildKit secara cerdas menggunakan ulang layer di seluruh build, secara drastis mengurangi waktu build di lingkungan integrasi berkelanjutan.
Sebagian besar platform otomasi, seperti GitHub Actions, GitLab CI, Jenkins, dan lainnya, memiliki integrasi Docker yang matang dan teruji. Integrasi ini menangani autentikasi, caching, dan publikasi image tanpa hambatan.
Meskipun alat lain dapat mencapai hasil serupa, keberadaan Docker yang ubiquitous berarti solusi dan bantuan pemecahan masalah mudah tersedia, yang merupakan nilai tambah besar lainnya.
Mengapa Memilih Containerd?
Containerd menonjol dalam skenario produksi di mana minimalisme, kinerja, dan stabilitas lebih diutamakan daripada kenyamanan tooling terintegrasi.
Untuk klaster Kubernetes produksi
Menggunakan containerd sebagai runtime untuk node Kubernetes menghadirkan manfaat terukur:
- Overhead berkurang: Menghilangkan daemon Docker berarti konsumsi sumber daya per node lebih rendah dan penghematan yang berarti pada skala besar
- Stabilitas meningkat: Lebih sedikit komponen berarti lebih sedikit titik potensi kegagalan dalam infrastruktur Anda
- Permukaan serangan lebih kecil: Lebih sedikit kode untuk diaudit dan lebih sedikit potensi kerentanan keamanan
- Debugging lebih sederhana: Integrasi CRI langsung menghapus lapisan translasi dockershim, membuat pemecahan masalah lebih lugas
- Kinerja lebih baik: Tumpukan runtime yang ramping meningkatkan waktu mulai container dan responsivitas

Status kelulusan CNCF untuk containerd menandakan kematangan dan keandalannya. Penyedia cloud besar, termasuk AWS, Google Cloud, dan Azure, telah menstandarkan containerd untuk penawaran Kubernetes terkelola mereka, menunjukkan keyakinan pada kesiapan produksinya untuk infrastruktur yang kritis.
Untuk lingkungan khusus yang minimal
Meskipun Kubernetes adalah kasus penggunaan produksi yang paling umum, sifat containerd yang ringan membuka peluang untuk skenario deployment di mana Docker akan kurang praktis.
Edge computing dan perangkat IoT sering beroperasi di bawah batasan sumber daya yang ketat. Desain containerd yang ringan membuatnya layak di lingkungan ini, di mana tumpukan penuh Docker akan memberatkan. Setiap megabita memori dan setiap siklus CPU sangat berarti saat berjalan di perangkat tertanam.
Skenario keamanan tingkat lanjut mendapatkan manfaat dari arsitektur runtime modular containerd. Organisasi dapat mengintegrasikan runtime sandbox untuk beban kerja yang memerlukan batas keamanan tambahan. Contohnya meliputi:
- gVisor: menyediakan isolasi kernel yang kuat
- Kata Containers: menjalankan container dalam VM ringan
Integrasi ini dipasang ke containerd tanpa memerlukan modifikasi ekstensif.
Migrasi dari Docker ke Containerd
Memahami kapan menggunakan masing-masing alat itu penting, tetapi mengetahui cara bertransisi di antara keduanya sama pentingnya. Transisi dari Docker ke containerd di lingkungan yang sudah ada memerlukan perencanaan cermat, namun prosesnya terdokumentasi dengan baik dan langsung.
Migrasi node Kubernetes
Langkah operasional untuk memigrasikan node Kubernetes dari Docker ke containerd mengikuti pola standar:
-
Cordon node: Cegah pod baru dijadwalkan (kubectl cordon <node-name>)
-
Drain pod yang ada: Pindahkan beban kerja ke node lain (kubectl drain <node-name>)
-
Perbarui konfigurasi Kubelet: Arahkan ke soket CRI containerd di /run/containerd/containerd.sock
-
Verifikasi plugin CNI: Pastikan containerd memiliki plugin jaringan yang diperlukan
-
Mulai ulang Kubelet: Daftarkan dengan runtime baru dan bergabung kembali ke klaster
Menguji migrasi pada node non-produksi terlebih dahulu membantu mengidentifikasi masalah spesifik lingkungan sebelum melakukan perubahan di seluruh klaster. Untuk menghindari jebakan umum, pastikan mengikuti praktik terbaik berikut:
- Perubahan path log: Docker dan containerd menggunakan lokasi log default yang berbeda, jadi perbarui infrastruktur logging Anda sesuai
- Pasang plugin CNI yang hilang: Containerd memerlukan biner plugin CNI untuk jaringan; ini tidak selalu terpasang secara default
- Perhatikan perbedaan pengambilan image: Autentikasi dan konfigurasi registry mungkin perlu penyesuaian
- Waspadai ketidakcocokan driver penyimpanan: Pastikan volume persisten Anda kompatibel dengan snapshotter containerd
Menavigasi perbedaan CLI
Setelah infrastruktur Anda dimigrasikan, pengembang perlu menyesuaikan alur kerja harian mereka untuk bekerja dengan runtime baru.
Bagi pengembang yang terbiasa dengan perintah Docker, nerdctl memberikan pengalaman yang hampir identik. Perintah seperti nerdctl run, nerdctl build, dan nerdctl compose up bekerja persis seperti padanan Docker-nya, sehingga transisi menjadi mulus.
Untuk debugging, memahami cara memetakan alur kerja debugging Docker ke containerd sangat penting. Jika Anda menggunakan docker inspect untuk memeriksa container, ctr containers info menyediakan informasi serupa, meski dalam format berbeda. Demikian pula, ctr tasks list menampilkan container yang berjalan.
Sebagian besar pengembang menemukan bahwa nerdctl menghilangkan kebutuhan mempelajari sintaks ctr untuk tugas sehari-hari. ctr tingkat rendah tetap berguna untuk pemecahan masalah spesifik runtime atau saat bekerja langsung dengan API containerd.
Kesimpulan
Hubungan antara Docker dan containerd adalah contoh sempurna dari desain modular yang sukses dalam infrastruktur perangkat lunak. Docker tetap menjadi alat optimal untuk manusia yang menulis kode, karena menyediakan pengalaman terintegrasi, ekosistem komprehensif, dan antarmuka yang ramah pengembang yang membuat pembangunan aplikasi terkontainer menjadi produktif (dan menyenangkan).
Sementara itu, containerd unggul sebagai runtime bagi mesin yang mengeksekusi kode, menawarkan stabilitas, kinerja, dan minimalisme yang dibutuhkan untuk platform orkestrasi produksi. Fakta bahwa Docker Engine menggunakan containerd di balik layar menunjukkan bagaimana kedua alat ini saling melengkapi, bukan saling bersaing.
Saya merekomendasikan pendekatan yang pragmatis bagi sebagian besar organisasi: terus gunakan Docker di laptop pengembang di mana toolset-nya mempercepat alur kerja pengembangan, tetapi pertimbangkan untuk memigrasikan klaster Kubernetes produksi langsung ke containerd demi manfaat operasional berupa overhead yang berkurang dan tumpukan runtime yang lebih sederhana.
Apakah Anda memilih platform komprehensif Docker atau runtime terfokus containerd, keduanya tetap menjadi komponen esensial dari ekosistem container modern, masing-masing dioptimalkan untuk tahap yang berbeda dalam siklus hidup aplikasi.
Untuk terus belajar, pastikan Anda mendaftar di jalur keterampilan Kontainerisasi dan Virtualisasi dengan Docker dan Kubernetes kami.
Dalam ekosistem container, kebingungan umum sering muncul saat pengembang membandingkan Docker (sebuah platform komprehensif) dengan containerd, yang sebenarnya adalah komponen runtime yang terfokus. Perbandingan ini seperti membandingkan sebuah mobil lengkap dengan mesinnya: keduanya penting, tetapi berfungsi untuk tujuan yang berbeda pada tingkat abstraksi yang berbeda.
Dalam panduan ini, saya akan memperjelas hubungan antara kedua teknologi ini, menelusuri arsitektur, integrasi Kubernetes, dan skenario spesifik tempat masing-masing alat unggul. Baik Anda membuat container secara lokal maupun mengelola klaster Kubernetes produksi, memahami kapan menggunakan Docker versus containerd dapat berdampak signifikan pada keputusan infrastruktur Anda.
Pada akhir artikel ini, Anda akan memiliki pemahaman yang jelas tentang bagaimana Docker dan containerd saling melengkapi, serta cara memilih alat yang tepat untuk kebutuhan spesifik Anda, baik untuk pengembangan lokal yang cepat maupun penyebaran produksi skala besar.
Jika Anda baru mengenal kontainerisasi, saya sangat merekomendasikan mengikuti kursus Konsep Kontainerisasi dan Virtualisasi kami.
Apa Itu Docker?
Docker merevolusi lanskap pengembangan perangkat lunak dengan membuat kontainerisasi menjadi mudah diakses dan praktis bagi pengembang sehari-hari. Sebagai platform komprehensif, Docker menyediakan semua yang dibutuhkan untuk membangun, mengirim, dan menjalankan aplikasi terkontainer.
Bagi pemula, Panduan Praktis tentang Container ini memberikan pengantar yang sangat baik tentang Docker dan container.
Platform container yang komprehensif
Docker berfungsi sebagai platform container serba ada, menawarkan tumpukan alat terintegrasi yang mencakup sebagian besar siklus hidup container. Intinya, Docker mengemas aplikasi beserta semua dependensinya ke dalam image portabel dan mandiri yang dapat berjalan secara konsisten di berbagai lingkungan, mulai dari laptop pengembang hingga server produksi.
Pendekatan komprehensif ini menjadikan Docker standar industri untuk pengembangan lokal dan pengalaman pengembang. Beberapa manfaat utamanya meliputi:
Komponen kunci dan alur kerja
Arsitektur Docker terdiri dari beberapa komponen yang saling terhubung dan bekerja mulus bersama.
Docker CLI menyediakan antarmuka yang dihadapi pengguna tempat pengembang menjalankan perintah. Saat Anda menjalankan perintah seperti
docker run, CLI berkomunikasi dengan daemon Docker (dockerd), yang berfungsi sebagai layanan inti yang mengelola container, image, jaringan, dan volume.Bagi pengguna Windows dan macOS, Docker Desktop memberikan lapisan kemudahan tambahan dengan antarmuka grafis, membuat pengelolaan container dapat diakses bahkan oleh mereka yang kurang nyaman dengan alat baris perintah. Lingkungan terintegrasi ini mencakup semua yang dibutuhkan untuk pengembangan lokal, mulai dari dukungan Kubernetes hingga manajemen volume.
Alur kerja tipikal mengikuti pola yang jelas:
Yang tidak disadari banyak pengembang adalah Docker tidak mengeksekusi container secara langsung. Sebaliknya,
dockerdmendelegasikan eksekusi container sebenarnya ke containerd, yang berjalan di latar belakang sebagai proses terpisah.Desain modular ini, di mana Docker menggunakan containerd untuk operasi tingkat rendah, memungkinkan setiap komponen berfokus pada keahliannya: Docker menyediakan antarmuka dan ekosistem yang ramah pengembang, sementara containerd menangani detail teknis eksekusi container.
Baik Anda baru mulai menggunakan Docker atau ingin melangkah lebih jauh, lihat 10 Ide Proyek Docker kami untuk berbagai tingkat kemampuan.
Apa Itu Containerd?
Setelah membahas pendekatan platform komprehensif Docker, kini mari kita lihat containerd, runtime khusus yang menjalankan eksekusi container baik di dalam Docker maupun di seluruh ekosistem yang lebih luas.
Runtime container standar industri
Containerd adalah runtime container inti yang ringan dan standar industri yang telah lulus dari Cloud Native Computing Foundation (CNCF), yang menandakan kematangan, keandalan, dan adopsinya yang luas. Awalnya bagian dari Docker, containerd diekstraksi pada 2017 dan disumbangkan ke CNCF untuk memungkinkan adopsi ekosistem yang lebih luas.
Berbeda dengan set fitur komprehensif Docker, cakupan containerd sengaja dibatasi: ia mengelola operasi inti siklus hidup container seperti mulai, henti, jeda, dan hapus, serta menangani transfer dan penyimpanan image. Pendekatan terfokus ini membuat containerd sangat stabil dan efisien, kualitas yang esensial untuk lingkungan produksi.
Anggap containerd sebagai "plumbing": infrastruktur yang dirancang untuk ditanamkan ke dalam sistem yang lebih besar, bukan digunakan langsung oleh manusia. Platform besar seperti Kubernetes, AWS Fargate, dan Google Kubernetes Engine semuanya bergantung pada containerd untuk mengeksekusi container, meskipun pengguna berinteraksi dengan platform tersebut melalui antarmuka masing-masing.
Arsitektur dan desain
Untuk memahami mengapa containerd banyak diadopsi dalam sistem produksi, kita perlu meninjau prinsip arsitekturnya.
Arsitektur containerd mencerminkan prinsip desain modular. Dibangun dengan standar Open Container Initiative (OCI) sebagai inti, containerd memastikan kompatibilitas di seluruh ekosistem container. Artinya, image yang sesuai OCI akan bekerja dengan containerd, terlepas dari alat apa yang membuatnya.
Arsitekturnya terdiri dari beberapa lapisan kunci:
Saat containerd perlu memulai sebuah container, ia memunculkan runc, yang melakukan pekerjaan sebenarnya dalam membuat namespace terisolasi, menyiapkan cgroup untuk batas sumber daya, dan meluncurkan proses container.
Pemisahan tanggung jawab ini membuat containerd sangat mudah diperluas. Organisasi dapat menyesuaikan hampir setiap aspek tanpa menyentuh kode inti containerd.
Perbedaan Utama Containerd vs Docker
Dengan pemahaman yang kuat tentang apa yang dilakukan masing-masing alat, mari kita telusuri bagaimana perbedaan keduanya dalam praktik, mulai dari arsitektur hingga pola integrasi.
Runtime container vs platform
Perbedaan mendasar terletak pada cakupan dan tujuan.
Docker menggunakan arsitektur daemon terpusat di mana
dockerdmengoordinasikan banyak aspek yang berbeda, seperti:Desain serba ada ini menyederhanakan pengalaman pengembang tetapi memperkenalkan overhead melalui beberapa lapisan abstraksi.
Sebaliknya, containerd berfokus secara sempit pada eksekusi container. Ia tidak menyertakan kemampuan pembuatan image, fitur orkestrasi, atau antarmuka grafis. Untuk jaringan, Docker menyertakan
Libnetworkdi dalam daemonnya, sementara containerd mengandalkan plugin Container Network Interface (CNI) eksternal yang dapat ditukar sesuai kebutuhan.Perbedaan arsitektur ini memiliki implikasi kinerja. Dalam lingkungan dengan perubahan tinggi di mana container sering mulai dan berhenti, seperti klaster Kubernetes yang autoscaling, desain ramping containerd dapat menghasilkan waktu mulai yang lebih cepat dan konsumsi sumber daya yang lebih rendah. Overhead yang berkurang berarti containerd menggunakan lebih sedikit memori dan CPU, yang menjadi signifikan pada skala besar.
Integrasi Kubernetes
Berbicara tentang Kubernetes, hubungan antara runtime container dan platform orkestrasi telah berkembang pesat, khususnya terkait cara Kubernetes terhubung ke containerd.
Hubungan antara Kubernetes dan runtime container mengalami perubahan besar pada Kubernetes 1.24, yang dirilis pada 2022. Versi ini menghapus "Dockershim", lapisan kompatibilitas yang memungkinkan Kubernetes menggunakan Docker sebagai runtime container.
Dockershim selalu dimaksudkan sebagai jembatan sementara. Ketika Kubernetes memperkenalkan Container Runtime Interface (CRI) untuk menstandarkan komunikasi dengan runtime, Docker tidak dapat menerapkannya secara langsung karena Docker sudah ada sebelum desain CRI. Dockershim menerjemahkan antara Kubernetes dan Docker, menambahkan lapisan translasi yang pada akhirnya tidak diperlukan.
Versi Kubernetes modern berkomunikasi langsung dengan containerd melalui CRI, menghilangkan sepenuhnya lapisan translasi Docker. Penyederhanaan ini menghadirkan manfaat nyata:
Bagi pengguna Kubernetes, perubahan ini sebagian besar bersifat transparan. Image Docker tetap sepenuhnya kompatibel karena mematuhi standar OCI. Dampak praktisnya adalah klaster Kubernetes produksi kini berjalan lebih efisien dengan menggunakan containerd secara langsung, sementara pengembang dapat terus menggunakan Docker secara lokal untuk membangun dan menguji.
Jika Anda ragu tentang kelebihan dan kekurangan menggunakan Kubernetes sejak awal, lihat artikel perbandingan Docker Compose vs Kubernetes ini.
Pembuatan dan manajemen image
Meskipun integrasi runtime sangat penting untuk orkestrasi, alur kerja pengembang sangat bergantung pada cara masing-masing alat menangani pembuatan dan penyimpanan image. Pembuatan image merupakan kesenjangan kapabilitas yang signifikan antara Docker dan containerd.
Docker menyediakan sistem build terintegrasi melalui Dockerfile dan BuildKit, memungkinkan pengembang membangun build multi-tahap yang kompleks dengan caching, paralelisasi, serta fitur lanjutan seperti build secret dan penerusan agen SSH.
Containerd, berdasarkan desain, tidak menyertakan alur kerja build image native. Untuk membangun image dengan containerd, pengembang harus menggunakan alat eksternal. Opsi yang ada termasuk menjalankan BuildKit sebagai daemon terpisah dan menggunakan
buildctluntuk build melalui baris perintah, atau mengadopsinerdctl, sebuah CLI yang kompatibel dengan Docker yang mengintegrasikan BuildKit.Mekanisme penyimpanan juga berbeda dalam filosofi. Manajemen volume Docker memberikan abstraksi yang terasa alami bagi pengembang, dengan volume bernama yang mempertahankan data secara independen dari siklus hidup container. Containerd menggunakan sistem snapshotter yang lebih tingkat rendah, di mana driver snapshot yang berbeda dapat dipasang untuk menangani filesystem berlapis secara berbeda berdasarkan kebutuhan penyimpanan yang mendasarinya.
Perbedaan ini mencerminkan target audiens alat tersebut:
CLI, pengalaman pengembang, dan nerdctl
Di luar arsitektur dan fitur, pengalaman harian pengembang paling langsung dibentuk oleh antarmuka baris perintah yang disediakan masing-masing alat. Pengalaman baris perintah paling jelas memperlihatkan perbedaan filosofi desain.
CLI Docker terkenal karena kemudahan penggunaannya. Perintah seperti
docker run,docker build, dandocker logsintuitif, terdokumentasi dengan baik, dan dirancang untuk manusia. CLI mencakup default yang membantu, pesan kesalahan yang jelas, dan opsi ekstensif yang mencakup sebagian besar kasus penggunaan.Containerd menyertakan
ctr, sebuah CLI minimal yang ditujukan murni untuk debugging dan pengujian fungsionalitas containerd tingkat rendah. Alatctrsengaja tidak ramah bagi pengembang. Ia tidak memiliki fitur umum seperti singkatan pemetaan port, kebijakan mulai ulang otomatis, dan integrasi dengan credential helper. Alat ini dirancang untuk pengembang containerd, bukan pengembang aplikasi.Menjembatani kesenjangan dengan nerdctl
Kesenjangan kegunaan ini memicu pembuatan
nerdctl, sebuah CLI yang kompatibel dengan Docker untuk containerd. Menggunakannerdctlterasa identik dengan menggunakan Docker, dengan sintaks perintah, flag, dan alur kerja yang sama, tetapi menggunakan containerd sebagai runtime yang mendasarinya. Ini menjadikannerdctljembatan yang sangat baik bagi tim yang bertransisi dari Docker ke containerd di lingkungan pengembangan.Dalam praktiknya, pengembang jarang berinteraksi langsung dengan containerd. Saat mereka perlu melakukannya,
nerdctlmenyediakan antarmuka yang familiar seperti yang diharapkan, sementara operator platform dan administrator menggunakan API containerd secara terprogram melalui sistem orkestrasi seperti Kubernetes.Untuk mengilustrasikan perbedaan dalam praktik, berikut perbandingan cara operasi container umum di tiga alat CLI tersebut:
Tugas
Docker
nerdctl
ctr
Menjalankan container
docker run -d -p 8080:80 nginxnerdctl run -d -p 8080:80 nginxctr run --net-host -d docker.io/library/nginx:latest nginx_idDaftar container
docker psnerdctl psctr tasks listMembangun image
docker build -t myapp .nerdctl build -t myapp .Tidak didukung
Melihat log
docker logs <container>nerdctl logs <container>Tidak didukung
Memeriksa container
docker inspect <container>nerdctl inspect <container>ctr containers info <container>Mengambil image
docker pull nginxnerdctl pull nginxctr images pull docker.io/library/nginx:latestDukungan Compose
docker compose upnerdctl compose upTidak didukung
Catatan: ctr tidak memiliki pemetaan port (
-p) dan memerlukan jaringan host (--net-host) untuk mengekspos layanan. Ia juga tidak secara otomatis mengambil image.Gambaran perbedaan utama
Sebelum kita masuk ke rekomendasi untuk kasus penggunaan spesifik, mari kita rekap perbedaan yang telah kita bahas sejauh ini. Tabel berikut merangkum perbedaan fungsional utama antara Docker dan containerd, menyoroti kapabilitas dan target audiens yang berbeda:
Fitur
Docker
Containerd
Pembuatan Image
Terintegrasi (Dockerfile, BuildKit)
Memerlukan alat eksternal (buildctl, nerdctl)
Orkestrasi
Docker Swarm / Kubernetes
Tidak ada (digunakan oleh Kubernetes)
Manajemen Penyimpanan
Manajemen volume
Sistem snapshotter
Antarmuka Grafis
Docker Desktop
Tidak ada
Siklus Hidup Container
Manajemen penuh (melalui containerd)
Fokus inti (kompatibel CRI)
Pengguna Utama
Pengembang Aplikasi
Operator Klaster, Pembangun Platform
Mengapa Memilih Docker?
Setelah membahas perbedaan teknis, mari kita jelajahi skenario praktis tempat masing-masing alat unggul. Terlepas dari meningkatnya penggunaan containerd di lingkungan produksi, Docker tetap menjadi pilihan unggul untuk skenario tertentu ketika pengalaman pengembang dan tooling komprehensif sangat penting.
Untuk pengembangan lokal dan prototipe
Docker unggul ketika Anda membutuhkan solusi "serba ada" untuk menulis dan menguji kode. Rangkaian alat terintegrasi berarti pengembang dapat beralih dari nol ke menjalankan container dalam hitungan menit, tanpa menyusun banyak komponen atau mengonfigurasi jaringan yang kompleks.
Ekosistem Docker memberikan manfaat produktivitas yang besar:
Untuk tim yang menggunakan Docker Desktop, GUI menyediakan kemudahan tambahan yang secara signifikan mempercepat onboarding dan alur kerja harian.
Untuk pipeline build yang kompleks
Di luar pengembangan, kapabilitas build Docker menjadikannya pilihan alami untuk alur kerja integrasi dan deployment berkelanjutan yang canggih.
BuildKit terintegrasi Docker menyediakan fitur lanjutan yang esensial untuk pipeline CI/CD modern. Build multi-tahap meminimalkan ukuran image sambil menjaga Dockerfile tetap mudah dibaca. Mekanisme caching BuildKit secara cerdas menggunakan ulang layer di seluruh build, secara drastis mengurangi waktu build di lingkungan integrasi berkelanjutan.
Sebagian besar platform otomasi, seperti GitHub Actions, GitLab CI, Jenkins, dan lainnya, memiliki integrasi Docker yang matang dan teruji. Integrasi ini menangani autentikasi, caching, dan publikasi image tanpa hambatan.
Meskipun alat lain dapat mencapai hasil serupa, keberadaan Docker yang ubiquitous berarti solusi dan bantuan pemecahan masalah mudah tersedia, yang merupakan nilai tambah besar lainnya.
Mengapa Memilih Containerd?
Containerd menonjol dalam skenario produksi di mana minimalisme, kinerja, dan stabilitas lebih diutamakan daripada kenyamanan tooling terintegrasi.
Untuk klaster Kubernetes produksi
Menggunakan containerd sebagai runtime untuk node Kubernetes menghadirkan manfaat terukur:
Status kelulusan CNCF untuk containerd menandakan kematangan dan keandalannya. Penyedia cloud besar, termasuk AWS, Google Cloud, dan Azure, telah menstandarkan containerd untuk penawaran Kubernetes terkelola mereka, menunjukkan keyakinan pada kesiapan produksinya untuk infrastruktur yang kritis.
Untuk lingkungan khusus yang minimal
Meskipun Kubernetes adalah kasus penggunaan produksi yang paling umum, sifat containerd yang ringan membuka peluang untuk skenario deployment di mana Docker akan kurang praktis.
Edge computing dan perangkat IoT sering beroperasi di bawah batasan sumber daya yang ketat. Desain containerd yang ringan membuatnya layak di lingkungan ini, di mana tumpukan penuh Docker akan memberatkan. Setiap megabita memori dan setiap siklus CPU sangat berarti saat berjalan di perangkat tertanam.
Skenario keamanan tingkat lanjut mendapatkan manfaat dari arsitektur runtime modular containerd. Organisasi dapat mengintegrasikan runtime sandbox untuk beban kerja yang memerlukan batas keamanan tambahan. Contohnya meliputi:
Integrasi ini dipasang ke containerd tanpa memerlukan modifikasi ekstensif.
Migrasi dari Docker ke Containerd
Memahami kapan menggunakan masing-masing alat itu penting, tetapi mengetahui cara bertransisi di antara keduanya sama pentingnya. Transisi dari Docker ke containerd di lingkungan yang sudah ada memerlukan perencanaan cermat, namun prosesnya terdokumentasi dengan baik dan langsung.
Migrasi node Kubernetes
Langkah operasional untuk memigrasikan node Kubernetes dari Docker ke containerd mengikuti pola standar:
Cordon node: Cegah pod baru dijadwalkan (
kubectl cordon <node-name>)Drain pod yang ada: Pindahkan beban kerja ke node lain (
kubectl drain <node-name>)Perbarui konfigurasi Kubelet: Arahkan ke soket CRI containerd di
/run/containerd/containerd.sockVerifikasi plugin CNI: Pastikan containerd memiliki plugin jaringan yang diperlukan
Mulai ulang Kubelet: Daftarkan dengan runtime baru dan bergabung kembali ke klaster
Menguji migrasi pada node non-produksi terlebih dahulu membantu mengidentifikasi masalah spesifik lingkungan sebelum melakukan perubahan di seluruh klaster. Untuk menghindari jebakan umum, pastikan mengikuti praktik terbaik berikut:
Menavigasi perbedaan CLI
Setelah infrastruktur Anda dimigrasikan, pengembang perlu menyesuaikan alur kerja harian mereka untuk bekerja dengan runtime baru.
Bagi pengembang yang terbiasa dengan perintah Docker, nerdctl memberikan pengalaman yang hampir identik. Perintah seperti
nerdctl run,nerdctl build, dannerdctl compose upbekerja persis seperti padanan Docker-nya, sehingga transisi menjadi mulus.Untuk debugging, memahami cara memetakan alur kerja debugging Docker ke containerd sangat penting. Jika Anda menggunakan
docker inspectuntuk memeriksa container,ctr containers infomenyediakan informasi serupa, meski dalam format berbeda. Demikian pula,ctr tasks listmenampilkan container yang berjalan.Sebagian besar pengembang menemukan bahwa
nerdctlmenghilangkan kebutuhan mempelajari sintaksctruntuk tugas sehari-hari.ctrtingkat rendah tetap berguna untuk pemecahan masalah spesifik runtime atau saat bekerja langsung dengan API containerd.Kesimpulan
Hubungan antara Docker dan containerd adalah contoh sempurna dari desain modular yang sukses dalam infrastruktur perangkat lunak. Docker tetap menjadi alat optimal untuk manusia yang menulis kode, karena menyediakan pengalaman terintegrasi, ekosistem komprehensif, dan antarmuka yang ramah pengembang yang membuat pembangunan aplikasi terkontainer menjadi produktif (dan menyenangkan).
Sementara itu, containerd unggul sebagai runtime bagi mesin yang mengeksekusi kode, menawarkan stabilitas, kinerja, dan minimalisme yang dibutuhkan untuk platform orkestrasi produksi. Fakta bahwa Docker Engine menggunakan containerd di balik layar menunjukkan bagaimana kedua alat ini saling melengkapi, bukan saling bersaing.
Saya merekomendasikan pendekatan yang pragmatis bagi sebagian besar organisasi: terus gunakan Docker di laptop pengembang di mana toolset-nya mempercepat alur kerja pengembangan, tetapi pertimbangkan untuk memigrasikan klaster Kubernetes produksi langsung ke containerd demi manfaat operasional berupa overhead yang berkurang dan tumpukan runtime yang lebih sederhana.
Apakah Anda memilih platform komprehensif Docker atau runtime terfokus containerd, keduanya tetap menjadi komponen esensial dari ekosistem container modern, masing-masing dioptimalkan untuk tahap yang berbeda dalam siklus hidup aplikasi.
Untuk terus belajar, pastikan Anda mendaftar di jalur keterampilan Kontainerisasi dan Virtualisasi dengan Docker dan Kubernetes kami.