System Container Incus/LXC vs Application Container Docker

Foto oleh Manele R. via Wikimedia Commons (CC BY 2.0)
System container mensimulasikan sistem operasi penuh: ia menjalankan init sendiri (seperti systemd), banyak proses, user, dan state persisten, berperilaku seperti server ringan yang Anda login ke dalamnya. Application container, seperti milik Docker, membungkus satu proses beserta dependensinya sebagai image immutable dan sekali pakai. Keduanya berbagi kernel host, tapi dibangun untuk siklus hidup yang berlawanan.
Incus adalah fork komunitas dari LXD, dibuat setelah Canonical mengambil alih LXD, dan kini dikelola di bawah proyek Linux Containers. Incus mengelola system container LXC dan virtual machine penuh dari satu CLI dan API. LTS saat ini adalah Incus 6.0, dengan Incus 7.x pada jalur feature-release.
Bisa. Anda mengaktifkan security.nesting pada container dan menginstal Docker seperti biasa, cara umum untuk mendapat isolasi gaya VM plus ekosistem Docker di satu host. Kebalikannya tidak bisa: Anda tidak bisa menjalankan Incus di dalam application container Docker. Sejak Incus 6.3 Anda juga bisa menjalankan image OCI/Docker langsung di Incus tanpa Docker sama sekali.
Pakai system container saat workload Anda Linux-di-atas-Linux dan Anda menginginkan kepadatan serta startup cepat: container berbagi satu kernel dan hanya memakai memori yang disentuh prosesnya, jadi muat jauh lebih banyak per host dibanding VM. Pilih VM saat Anda butuh versi kernel berbeda, guest non-Linux, modul kernel kustom, atau isolasi keras untuk kode tak tepercaya.
Tidak, keduanya memecahkan masalah berbeda. Docker unggul dalam membungkus dan mengirim satu aplikasi stateless dengan ekosistem besar berupa registry, Compose, dan integrasi CI. Incus unggul dalam menjalankan banyak environment OS penuh yang persisten dan terisolasi dengan murah. Banyak setup memakai keduanya: system container Incus untuk isolasi, Docker di dalamnya untuk workflow app-container.

Foto oleh Manele R. via Wikimedia Commons (CC BY 2.0)
Ringkasan Utama
Incus dan LXC menjalankan system container: instance Linux OS penuh yang persisten, dengan systemd, user, dan service sendiri yang berbagi kernel host. Docker menjalankan application container: satu proses, immutable, sekali pakai. Pakai Incus saat butuh kotak mirip VM yang ringan untuk di-SSH dan dikelola; pakai Docker untuk mengirim satu aplikasi stateless.
Kebanyakan engineer mengenal container lewat Docker, jadi mereka mengira setiap container adalah pembungkus tipis sekali pakai untuk satu proses. Lalu mereka bertemu workload yang butuh mesin sungguhan: sistem init, banyak daemon, cron job, user yang SSH masuk, dan state yang bertahan setelah reboot. Docker bisa dipaksa ke bentuk itu, tapi Anda habiskan waktu melawan desainnya. Di situlah system container membuktikan nilainya, dan Incus adalah tool yang saya andalkan.
Incus adalah fork komunitas dari LXD, kini dikelola di bawah proyek Linux Containers setelah Canonical mengambil alih LXD. Incus mengelola system container (lewat LXC) dan virtual machine penuh dari satu CLI dan API. Tulisan ini membahas posisi system container di antara Docker dan VM, serta cara memilih yang tepat alih-alih refleks langsung memakai Docker.
Application container membungkus satu proses beserta dependensinya. Filosofi Docker adalah satu urusan per container, image immutable, runtime ephemeral: Anda rebuild image untuk mengubah apa pun, dan layer writable container bersifat sekali pakai. Sebaliknya, system container mensimulasikan sistem operasi penuh. Ia mem-boot init sendiri (systemd atau sejenisnya), menjalankan banyak proses, menyimpan state persisten di disk, dan berperilaku seperti server kecil yang Anda login ke dalamnya. Keduanya berbagi kernel host lewat namespace dan cgroup, jadi tidak ada yang membayar biaya boot atau memori seperti VM sungguhan.
Model mental yang akhirnya klik bagi saya: Docker memberi Anda proses yang memakai container sebagai kostum; Incus memberi Anda mesin yang kebetulan berbagi kernel. Ketika Anda bertanya apa yang terjadi saat restart, jawabannya memisahkan keduanya. Restart container Docker, layer writable-nya hilang kecuali Anda mount volume. Restart container Incus, semuanya masih ada, karena ia memang tidak pernah dirancang untuk dibuang.
| Dimensi | System container Incus / LXC | Application container Docker |
|---|---|---|
| Unit paket | Userland OS penuh dengan init, banyak proses | Satu proses dan dependensinya |
| Siklus hidup | Persisten, seperti peliharaan: di-patch dan dipertahankan | Ephemeral, seperti ternak: rebuild dan ganti |
| State saat restart | Bertahan secara default, seperti server | Layer writable hilang kecuali volume di-mount |
| Kernel | Berbagi kernel host (tanpa kernel terpisah) | Berbagi kernel host (tanpa kernel terpisah) |
| Ekosistem pengiriman aplikasi | Lebih lemah; tidak dibangun seputar workflow registry | Besar: Docker Hub, Compose, image CI di mana-mana |
| Paling cocok | Kotak multi-service, sandbox dev, pengganti VM | Microservice stateless, build reproducible |
Kalau system container sudah terasa seperti server kecil, kenapa tidak langsung pakai VM saja? Kepadatan dan kecepatan. VM mem-boot kernel sendiri dan memesan RAM sendiri, jadi sepuluh VM berarti sepuluh kernel dan sepuluh alokasi memori tetap. Sepuluh system container berbagi satu kernel dan hanya memakai memori yang benar-benar disentuh prosesnya. Di VPS sederhana, saya bisa menjalankan jauh lebih banyak environment terisolasi sebagai container ketimbang VM, dan tiap-tiap container start dalam kurang dari satu detik alih-alih puluhan detik.
Komprominya adalah kernel yang berbagi. Setiap container menjalankan kernel host, jadi Anda tidak bisa menjalankan versi kernel berbeda, memuat modul kernel kustom per instance, atau mem-boot guest non-Linux. Anda juga lebih mengandalkan isolasi namespace ketimbang batas hypervisor. Untuk kebanyakan workload Linux-di-atas-Linux itu kesepakatan yang bagus, dan Incus memungkinkan Anda meluncurkan VM sungguhan dari tool yang sama saat sebuah workload memang membutuhkannya.
Kernel yang berbagi berarti container escape di level kernel langsung menjangkau host, tanpa hypervisor di tengah. Untuk isolasi multi-tenant yang keras terhadap kode tak tepercaya, batas VM tetap lebih kuat. Incus 7.2 menambahkan konfinemen SELinux per-instance untuk memperketat ini, tapi jangan anggap system container setara dengan VM untuk workload yang bermusuhan.
Workflow-nya sengaja dibuat mirip server. Anda meluncurkan sebuah image, lalu memperlakukan hasilnya seperti mesin baru: masuk shell, install paket, jalankan service systemd, dan semuanya persisten. Berikut jalur minimal dari instalasi Incus bersih hingga container Debian yang berjalan dan bisa Anda login.
# Initialise Incus once (accept defaults for a simple setup)
incus admin init --minimal
# Launch a persistent Debian 12 system container
incus launch images:debian/12 web01
# It boots its own init and runs many processes
incus exec web01 -- ps aux
incus exec web01 -- systemctl status
# Get a real shell, install and enable a service
incus exec web01 -- bash
# apt update && apt install -y nginx
# systemctl enable --now nginx
# Restart the container: state and installed packages survive
incus restart web01
incus listSejak Incus 6.3 Anda juga tidak terkunci dari ekosistem Docker. Incus bisa menarik image OCI langsung dari registry seperti Docker Hub, memakai skopeo dan umoci untuk mem-flatten-nya, lalu menjalankannya sebagai application container berdampingan dengan system container dan VM Anda. Fitur ini masih muda dan punya kekurangan, tapi untuk kasus sederhana ini berarti satu tool bisa menangani kedua gaya container.
# Add the Docker Hub OCI remote, then run an app container from it
incus remote add docker https://docker.io --protocol=oci
incus launch docker:nginx:latest myproxy
# Docker also runs happily INSIDE a system container
# (the reverse never works: you cannot run Incus in a Docker container)
incus config set web01 security.nesting=true
incus exec web01 -- bash -c 'curl -fsSL https://get.docker.com | sh'Tidak satu pun dari ini membuat Docker usang. Jika Anda mengirim service stateless, image immutable Docker dan ekosistemnya yang besar justru yang Anda butuhkan. Seluruh industri berbicara Dockerfile, Compose, dan registry OCI; sistem CI, platform PaaS, dan Kubernetes semuanya mengasumsikan application container. Untuk build reproducible dan microservice stateless, Docker adalah jalur dengan hambatan paling kecil dan saya masih memakainya tiap hari untuk service saya sendiri.
Pola yang saya suka di satu VPS: pakai system container Incus sebagai environment bersih dan terisolasi (satu per proyek atau klien), lalu jalankan Docker Compose di dalam container mana pun yang butuh workflow app-container. Anda mendapat pemisahan gaya VM dan ekosistem Docker sekaligus, dari satu host, dengan satu manager.
Intinya bukan Incus melawan Docker sebagai rival. Keduanya memecahkan masalah berbeda. Docker menjawab bagaimana saya membungkus dan mengirim satu aplikasi; Incus menjawab bagaimana saya menjalankan banyak mesin terisolasi dengan murah. Begitu Anda berhenti memaksa setiap workload menjadi application container, kedua tool jadi lebih mudah dipakai, dan VPS Anda punya jauh lebih banyak ruang bernapas.