Kontainerisasi Aplikasi Lebih Mudah Menggunakan Docker
Ketika seorang programmer mengembangkan sebuah perangkat lunak, terkadang sering ditemui sebuah kasus dimana environment yang digunakan oleh developer di mesin komputer mereka berbeda dengan environment yang ada di di mesin testing atau production, sehingga terkadang terjadi kasus dimana sebuah program berhasil dijalankan di mesin “local” developer namun menemui error ketika dijalankan di server test ataupun production, alhasil error yang terjadi di mesin testing atau production tidak dapat direproduce mesin komputer lokal milik programmer.
Untuk mencegah kasus – kasus tersebut terjadi maka kemudian muncul ide agar sebuah software yang dibuat didistribusikan bersama dengan environment yang sama, antara mesin yang digunakan programmer. mesin untuk testing hingga pada mesin production. Itulah yang kemudian disebut sebagai teknologi container.
Untuk memahami solusi dari masalah ini, pembaca dapat membayangkan sebuah proses di dalam divisi bongkar muat barang di pelabuhan, dimana proses item per item barang ke dalam kapal ekspedisi akan sangat merepotkan jika dilakukan satu per satu, hal ini dikarenakan masing – masing barang yang dikirim memilikitspesifikasi dan cara penanganan yang berbeda – beda.
Untuk mempermudahnya, digunakanlah container, dimana semua item yang diperlukan sudah ada di dalam kontainer tersebut, sehingga petugas bongkar muat hanya akan menangani satu kontainer utuh, tidak perduli apa di dalam kontainer tersebut.
Di dalam dunia komputasi, teknologi kontainer sendiri sebenarnya bukanlah hal yang baru. Secara historis, sistem operasi bergaya UNIX pernah menggunakan istilah jail untuk menjelaskan environment runtime yang dimodifikasi pada batas lingkup resources yang dibatasi (jailed) hanya pada program yang mengaksesnya.
Fitur jail ini kemudian kembali pada tahun 1979 dan berevolusi hingga pada tahun 2005, Sun Solaris 10 merilis Solaris Container. Berikutnya istilah container menjadi populer pada setiap runtime environment. Tujuannya adalah memperluas kemampuan untuk membatasi lingkup filesystem menjadi mengisolasi sebuah proses dari semua resource kecuali yang secara eksplisit diijinkan.
Penggunaan container ini telah menjadi best practices sejak lama. Namun membuat container sendiri secara manual teramatlah sulit dan rawan terjadi kesalahan. Sebuah kesalahan dalam konfigurasi kontainer akan menyebabkan bahaya yang tidak disadari dari sisih keamanan. Hal inilah yang kemudian diseleseikan oleh Docker. Semua software yang dijalankan dengan docker engine akan berjalan di dalam container. Docker memungkinkan semua orang dapat membangun container berdasarkan best practices serta keamanan yang lebih kuat
- Container VS Virtual Machine
Namun di era cloud-native, banyak orang berpikir mengenai penggunaan Virtual Machine sebagai satuan “package” untuk men-deliver sebuah perangkat lunak. Dengan adanya Virtual Machine, tentu objective akan environment yang sama di antara mesin testing dan production juga dapat tercapai, namun tentu cost yang harus dibayar lebih mahal, karena Virtual Machine akan memakan resource lebih besar ketimbang container
Hal inilah yang membedakan antara Docker dengan Virtual Machine. Container pada Docker tidak menggunakan teknologi virtualisasi pada hardware, namun program di dalam container hanya berjalan pada use space pada kernel linux yang eksisting. Docker bukanlah teknologi virtualisasi perangkat keras layaknya VM tapi hanya menggunakan teknologi container yang sudah ada secara bawaan di dalam kernel sistem operasi
VM menyediakan abstraksi perangkat keras dimana pengguna dapat menjalankan keseluruhan sistem operasi, sementara container adalah fitur yang ada di dalam sistem operasi. Sehingga memungkinkan Docker engine di jalankan di dalam Virtual Machine.
- Arsitektur Docker Engine
Docker menggunakan namespaces dan cgroups pada Linux yang telah menjadi komponen di dalam Linux sejak 2007. Untuk memahami bagaimana container di dalam sebuah sistem operasi
Perhatikan comand line interface (CLI) berjalan diatas apa yang disebut user space memory, sebagaimana program lain yang berjalan di atas sistem operasi. Secara ideal, pogram yang berjalan di atas user space tidak akan dapat memodifikasi kernel space memory, sehingga sistem operasi menjadi antarmuka dari semua program user dan perangkat keras komputer dimana program dijalankan.
Diagram tersebut mengilustrasikan bagaimana Docker yang menjalankan dua program pada user space, yaitu sebagai berikut
- Docker Engine (yang apabila diinstal denan benar, akan selalu berjalan di latar belakang)
- Docker CLI yang merupakan tempat program docker dan pengguna berinteraksi. Jika pengguna ingin melakukan start, stop atau menginstal software, perintah tersebut dapat dijalankan menggunakan Docker CLI