Pendahuluan

pendahuluan mengenai Container - bisa dilihat di sini

Containers dalam dunia IT mirip dengan Container di dunia transportasi.


Apa persoalan yang diselesaikan oleh containers ini ?

Kenapa perlu adanya containers ini ?

Ada 2 persoalan yang memacu perlunya containers ini :


1. Portability / Kemudahan dalam memindahkan aplikasi dari satu environment ke environment lain.

Apa maksudnya ?

Persoalan ini dihadapi oleh Software Engineer ketika melakukan proses Development dan Deployment.

Kita tahu bahwa rata-rata Development Aplikasi akan menggunakan minimal 4 environment, yaitu :

  • Development
  • SIT (System Integration Testing)
  • UAT (User Acceptance Testing)
  • Production

Walaupun ada juga yang menambahkan beberapa environment tambahan seperti Pre-Production environment, Stage/Image environment, Stress Test environment, dll.

Permasalahannya terkadang adalah instalasi yang dipunyai oleh tiap-tiap environment bisa saja berbeda. Misalnya :

  • Environment di Development sudah memakai Java 11, sementara di Production atau UAT masih memakai Java 8 (Hal ini bisa terjadi misalnya dalam proses upgrade Java secara bertahap dari DEV, SIT, UAT, dan Production). Akibatnya waktu kita deploy ke UAT dan Production, kita harus memastikan kompatibilitas atau kesesuaian code kita, apakah masih bisa jalan di Java 8 atau tidak. Sehingga akan ada 2 kali kerja yang kita lakukan.

  • Instalasi SSL Certificate yang berulang di server kita (DEV,SIT,UAT, Production). Ketika kita butuh koneksi SSL ke server lain, maka kita harus melakukan instalasi SSL certificate agar bisa berkomunikasi dengan server lain. Tetapi kalau menggunakan pendekatan instalasi langsung di server, maka akan ada 4 kali instalasi yang perlu kita lakukan, yaitu DEV, SIT, UAT, dan Production, sesuai dengan jumlah environmentnya.

  • dll.


2. Terjadinya kesalahan yang tidak diduga ketika deploy ke environment yang berbeda.

Sering sekali kita temui dan hadapi ketika kita develop di DEV aman, SIT aman, UAT juga aman, tidak mempunyai masalah dalam deployment dan testing.

Akan tetapi ketika masuk ke environment Production, tiba-tiba aplikasi tidak bisa dijalankan.

Entah karena ada konfigurasi yang berbeda di Production, seperti perbedaan konfigurasi DNS, atau konfigurasi aplikasi, dll.

Hal itu pulalah yang menjadi alasan pembuat Docker, yaitu Solomon Hykes memperkenalkan Docker :

Katanya :

“You’re going to test using Python 2.7, and then it’s going to run on Python 3 in production and something weird will happen. Or you’ll rely on the behavior of a certain version of an SSL library and another one will be installed. You’ll run your tests on Debian and production is on Red Hat and all sorts of weird things happen.”

Karena environment yang tidak seragam, maka perilaku dari aplikasi juga bisa berbeda.

Hal itu adalah hal yang natural.

  • Kita melakukan development di Ubuntu, tapi deploy di production dengan environment RedHat.
  • Kita melakukan development di Java 11, tapi deploy di testing dan production dengan Java 8.
  • Kita melakukan development dan testing menggunakan DNS X, tapi di production menggunakan DNS Y.
  • dll.

Lalu bagaimana solusinya ?

Solusinya logisnya yaitu dengan packaging atau bundling. Yaitu dengan membungkus aplikasi, library, server, dan konfigurasi menjadi satu unit yang lengkap. Tinggal dipindah-pindah saja di environment lainnya.

Idenya adalah dengan membuat sebuah unit yang jalan di satu environment, maka tentu saja akan jalan di environment yang lain, asalkan tidak ada yang diubah, kecuali konfigurasi spesifik yang bisa dikonfigurasi dari luar unit tersebut.

Sebenarnya ada 2 cara dalam membungkus aplikasi ini, yaitu :



  • Pakai VM (Virtual Machine).

VM (Virtual Machine) artinya kita membungkus Sistem Operasi (Operating Sytem/OS), Kernel, Aplikasi, dependencies, dsb dalam sebuah unit/image/template. Didalamnya kita bisa dengan mudah menginstall jenis OS nya, Windows, Linux, MacOS, dll.

Kemudian kita tambahkan server dan dependencies yang kita butuhkan.

Lalu VM ini bisa kita simpan sebagai image yang akan bisa diload menggunakan software Hypervisor, seperti VMWare, VirtualBox, atau KVM.

Dengan demikian kita tidak usah mengubah VM nya ketika berpindah-pindah environment. Konfigurasi yang berbeda dari tiap environment bisa kita set melalui passing environment parameter ke Guest OS yang kita inginkan.

Contoh packaging/bundling dengan pendekatan VM ini misalnya :

  • AWS EC2 instance
  • Google Compute Engine
  • Azure Virtual Machine
  • DigitalOcean Droplets
  • Vult Cloud Compute
  • IBM Cloud Virtual Server
  • Alibaba ECS instance.
  • dll.

Untuk kasus pendekatan menggunakan VM ini, harus ada software Hypervisor yang mengelola VM-VM tersebut.



  • Pakai Containers

Naaah, ini yang fokus kita kali ini.

Containers bukanlah seperti VM. Kita tidak perlu melakukan packing/bundling Sistem Operasi secara keseluruhan.

Kita cuma butuh satu OS saja, namanya Host Operating System, sebagai landasan untuk containers.

Diatasnya barulah kita melakukan packaging/bundling terhadap kelompok proses yang kita sebut sebagai containers.

Containers ini akan berbagi Host Operating Sytem yang sama dan Kernel yang sama.

Secara sederhana, analoginya sbb :

  • Host Operating System, sebagai OS dimana semua container kita berada.
  • Kernel yang merupakan bagian inti dari OS, mempunyai struktur data semua proses di OS tersebut, dan mempunyai fiture pengatur pengelompokan proses, pengelompokan security, dll.
  • Container Engine, berada di atasnya Kernel. Container ini bertugas me-load image untuk sebuah container, monitoring sumber daya yang digunakan containers, dan mengatur alur hidup containers.
  • Container, yaitu bundling/packaging dari aplikasi kita, dependencies, environment variable, dll.

Coba kita misalkan dengan Linux sebagai host OS yang sering dipakai.

  • Host Operating Systemnya, adalah Linux.
  • Kernelnya adalah Kernel Linux, mempunyai konfigurasi namespace, chroot, cgroups, SELinux, dll.
  • Containers Engine, yang mengelola containers, seperti runC,containerD, Docker, cri-o, Hyper-V containers, lxc, podman, dll. Containers Engine ini juga mempunyai banyak level, yang bisa saja saling bungkus membungkus diantaranya dan menjadi platform, seperti AWS Fargate, AWS Container Service, Ranches, Apache Mesos, dll, Azure Container Service, Google Kubernetes Service, dll.
  • Containers itu sendiri.

Ok, kita rehat sejenak…