Container

Secara harfiah Container (container, english) merupakan alat untuk mempermudah mengemas dan mendistribusikan suatu hal dari satu tempat ke tempat lain. Sedangkan dalam konteks lingkungan linux (linux environment), container dapat diartikan sebagai alat yang dapat dipergunakan untuk memberikan sistem yang terisolasi (isolated environment) pada level OS yang dijalankan pada satu induk linux kernel (host).

Container dibangun dalam 4 pondasi, namespace, cgroup, secom, dan selinux. Dan inisasi dibuatnya container ialah berdasarkan kernel Linux. Maka, apabila di Windows dapat memanfaatkan sistel WSL (Windows Subsystem Linux) atau fitur kernel linux dalam sebuah Windows.

Sampai saat ini, maret 2021 implementasi dari sebuah container yang populer dan didukung oleh komunitas dan perusahaan baru hanya Docker saja. Sebatas opini, disisi developer sebetulnya (beberapa) tidak menginginkan adanya riset untuk sebuah engine baru sebagai implementasi dari container kemungkinan yang akan membuat bingung pasaran. Maka, konsep yang diharapkan dan diusung dari terciptanya sebuah teknologi yang lebih baik adalah dengan meningkatkan implementasi dari engine docker dan tidak menciptakan engine baru yang apalagi yang riset dan produk tersebut dari sisi perusahaan closed source yang tidak akan menciptakan sebuah kontribusi dan pembangunan bersama.

Namun dilihat dari sisi lain (kekurangan), dalam menggunakan container di lingkungan produksi (production) sangat membutuhkan banyak sekali service yang dibagi-bagi. Container sangat bergantung dari kelebihan yang disediakan oleh sistem [https://medium.com/codelabs-unikom/microservices-apaan-tuh-b9f5d56e8848#:~:text=Microservices%20berarti%20membagi%20aplikasi%20menjadi,terhubung%20tidak%20seperti%20aplikasi%20monolitik.&text=Jadi%20intinya%20microservice%20yaitu%20membagi,saling%20berhungan%20satu%20sama%20lain. microservice] yang merupakan proses aplikasi raksasa yang dibagi kedalam banyak service yang dalam pengembangan aplikasi tersebut masing-masing pengembang tidak akan mengganggu pengembangan service yang lain. Maka, apabila menjalankan container ini secara manual dan ternyata container yang dibutuhkan banyak dalam kasus ini hal ini sebetulnya akan lebih membutuhkan sebuah cluster yang harus memanage beberapa container untuk menjalankan aplikasi raksasa tersebut yang dapat dilihat pada halaman Kubernetes. (Sekedar mem-porting ke topik lain saja untuk membuka wawasan :v)

Container VS Virtual Machine/Hypervisor/dkk
Container pada dasarnya lahir berdasarkan melihat kebutuhan yang lain dalam hal infrastruktur virtual machine yaitu membuat sebuah sistem isolasi VM yang lebih baik salah satu yang mencolok adalah kebutuhan resource komputer yang lebih rendah dibanding infrastruktur VM. Seperti yang terlihat pada gambar yang infrastruktur-nya kurang lebih menjalankan sebuah virtual machine atau OS keseluruhan seperti di dalam komputer host seperti VMware Workstation atau Hypervisor seperti Esxi, Proxmox atau pada level kernel seperti Xen (Citrix based hypervisor) dan Xen Orchestra.

Beberapa poin dari virtual machine:


 * setiap virtual machine berjalan di OSnya sendiri
 * jika ingin melihat perbedaan yang mudah, lihatlah saat me-reboot virtual machine. Maka akan tampak BIOS muncul yang merupakan penghubung antara hardware (hardware virtualisasi) dan OS.
 * diharuskan mengalokasikan sejumlah memori misal 4GB yang dipakai/diambil saat itu untuk dapat menjalankan sebuah VM
 * hardware-level virtualization



Maka, docker (dalam gambar dibawah tertulis docker, namun dalam konteks sebenarnya ialah container) merupakan sistem yang terisolasi (isolated environment) pada level OS yang dijalankan pada satu induk linux kernel yang memiliki arsitektur dan prinsip kerja tersendiri (sangat berbeda dengan VM) yang kemungkinan bisa populer bukan karena "hype" belaka. Kemungkinan memang awal dari sebuah revolusi dari sebuah virtual machine :v

Berikut beberapa poin dari container:


 * semua container share Host OS alias tempat semisal Docker daemon dijalankan
 * proses booting singkat karena level virtualisasi bukan pada hardware-level
 * membutuhkan lebih sedikit memori dikarenakan, pada container (dalam konteks ini docker) tidak tersedia pengaturan terhadap resource yang digunakan setiap container, kecuali menggunakan menggunakan Cluster Kubernetes
 * OS virtualization

Maka, dengan arsitektur-nya docker (container) dapat membuat lingkungan container diatas sebuah VM selama VM yang dijalankan adalah sebuah operating system linux.

Low hardware footprint
Container menggunakan fitur internal OS untuk membuat lingkungan terisolasi (environment isolation) yang manfaatnya ialah tidak menyebabkan crash, dependency hell, atau tabrakan pada masing-masing library dalam setiap aplikasi di mana sumber daya dikelola menggunakan fasilitas OS seperti namespace dan ''[https://shekhargulati.com/2019/01/03/how-docker-uses-cgroups-to-set-resource-limits/#:~:text=How%20does%20Docker%20uses%20cgroup,bandwidth%2C%20network%20bandwidth%2C%20etc.&text=Docker%20uses%20cgroups%20to%20limit%20the%20system%20resources. cgroup]''. Intinya hal ini meminimalkan jumlah CPU dan overhead memori dibandingkan dengan hypervisor mesin virtual (VM).

Environment Isolation
Container bekerja di lingkungan tertutup di mana perubahan yang dibuat aplikasi dalam OS atau mesin host sama sekali tidak memengaruhi container. Karena library yang dibutuhkan oleh container berdiri sendiri, maka aplikasi dapat berjalan tanpa gangguan.

Quick deployment
Container diterapkan dengan cepat karena tidak perlu menginstal seluruh sistem operasi seperti pada physical host atau VM.

Multiple environment deployment
Dalam skenario traditional deployment yang menggunakan satu host, perbedaan lingkungan apa pun dapat merusak aplikasi. Namun, dengan menggunakan container, semua dependensi aplikasi dan setelan lingkungan diringkas dalam container image.

Reusability
Container yang sama dapat digunakan kembali tanpa perlu menyiapkan OS lengkap. Misalnya, container database yang menyediakan layanan database produksi dapat digunakan oleh setiap pengembang untuk membuat database pengembangan selama pengembangan aplikasi. Menggunakan container, tidak perlu lagi memelihara server database produksi dan pengembangan yang terpisah. Jadi container image tunggal digunakan untuk membuat instance dari layanan database.

Seringkali, aplikasi perangkat lunak dengan semua layanan yang bergantung (database, file system, dan lain-lain) dibuat untuk berjalan dalam satu wadah. Hal ini dapat menyebabkan masalah yang sama yang terkait dengan penerapan aplikasi tradisional ke mesin virtual atau host fisik. Dalam hal ini, penerapan multi-container mungkin lebih cocok.

Selain itu, container adalah pendekatan yang ideal saat menggunakan layanan mikro untuk pengembangan aplikasi. Setiap layanan dikemas dalam lingkungan container yang ringan dan andal yang dapat diterapkan ke lingkungan produksi atau pengembangan. Kumpulan layanan dalam container yang diperlukan oleh aplikasi dapat di-hosting di satu mesin, menghilangkan kebutuhan untuk mengelola mesin untuk setiap layanan.

Namun sebaliknya, banyak aplikasi yang tidak sesuai untuk lingkungan kontainer. Misalnya, aplikasi yang mengakses low-level hardware information, such as memory, file systems, dan devices mungkin tidak dapat diandalkan karena keterbatasan container itu sendiri.

Arsitektur Kontainer
Sebetulnya dari perspektif kernel Linux, container adalah proses dengan penuh kerterbatasan. Namun, alih-alih menjalankan satu file biner, container menjalankan image. Image adalah file-system bundle yang berisi semua dependensi yang diperlukan untuk menjalankan proses: files in the file system, installed packages, available resources, running processes, dan kernel modules. Seperti file yang dapat dieksekusi adalah dasar untuk menjalankan proses, image adalah dasar untuk menjalankan kontainer. Kontainer yang sedang berjalan menggunakan tampilan gambar yang tidak dapat diubah, memungkinkan beberapa kontainer untuk menggunakan kembali gambar yang sama secara bersamaan. Karena gambar adalah file, gambar dapat dikelola dengan sistem versi, meningkatkan otomatisasi pada penampung dan penyediaan gambar.

Container image harus tersedia secara lokal agar runtime container dapat mengeksekusinya, tetapi image tersebut biasanya disimpan dan dipelihara dalam image repository (disebut juga registry). Image repository hanyalah layanan publik/privat di mana image dapat disimpan (push), dicari dan diambil (pull) seperti layanan git yang memungkinkan untuk dapat melakukan version control.

Dari sekian banyak image repository yang ada, masing-masing menawarkan fitur berbeda:


 * Red Hat Container Catalog
 * Docker Hub
 * Red Hat Quay
 * Google Container Registry (gcr.io)
 * Amazon Elastic Container Registry

Pranala Menarik

 * Containerized Applications
 * Container Orchestration
 * Docker
 * Kubernetes