Saturday, October 4, 2014

Docker: Developer Tool Berbasis Container

Apa itu Docker?

Docker adalah sebuah platform terbuka untuk developer, sysadmin atau siapapun yang bertujuan menggunakan sebuah platform untuk membangun, mendistribusikan dan menjalankan aplikasi dimanapun; laptop, data center, virtual mesin ataupun cloud. Docker membuat proses pemaketan aplikasi bersama komponennya (dependencies ) secara cepat dalam sebuah container yang terisolasi, sehingga dapat dijalankan dalam infrastruktur local (local data center) ataupun cloud tanpa melakukan perubahan/konfigurasi lagi pada container, selama host menjalankan Docker Engine.

Docker merupakan software open source di bawah Lisensi Apache Versi 2.0 yang bisa dipergunakan secara gratis. Saat ini Docker hanya bisa berjalan pada Linux, namun kita bisa menggunakan mesin virtual pada mesin windows, atau menggunakan Boo2docker.

Arsitektur Docker

Docker menggunakan arsitektur client-server. Docker client mengirimkan request berupa perintah kepada Docker daemon untuk membangun, mendistribusikan dan menjalankan container Docker.


  • Docker Daemon: Seperti terlihat pada gambar, Docker daemon berjalan pada mesin host. Pengguna tidak berinteraksi secara langsung dengan Docker daemon tapi melalui Docker client.
  • Docker Client: Docker client merupakan bentuk dari Docker binary dan merupakan user interface utama untuk Docker, yang menerima perintah dari pengguna dan berkomunikasi dengan Docker daemon.

Beberapa Terminologi dalam penggunaan Docker

Banyaknya terminologi yang merupakan komponen Docker sering kali membingungkan. saya akan berusaha menjelaskannya berikut ini:
Istilah yang menjadi komponen utama Docker:
  • Docker images: Image Docker merupakan sebuah template yang bersifat read-only. Contohnya sebuah image yang berisi sistem operasi Ubuntu dengan Apache dan aplikasi web yang telah kita instalkan. Image ini digunakan untuk menjalankan container. Docker menyediakan cara yang sederhana untuk membangun image baru atau merubah image yang sudah ada. Jika melihat Docker Index kita akan menemukan banyak image yang sudah banyak dibuat oleh pengguna lain yang bisa kita gunakan sebagai base image. Misalnya kita akan membangun sebuah aplikasi PHP dengan apache web server dan mysql, maka kita hanya perlu mendownload base image berupa LAMP server lalu kita tinggal menambahkan aplikasi PHP yang sudah kita buat.
  • Docker Container: Container merupakan sebuah image bersifat read-write yang berjalan di atas image. Docker menggunakan union-file sistem sebagai back-end file sistem containernya, dimana setiap perubahan yang disimpan pada container akan menyebabkan terbentuknya layer baru di atas base image. Jadi container merupakan layer dimana kita bisa melakukan instalasi aplikasi di dalamnya. Masing-masing container yang berjalan terisolasi dan platform aplikasi yang aman.
Docker layer
  • Docker Registry: Docker registry adalah tempat penyimpanan (public atau private) dimana kita bisa mengupload dan mendownload image. Registry public Docker disebut dengan Docker Hub. Di dalamnya terdapat banyak image, bisa merupakan image yang kita buat sendiri ataupun image yang lain.

Istilah lain-lain:


  • Dockerfile: merupakan sebuah skrip otomasi (builder) yang membangun sebuah image. Sebuah Dockerfile merupakan dokumen text atau skrip yang berisi semua perintah yang biasanya kita lakukan manual untuk membangun sebuah image. Dengan menggunakan perintah docker build dari terminal, kita akan melihat Docker membangun image step by step mengeksekusi perintah berurutan. Kita ambil contoh sebuah skrip Dockerfile:

FROM ubuntu:latest
MAINTAINER Fahmi persada.fahmi@gmail.com

RUN apt-get update && apt-get -y install apache2 && apt-get clean

EXPOSE 80

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

skrip Dockerfile di atas digunakan untuk membuat sebuah image yang terinstall apache daemon di dalamnya. Untuk cara penggunaannya saya akan menulisnya pada artikel terpisah.
  • Repository: Docker menggunakan kata ini mirip dengan yang digunakan pada Github dan source control system lainnya, namun jenis yang berbeda. Repository berupa ID untuk setiap image yang disimpan dalam registry. Ketika kita menjalankan perintah docker commit maka image itu akan kita beri nama dengan format username/nama_image. Ketika kita mengupload image tersebut dengan perintah docker push, index akan melihat nama image dan memastikan tidak ada nama repository yang sama, jika tidak maka index akan memeriksa apakah kita memliki akses terhadap repository tersebut, maka selanjutnya kita diijinkan untuk mengupload image versi baru ke repository tersebut.
  • Docker Index: Docker index dengan Docker hub registry merupakan hal yang terpisah. Index mengatur user account, permission, search, tagging dan hal lain yang tersimpan pada web interface public. Ketika kita menjalankan perintah docker run, hal itu digunakan untuk mencari pada index bukan registry. Atau ketika kita menjalankan perintah docker pull ataupun docker push, index akan menentukan apakah kita diijinkan untuk mengakses atau memodifikasi image, dan selanjutnya registry adalah bagian yang akan menyimpan image tersebut setelah kita mendapatkan permisi dari index.

Perbandingan dengan virtual mesin

Docker sangat ringan dan cepat jika dibandingkan dengan virtual mesin yang berbasis hypervisor, sehingga menjadikan Docker sebagai alternatif yang efisien untuk developer tooling. Sebagai light-weight virtualization Docker hampir tidak menambah overhead pada mesin host. Hal ini membuat docker mempunyai beberapa keuntungan:
  • Layer virtualisasi yang ditawarkan Docker hampir tidak menambah overhead seperti virtualisasi berbasis hypervisor pada mesin virtual, besarnya overhead hanya sebesar layanan aplikasi yang dijalankan pada container itu sendiri (app process)
  • Keuntungan kedua adalah kita bisa menjalankan banyak container dalam mesin host.
Hasil pengujian saya, dibandingkan dengan VM VirtualBox, dalam menjalankan 5 mesin virtual ubuntu (berbasis text) dengan memory 192 MB, Virtualbox menghabiskan memory lebih dari 1 GB, sedangkan Docker dengan 10 container ubuntu hanya menghabiskan 27 MB.
Note: Pengujian pada mesin virtual Ubuntu dilakukan dalam kondisi fresh install

Perkembangan Docker dalam dunia produksi

Saat ini Docker dengan cepat menjadi standar tool berbasis container, dan banyak diintegrasikan oleh project PaaS seperti Dokku, Deis, Flynn atau Vagrant.
Beberapa server farm terbesar saat ini menggunakan container. Pengembangan web yang besar seperti Google dan Twitter dan platform provider seperti Heroku dan dotCloud berjalan dengan teknologi container, pada skala ratusan ribu atau bahkan jutaan container yang berjalan secara paralel.

References:
Images:

No comments:

Post a Comment