This article was created for the purpose of individual review assignment of PPL 2021

Dalam melakukan deployment terhadap projek yang dibuat, ada beberapa tool yang dapat digunakan untuk membantu proses tersebut. Diantaranya, ada sebuah platform yang banyak digunakan dalam melakukan deployment, yaitu Docker. Dalam artikel ini, saya akan membahas sedikit tentang Docker tersebut.

Apa itu Docker

Jika dilihat dari sudut pandang tertentu, bisa dibilang Docker bekerja seperti virtual machine (VM). Namun melainkan membuat seluruh virtual OS, Docker memperbolehkan aplikasi untuk menggunakan Linux kernel yang sama dengan sistem tempat mereka bekerja, dan hanya membutuhkan aplikasi untuk dikirimkan dengan hal yang belum ada pada komputer host. Karena hal tersebut, ukuran aplikasi yang perlu di deploy pun dapat diperkecil, dan juga memberikan dorongan terhadap performa aplikasi.

Docker merupakan sebuah tool/open platform yang di desain untuk mempermudah pembuatan, pengembangan, pengiriman, dan menjalankan aplikasi. Docker memungkinkan untuk memisahkan aplikasi dengan infrastruktur yang dibuat sehingga proses deployment dapat menjadi lebih mudah dan cepat. Docker menyediakan kemampuan untuk membungkus dan menjalankan aplikasi di sebuah environment tertutup yang dinamakan container. Karena hal tersebut, aplikasi dapat dipastikan untuk berjalan pada mesin Linux apapun, bagaimanapun perbedannya dengan mesin tempat pengembangan aplikasi. Karena sifatnya yang terisolasi dan keamanan yang disediakan, banyak container dapat dijalankan sekaligus dalam suatu host.

Manfaat penggunaan Docker

Ada beberapa manfaat besar yang bisa didapatkan dengan menggunakan Docker. Diantaranya adalah:

  1. Proses pengiriman aplikasi yang cepat dan konsisten

Dengan menggunakan Docker, developer dapat bekerja di environment terstandarisasi menggunakan container lokal yang menyediakan aplikasi dan service yang dibuat. Karena hal tersebut, container dapat membuat alur proses continuous integration and continuous delivery (CI/CD) menjadi lebih cepat dan konsisten. Selain itu dengan menggunakan Docker, akan lebih mudah untuk meluncurkan versi baru dari aplikasi ke tahap produksi dengan cepat, dan juga mudah untuk di roll back ke versi yang lama jika misalkan terjadi kesalahan.

2. Menjalankan lebih banyak workload dalam satu hardware

Dengan menggunakan container pada Docker, kita bisa menggunakan kapasitas komputer kita dengan lebih, sehingga semakin banyak workload yang dapat dikerjakan dalam satu komputer.

3. Membuat aplikasi bersifat portabel

Karena Docker container mengenkapsulasi semua dan hanya hal yang diperlukan untuk menjalankan aplikasi, maka mereka membuat aplikasi mudah untuk berpindah-pindah environment. Selama environment tersebut telah terunduh Docker runtime, host apapun dapat menjalankan Docker container.

4. Deployment dan scaling yang responsive.

Platform Docker yang berbasis container memperbolehkan workload yang portabel. Selain itu, sifat portabilitas dari Docker membuat untuk mengelola workload secara dinamis dengan mudah, seperti melakukan scaling terhadap aplikasi atau service secara real time.

5. Menggunakan resources pada sistem dengan lebih efisien

Aplikasi yang sudah dibungkus container akan mengkonsumsi memory yang jauh lebih kecil dibandingkan virtual machines. Cost yang bisa dihemat bergantung dengan aplikasi yang di contain, namun container selalu bekerja dengan yang lebih rendah dibandingkan dengan virtual machines.

Arsitektur Docker

Bisa dilihat dari visualisasi arsitektur diatas, Docker memiliki bagian selain container. Berikut adalah sedikit penjelasan tentang beberapa bagian tersebut.

  • Docker Client

Docker Client atau “docker” merupakan cara utama untuk pengguna Docker dalam berinteraksi dengan Docker. Docker client dapat digunakan dalam command, seperti contoh command “docker run” yang akan mengirim perintah ke Docker daemon atau “dockerd”, yang kemudian akan menjalankan perintah tersebut. Docker API digunakan dalam melakukan command “docker” tersebut.

  • Docker Daemon

Docker Daemon atau “dockerd” bertugas untuk mendengarkan perintah dari Docker client dalam bentuk Docker API dan menjalankannya. Selain itu, dia juga bertugas dalam mengatur Docker objects seperti container, image, volume, dan network. Selain itu Docker daemon juga dapat mengatur Docker service dengan cara berkomunikasi dengan daemon lain.

  • Docker Registries

Docker registries bertugas untuk menyimpan salah satu Docker object yaitu image. Salah satu contoh Docker registries adalah Docker Hub, yang merupakan registries yang bersifat publik. Secara default, Docker akan mencari image pada Docker Hub. Beberapa contoh command yang berhubungan registry adalah “docker pull / run” yang akan melakukan pull terhadap image yang dibutuhkan dari registry yang terkonfigurasi. Sedangkan untuk push image ke registry, dapat menggunakan command “docker push”.

  • Docker objects

Dalam menggunakan Docker, kita membuat dan menggunakan Docker objects. beberapa diantaranya adalah:

  1. image: merupakan sebuah template read only yang berisi instruksi untuk membuat Docker container. Image biasanya didasarkan dari image yang sudah ada, namun dengan beberapa kostumasi dan konfigurasi sendiri. Untuk membuat image, dapat dibuat sebuah Dockerfile yang mendefinisikan langkah untuk membuat dan menjalankan image. Karena setiap instruksi membuat layer pada image, maka saat Dockerfile diganti dan image dibuat ulang, hanya layer yang terganti yang akan dibuat ulang, sehingga penggunaan image sangat ringan dan cepat.
  2. container: merupakan sebuah instance dari image yang bisa dijalankan. Menggunakan Docker API atau CLI container dapat diatur, baik dibuat, dihapus, dijalankan, diberhentikan, dan lainnya. Secara default, container terisolasi dengan baik terhadap mesin host maupun container lainnya. Sebuah container didefinisikan dari image maupun semua konfigurasi terhadap container tersebut. Command yang digunakan untuk memulai container adalah “docker run”.

Perbedaan Docker dengan Virtual Machine

Seperti yang telah dinyatakan sebelumnya, Docker memiliki cara kerja seperti Virtual machine. Namun, ada beberapa hal yang jelas membedakan kedua hal tersebut, diantaranya adalah:

  1. Operating System yang digunakan

Operating system support yang digunakan oleh virtual machine dan docker sangatlah berbeda. Virtual machine memiliki operating system sendiri yang bekerja diatas operating system dari komputer host ,sedangkan docker menggunakan operating system dari komputer host. Hal ini menyebabkan virtual machine lebih berat daripada docker, karena docker tidak memuat operating system sendiri tidak seperti virtual machine. Berikut adalah ilustrasi struktur dari virtual machine dan docker.

Struktur VM (kiri) dan docker (kanan), source: https://geekflare.com/docker-vs-virtual-machine/

Bisa dilihat pada struktur yang dimiliki virtual machine terdapat Guest OS yang merupakan OS yang dimiliki virtual machine, sedangkan docker hanya ada Host OS yang merupakan operating system dari komputer host.

2. Performa yang dimiliki

Karena arsitektur yang ringan dari docker, tentunya docker memiliki performa yang lebih baik daripada virtual machine, sehingga proses startup dari docker pun jauh lebih cepat daripada virtual machine, dan resource yang digunakan juga lebih sedikit, tergantung dari traffic pada docker tersebut. Selain itu, virtual machine memerlukan alokasi resource secara permanen, sedangkan docker tidak perlu karena menggunakan container. Selain itu, docker akan lebih mudah di scale up dan di duplikasi karena tidak perlu lagi menginstal OS didalamnya.

3. Portabilitas

Dalam masalah portabilitas, docker tentunya akan lebih fleksibel dibandingkan dengan virtual machine. Dengan menggunakan container dari docker, user dapat membuat aplikasi dan langsung menyimpannya di container image. Dengan melakukan hal tersebut, user dapat menjalankan aplikasi tersebut di host dengan environment apapun. Selain itu ukuran container pun lebih kecil daripada virtual machine, sehingga proses transfer file pada host filesystem akan menjadi lebih mudah dan cepat.

Sedangkan virtual machine memiliki isu portabilitas karena tidak memiliki central hub dan membutuhkan memory space yang lebih banyak. Selain itu, setiap melakukan transfer data, virtual machine harus memiliki copy dari OS dan dependencies yang dimiliki, sehingga proses melakukan share data akan lebih sulit.

4. Kecepatan

Proses menjalankan docker akan cepat tanpa delay karena docker memakai OS dari host sehingga OS tersebut pun pastinya sudah jalan. Sedangkan proses menjalankan virtual machine akan memakan waktu yang lama karena untuk men-deploy satu aplikasi saja, virtual machine perlu untuk memulai OS sendiri, sehingga membutuhkan proses full boot.

5. Keamanan

Tentunya meskipun docker memiliki banyak kelebihan seperti yang disebutkan sebelumnya, virtual machine juga memiliki kelebihan sendiri yaitu pada keamanan yang dimiliki. Karena virtual machine tidak berbagi OS dengan host atau vm lain, dan ada isolasi kuat terhadap host kernel, virtual machine akan lebih aman jika dibandingkan dengan docker. Container dari docker memiliki banyak risiko dan kelemahan kemanan karena container membagi host kernel.

The virtual machine does no share operating system, and there is strong isolation in the host kernel. Hence, they are more secure as compared to Containers. A container have a lot of security risks, and vulnerabilities as the containers have shared host kernel. Selain itu, karena resources dari docker dibagikan dan tidak di namespaced, penyerang bisa saja mengeksploitasi semua container yang ada pada sebuah cluster jika dia mendapatkan setidaknya akses ke salah satu container.

Mana yang lebih baik, Docker atau Virtual Machine?

Sebenarnya relatif, namun berdasarkan perbandingan diatas, docker memiliki kelebihan yang lebih dibandingkan virtual machine, sehingga mungkin docker merupakan pilihan yang lebih baik. Namun, tentunya tetap ada situasi dimana virtual machine dibutuhkan dari docker, seperti contoh ketika kita mempunyai aplikasi atau server yang dibutuhkan untuk berjalan pada OS yang berbeda, sehingga penggunaan virtual machine pun masih dibutuhkan.

Sekian artikel yang saya buat mengenai Docker, terima kasih.