Apa itu Kontainer?

Pedoman PSBB Tidak Akan Pengaruhi Aktivitas Logistik - Ekonomi Bisnis.com
Tumpukan Kontainer di Pelabuhan

Kontainer yang akan kita bahas bukan secara harfiah kontainer yang ada seperti gambar di atas, namun tentang teknologi kontainer virtual yang digunakan secara masif oleh enterprise pada masa ini untuk membantu menjaga kelancaran bisnisnya.

Dalam kehidupan nyata, umumnya kontainer digunakan untuk mengemas barang menjadi satu pengiriman. Ketika mengirim kontainer dari satu tempat ke tempat lain akan sangat mudah karena efisien, terisolasi dan portable untuk dipindahkan.

Dalam virtual terms, kontainer adalah cara yang umum digunakan untuk mengemas aplikasi (konfigurasi dan dependensinya) ke dalam satu objek logic. Karakteristiknya pun terisolasi antara satu aplikasi dengan aplikasi lainnya dan juga sangat efisien karena memungkinkan banyak aplikasi berjalan dalam satu host. Juga kontainer bersifat potable karena semua dependensi di kemas bersmaan dengan aplikasi, yang menyediakan environtment runtime yang konsisten baik di local host atau di cloud.

Apa sih maksud dari Aplikasi?

Bagi ManusiaBagi komputer
Aplikasi adalah program software yang di kembangkan untuk melakukan task tertentu dan di eksekusi oleh komputer. Bersifat human readable language.Aplikasi adalah suatu instruksi binary yang digunakan sebagai instruksi mengeksekusi tugas tertentu – yang dikenal sebagai process.
Perbedaan istilah aplikasi.
Proses logic komputasi

Semua prosess komputasi di dasarkan atas manajemen permanfaatan tiga komponen komputer di atas: CPU, Memory dan I/O (Input Output). CPU mengeksekusi instruksi dari aplikasi, datanya dibaca oleh memory dari disk atau network, dan jalan akses ke sumbernya di hubungkan oleh Operating System yang melakukan manajemen resources (seberapa banyak setiap resource tersedia untuk setiap proses atau aplikasi).

Contoh Informasi Resource

Komparasi Antara VM dan Container

Container VS VM (Virtual Machine) | by Thoriq Azzam | Core Network  Laboratory Tech Page | Medium
VM vs Containers

Komparasi ini hanya sebagai pembeda saja, tapi sebenarnya secara general mereka bekerja bersama.

Pertama untuk VM, didasari oleh Hardware/Infrastruktur lalu oleh Host OS, kemudian diinstal dengan Hypervisor – yang mana memungkinkan untuk membagi satu infrastruktur fisik ke banyak VM yang lebih kecil. Di dalam VM tersebut, kita dapat menginstall berbagai macam OS, dan di dalamnya kita bisa menginstall aplikasi dan juga dependensinya.

Kedua untuk container, sama juga didasari oleh Hardware/Infrastruktur lalu oleh Host OS, tapi terdapat komponen baru yaitu Container Runtime (paling populer Docker Engine). Di atasnya kita punya aplikasi, dependensi dan juga library yang dikemas bersamaan. Hal ini bisa terjadi karena Container Runtime memanaje paket-paket tersebut dan mampu untuk dimengerti apa itu sebenarnya container dan bagaimana packaging-nya bekerja, dan membuatnya bekerja sesuai konteks. Container Runtime bisa juga berjalan di atas Bare Metal atau Guest OS/VM yang mana semua sama-sama umum.

Apa Sebenarnya Kontainer?

Bagaimana sih sebenarnya kontainer bekerja dan cara untuk memasukan aplikasi kita ke dalam kontainer? Yuk tetep simak karena artikel nya masih panjang.

Di awal sudah dibahas yaitu cara yang umum digunakan untuk mengemas aplikasi (konfigurasi dan dependensinya) ke dalam satu objek logic. Objek logic disini artinya tidak nyata, bisa dibilang kontainer memang tidak nyata atau tidak benar-benar ada. Kontainer memanfaarkan dua fitur Linux Kernel yaitu:

  • Namespaces
Namescapes architecture

Namespaces memungkinkan OS untuk membatasi apa yang bisa dilihat oleh proses, seperti prosess isolation dan file system isolation yang menjadi key komponennya.

  • Control Groups (cgroups)
Control groups architecture

Sedangkan cgroups berfungsi untuk membatasi penggunaan resources dari process. Seperti seberapa banyak CPU, Memory, dll. Ini semua dilakukan oleh cgroups dan memungkinkan kita untuk memanfaatkannya sesuai dengan kebutuhan.

Setelah mengetahui berbagai macam tentang kontainer, sekarang istilah kontainer berubah berdasarkan sudut pandang komputer. Kontainer adalah sebuah prosess hasil ekstrak dari aplikasi dan dependensi kita, juga terdiri dari namespace yang memperbolehkan adanya isolasi sesuai keinginan kita dan di kontrol oleh cgroups yang memungkinkan adanya manajemen penggunaan resource.

Container Spec

Berikut adalah teknologi yang digunakan Docker Engine yaitu Dockerfile sebagai pengaturan spesifikasi container:

How to run SPFX PnP Samples through Docker | Stefan Bauer - N8D
Contoh Dockerfile

Dockerfile terdiri dari beberapa set instruksi untuk bagaimana kita ingin membangun dan menjalankan kontainernya. Contohnya diatas imagenya dibagun dari node versi argon, kita menyiapkan directory nya dan install beberapa dependesi, lalu setup port yang kita inginkan agar terkespose ke public dan akhirnya kita jalankan aplikasinya yaitu gulp.


Docker overview | Docker Documentation
Docker Architecture

Client menggunakan API untuk terhubung dengan Docker Host (Container Runtime) dan Docker Host yang melakukan semua performasi kontainerisasi. Misal ketika mengeksekusi command ‘docker build’, maka Container Runtime akan membuat image dari Dockerfile yang telah di tulis. Akhirnya image yang telah di buat bisa disimpan di Registry, yang membuat fleksibel dan bisa diakses oleh sistem lain. Container sebenarnya secara simple hanya runnable image, dan ketika misal mengeksekusi ‘docker run’, maka diambil image nya, lalu diunpack oleh Container Runtime dan akhirnya dieksekusi sebagai proses (yang ada sebagaimana di OS).

Anatomi Container

dockerImage

Untuk lebih mengetahui seluk beluk container, mari kita demokan sedikit mengenai cara kerja dari namespace dan control group yang menjadi dua komponen utama kontainer. Untuk itu kita perlu untuk menginstall docker terlebih dahulu di dalam mesin kita.

  • Install Docker dari Debian Repository
This image has an empty alt attribute; its file name is image-41.png
This image has an empty alt attribute; its file name is image-42.png
This image has an empty alt attribute; its file name is image-43.png
This image has an empty alt attribute; its file name is image-44.png

Kita akan mencoba image netshoot dari nicolaka, sebagai percobaan saja. Teman-teman bisa bebas menggunakan image manapun. Ada beberapa hal yang perlu digarisbawahi tentang fitur container ini, yaitu:

  1. Root File System

Kita akan melakukan inspect RootFS dalam image tersebut dengan command docker image inspect.

RootFS terdiri dari berbagai macam layer yang melambangkan perbedaan proses tahapan pembuatan image. Bisa juga dilihat menggunakan command docker history, untuk mengetahui layer-layer ini dan command line-by-line dari Dockerfile ketika membuat base imagenya.

  1. Namespaces

Kita ingin memberikan container networking stack, process tree-nya sendiri dan memastika RootFS ini running dan terisolasi dari yang lain di mesin ini. Caranya pakai linux kernel construct yaitu: namespaces. Ada lima macam dan masing-masing punya tanggung jawabnya seperti, NET Namespaces, MNT Namespace, PID Namespaces, UTS Namespaces dan IPC Namespaces. Kita akan mencoba untuk menjalankan container, dan melihat dampak namespaces kepada process yang ada.

  • Jalankan container dengan image netshoot, hostname c1, nama container coba dan command sleep 50000.
  • Tampilkan proses yang ada menggunakan command PS.

Opsi aux yaitu memeberi tahu proses terperici untuk semua proses dan membuat daftar proses tanpa terminal. Oke bisa dilihat outputnya terdapat Process Identification Number (PID) bernilai 3884. Bisa juga dengan command grep.

  • Masuk ke container ‘coba’ untuk berinteraksi langsung dengan kontainernya.
  • Jika seperti ini, maka kita sudah bisa mengakses filesystem image netshoot.
  • Juga bisa dilihat hostname nya akan sama dengan yang tadi dikonfigurasi.
  • Ketika dilihat networking stack nya akan berbeda dengan host machine kita, karena kontainer mempunyai networking stack sendiri.

Ketika keluar dari kontainer, maka akan terlihat bahwa ketika akan ifconfig, dia akan mengeluarkan networking yang berbeda dan juga nama hostname nya pun berbeda pula.

  • Sekarang mencoba pakai Namespaces Enter, digunakanan untuk masuk ke target process, dan secara optional bisa masuk namespace lain, contohnya uts namespace untuk mengontrol hostname.

Di atas kita telah masuk ke shell dan running pakai ‘nsenter’, dan telah mengambil 3884 hostname sebagai target. Maka jikakalau kita lihat networking stacknya akan sama seperti host, sedangkan hostnamenya berbeda yaitu c1.

  • Kita coba namespace lain yaitu NET dan MNT Namespaces.

Sekarang jika kita masuk ke hostname terlihat tetap sama seperti default hostname kita. Namun jikalalau kita lihat networking stacknya, dia akan berbeda dengan host default.

Jadi itulah namespaces untuk bagian networking stack process dan hostname.

  1. Control Groups

Bagaimana jika kita running multiple container di dalam mesin, kita tidak mau saling bentrok, untuk penggunaan resourcenya. Kita mau kita bisa setting penggunaan CPU dan memory di container kita. Nah sekarang solusinya pakai cgroups.

  • Cek Container yang sedang berjalan
  • Inspect Container coba dan gunakan prosess 3884 untuk melihat cgroupsnya.

Tertera di line keenam tertuliskan memory, dan id container nya sama dengan id container kita.

  • Sekarang kita lihat berapa memory limit yang container ‘coba’ punya dalam bytes.

Ternyata didapatlah memory sebesar 922337203685471712. Yang mana sangatlah besar.

  • Sekarang kita coba run container lain dengan nama ‘coba2’ dan memberinya memory limit sebesar 6Mb.
  • Docker ps dan kita lihat sekarang ada 2 container yang berjalan.
  • Kita cek kembali untuk container ‘coba2’ dan ternyata memang benar memory limitnya sesuai menjadi 6Mb.

Jadi yang docker atau container runtime lakukan, mengambil alih root filesystem yang kita berikan dalam bentuk docker image, setelah itu menjalankannya dengan sekian banyak namespaces yang meliputinya. Dan secara opsional kita bisa memberi container pembatasan CPU dan memory nya juga.


Build, Run, Test Container Image

Setelah mengetahui anatominya, kita akan bermain pre-built images, membuat custom images dan juga menggunakan container registries. Pertama mari kita pull public image dari container registry. Registry simple nya adalah koleksi atau tempat penyimana images, bersifat public yang dapat diakses semua orang lewat internet.

Kita spesifikan image dan versinya secara detail. Lalu secara default ketika kita melakukan docker pull maka secara default akan langsung masuk ke docker hub, sebagai sumber koleksi image nya. Ketika kita ingin berinteraksi dengan image, bisa saja menggunakan docker pull, namun tidak selalu harus dengan cara tersebut. Docker bisa saja melakukan pull secarta otomatis ketika image tersebut tidak ada pada sistem kita.

Docker Container Security: Challenges and Best Practices - WhiteSource
Image Container yang Terverifikasi Keamanannya

Yang jadi masalah ketika menggunakan pre-built images, kita tidak tahu bagaimana image itu dibuat. Bisa saja di dalam image tersebut terdapat malicious software yang dapat membahayakan sistem kita atau file-file sampah yang tidak kita butuhkan. Di kasus ini image alpine itu sudah terverifikasi apa isi image nya dan bagaimana caranya dibuat.

Maka dari itu sekarang akan kita coba bagaiamana cara membuat custom imagenya, menggunakan Dockerfile:

  • Gunakan base alpine linux dan copy file test ke dalam directory /etc yang ada di dalam image (hanya untuk testing).
  • Build imagenya dengan tag tertentu.
  • Setelah itu pasti ada imagenya di docker image ls.
  • Jalankan containernya dengan mode interactive (masuk ke shell) dan langung terlihat file system linux alpinenya.
  • Coba cek file test dalam directory etc, yang membuktikan command copy dalam Dockerfile otomatis terkesekusi.

Sekarang kita akan mengupload image kita ke public registy, yaitu docker hub. Caranya kita sesuaikan terlebih dahulu tag image kita dengan nama repository di docker hub. Jika belum mempunyai akun dan repository (tempat penyimpanan) – nya, maka buat terlebih dahulu.

  • Ini contoh username Docker hub saya dengan nama repository first.image (bisa disetup bebas)
  • Buat image dari Dockerfile yang sama, namun gunakan tag yang sama dengan nama repository nya.
  • Gunakan Docker tag nya pula sama dengan username docker hub dan repositorynya.
  • Login terlebih dahulu ke docker hub lewat terminal.
  • Ketika dilihat image nya terdapat nama image yang sesuai dengan nama repository di docker hubnya.
  • Lakukan Docker push untuk mengupload imagenya
  • Lalu lihat hasilnya di web docker hub, pasti image kita sudah terupload

Penutup

Jadi itulah sekilas pengetahuan basic fundamental tentang containers.. semoga bisa bermanfaat dan menambah ketertarikan kalian dalam mendalami teknologi ini ya!! Terimakasih pada kubeacademy atas referensi utamanya.

Last modified: November 18, 2021

Author

Comments

Write a Reply or Comment

Your email address will not be published.