Pendahuluan

Docker adalah salah satu contoh implementasi dari Container.

Kalau kita lihat definisi Container adalah :

Container adalah sebuah unit software yang membungkus kode program beserta library dan sistem pendukungnya dalam sebuah paket, sehingga bisa dijalankan dengan cepat dan tanpa halangan walaupun dipindahkan dari sebuah komputer ke komputer lainnya.

Jadi secara sederhana, dengan menggunakan Docker kita akan bisa membungkus seperangkat aplikasi, misalnya conten web, database, library, data dalam sebuah paketan khusus, yang dengan mudah kita pindah-pindahkan dan kita jalankan ke komputer mana saja, tanpa tergantung dengan lingkungan komputer yang ada.

Konsep Container ini menjadi terkenal bersamaan dengan munculnya trend membuat aplikasi secara modular, seperti yang kita temui di arsitektur microservices.

Ditambah lagi dengan trend otomasi development dan deployment aplikasi.

Container dengan Docker sebagai salah satunya membuat otomasi development dan deployment menjadi lebih mudah, karena sifatnya yang modular/paketan.


Referensi awal

Topik mengenai Container - bisa dilihat di sini

Topik mengenai sepupunya Container - yaitu Hypervisor bisa dilihat di sini


Cerita

Alkisah ada seorang Developer/Software Engineer yang biasa diminta membuat sebuah aplikasi web yang dipesan oleh temannya.

Temannya meminta agar bisa dibuatkan web sekaligus dengan kemampuan mengedit databasenya.

Dengan berbekal komputer PC nya, dia melakukan instalasi wordpress, mysql, dan phpmyadmin untuk membuat website yang diinginkan oleh temannya.

Kemudian deploy ke server, beli domainnya, dan websitenya langsung aktif.

Namun, lama kelamaan, makin banyak yang meminta dibuatkan aplikasi yang serupa.

Si Developer/Software Engineer ini lama kelamaan merasa kalau banyak kegiatan repetitif/berulang yang mesti dilakukan olehnya untuk membuat sebuah aplikasi web, misalnya :

  • menginstall ulang wordpress, mysql dan phpmyadmin setiap kali ada permintaan baru. Karena satu permintaan membuat website artinya satu paketan antara wordpress, mysql, dan phpmyadmin nya.
  • menambahkan script query dan script code khusus yang sama setiap kali permintaan baru membuat aplikasi web. Misalnya code untuk menambahkan plugin, atau code tambahan dari developernya sendiri.
  • melakukan hal yang berulang-ulang pula ketika harus deploy ke server.

Hmm, benar juga, lalu solusinya apa ?

Solusinya adalah mesti ada sebuah template yang bisa dijadikan standar awal dari sebuah paketan aplikasi, database, dan juga phpmyadminnya.

Sehingga tidak perlu melakukan hal-hal yang berulang diatas, dan tentunya mudah untuk dipindah-pindahkan ketika mau dicoba di komputer lain.


Bagaimana caranya ?



1. Pakai Virtual Machine (VM)

Misalnya kita membuat VM memakai Hypervisor VMWare, VirtualBox, dll.

VM itu sebenarnya seperti komputer baru yang dibikin virtual, lengkap dengan CPU, Memori, Hardisk, dan Operating Systemnya.

Kemudian di VM tersebut bisa kita install aplikasi wordpress, mysql, dan phpmyadmin.

Lalu tambahkan script query dan script code khusus sebagai code atau script tambahan standard sebagai dasar pembuatan aplikasi.

Simpan sebagai sebuah VM base/sumber.

Nanti setiap kali ada permintaan baru, maka kita cukup clone saja VM tadi, dan memulai bekerja diatas code standar yang sudah kita desain di VM tersebut.

Tidak ada lagi pekerjaan yang repetitive. Cuma clone saja VM nya, dan sedikit modifikasi, selesai.

Tetapi …, ada kekurangannya.

  • VM itu mengambil sumberdaya memori, CPU, dan Hardisk fisik yang sudah ditentukan dan tidak bisa berbagi dengan VM lain.
  • Ukuran VM yang cukup besar, karena setiap VM akan menginclude semua fitur di Operating Systemnya.


2. Pakai Container seperti Docker

Container mirip dengan Virtual Machine (VM), akan tetapi tidak sama.

VM yang dikelola oleh sebuah Hypervisor merupakan Virtualisasi di level Hardware, sehingga memang sejak awal sebuah VM dibuat, maka harus didefinisikan jumlah memori, CPU, dan Hardisk yang kita inginkan.

Jumlah memori, CPI, dan Hardisk ini disediakan untuk Operating System dan aplikasi lainnya yang akan diinstal di VM tersebut.

Sehingga setiap VM boleh dibilang mewakili sebuah Operating System dan aplikasi lainnya.

Berbeda VM, berarti berbeda Operating System nya, dan sumberdaya seperti CPU, Memori, Hardisk, OS tidak bisa dibagi.


Sementara Docker yang dikelola oleh Docker Engine merupakan Virtualisasi di level Sistem Operasi / Operating System.

Jadi semua container yang kita jalankan, sejatinya berjalan diatas Operating System yang sama.

Sehingga yang mengelola memori, CPU, dan Hardisknya adalah bagian dari Operating System yang disebut Kernel.

Dengan virtualisasi di level Kernel ini, maka semua container berbagi CPU, memori, dan hardisk dari yang disediakan di host komputernya.

Walaupun kita bisa juga membatasinya dengan perintah docker yang tersedia.

Untuk kasus cerita diatas, maka Developer bisa membuat 3 container masing-masing untuk wordpress, mysql, dan phpmyadmin.

Masing-masingnya menggunakan sumber daya yang berbeda, tapi diambil dari CPU, memori, dan hardisk nya host komputer.

Masing-masingnya dibuat dari image dari Docker Hub, diattach ke jaringan docker yang sama, atau dibuat dengan cara otomatis menggunakan docker compose, docker swarm, atau pakai tools lainnya.

Dengan tools docker compose, swarm, atau tools lainnya kita bisa mendefinisikan script atau copy file ke sebuah image container.

Akibatnya kita bisa mempunyai template standar sebagai dasar pembuatan website seperti kasus diatas, tanpa perlu lagi melakukan hal berulang seperti sebelumnya.

Sekarang kita bisa mempunyai satu template docker, terdiri dari 3 image container dengan ukuran memori, CPU, dan hardisk yang lebih ringan, dibandingkan kalau kita mempunyai satu Virtual Machine yang cukup berat karena mengakuisisi banyak memori, CPU, dan hardisk yang kita definisikan dari awal.


Lalu ?

Hal diatas kita lihat berguna untuk keperluan pribadi seorang Developer.

Tentunya akan sangat berguna juga ketika dihadapkan ke aplikasi di perusahaan yang mempunyai banyak template, lingkungan environment DEV, SIT, UAT, Pre-Production, Production, dan juga banyak developer.

Development aplikasi dengan arsitektur microservice juga diuntungkan dengan adanya Docker ini, karena satu microservice biasanya sepaket antara code, database dan juga konfigurasi lainnya.

Oleh karenanya Docker menjadi populer di development berbasiskan modular seperti microservices.

Kita lanjut part 2