Cerita Docker

Sudah bosan mendengar kata Docker sepanjang tahun 2015? Sayang sekali, karena dari skala hype Fantastic Four sampai Mad Max: Fury Road, tampaknya tahun ini Docker akan ada di tahap Star Wars: The Force Awakens.

Eric Brewer, engineer dari Google, berkata tentang keberadaan Docker, “teknologi pengembang perangkat lunak belum pernah sepesat dan semasif ini sejak framework Ruby on Rails delapan tahun yang lalu.”

Sebelum membahas apa itu Docker, inilah yang biasanya terjadi di proses pengembangan perangkat lunak (software development).

Umumnya developer seperti anak kucing yang ingin mencoba sesuatu yang baru (ya, itu jelas termasuk kalian JavaScript developer, dengan terlalu banyak framework dan library, yang tiap tiga jam sekali mengubah API) maka tingkat ketergantungan pada software lain sangat tinggi.

Dan sementara itu di bagian ops dan infra layaknya kakek tua penyuka senam taichi, menyukai lingkungan yang cenderung tak cepat berubah, karena stabil berarti resiko bisa diukur dan yang penting bisa tidur tenang di malam hari dan di akhir pekan.

Dan devops itu keahlian yang mahal, maka tak jarang ini terjadi:

Di masa-masa genting itu Docker datang untuk mencegah bharatayuda antara developer dan ops/infra.

Apa itu Docker?

“Docker adalah solusi yang dikirim tuhan server untuk developer yang melepaskan tanggung jawab ketika aplikasi dijalankan di mesin produksi.”

Dalam lima tahun ini komputasi makin murah dengan adanya cloud computing, komputasi ini pada dasarnya adalah mengambil sumber daya komputasi yang besar dan memecah-mecahnya dalam ukuran yang lebih kecil. Apapun bisa dibagi, mulai dari CPU, memori, sampai kapasitas penyimpanan.

Teknologi yang digunakan biasanya adalah virtual machine. Satu mesin bisa membagi sumber daya dengan membuat mesin-mesin virtual yang lebih kecil di atasnya. Analoginya adalah kapal Blue Marlin yang memuat kapal-kapal kecil di atasnya.

Cloud computing adalah jodoh dari surga bagi ops/infra. Ops terbebas dari ritual memasukkan CD Slackware setiap menginstall server baru. Itu baru satu server, coba kalau 900.000. Dengan teknologi virtual machine, ops membuat satu image, klak-klik, ketak-ketik, deploy, mau satu atau seratus bukan masalah asal limit kartu kreditnya cukup, 55 detik punya server(-server) baru.

Yang dilakukan virtual machine selain berbagi sumber daya adalah isolasi, apa yang terjadi di mesin virtual satu tidak akan merusak tatanan kehidupan rumah tangga mesin virtual yang lain. Jika yang dilakukan virtual machine ada dalam ranah Sistem Operasi, maka yang dilakukan Docker ada di ranah aplikasi. Bayangkan kapal Marco Polo sebagai Docker host dan kontainer-kontainer yang diangkatnya adalah aplikasi.

Docker berangkat dari libcontainer dan UnionFS untuk menciptakan sistem pemaketan aplikasi dengan semua ketergantungannya ke dalam satu unit standar, Docker container. Docker container membungkus aplikasi dalam sistem berkas lengkap yang berisi semua yang diperlukan agar aplikasi itu berjalan: kode, runtime, system tools, dan libraries.

Apapun yang bisa berjalan di server bisa dibungkus dalam Docker container.

Contohnya adalah jika sebuah aplikasi yang membutuhkan ImageMagick tidak akan meminta dependency pada host tapi mencukupi dirinya sendiri dalam kontainer. Developer cukup bekerja pada kontainernya sendiri karena ia akan berjalan di manapun Docker host berada dan apapun sistem operasi servernya. Docker adalah solusi yang dikirim tuhan server untuk developer yang melepaskan tanggung jawab ketika aplikasi dijalankan di mesin produksi.

Dengan pondasi ini lahirlah sistem operasi Linux generasi cloud, seperti CoreOS, Rancher yang sekecil upil dan tugas utamanya: menjadi tuan rumah bagi kontainer aplikasi.

Karena Docker container berbagi kernel sistem operasi, mereka sangat cepat dan efisien dalam penggunaan memori. Sekali lagi, Docker sangat ringan dan cepat. Docker container adalah instance dari Docker image, dan Docker image punya satu proses utama yang akan berjalan saat Docker container dijalankan.

Secepat apa? Punya waktu 3 detik dan ingin menjalankan MariaDB?

docker run mariadb

MariaDB akan berjalan di dalam container yang terisolasi. Cobalah bertanya pada MariaDB yang baru diciptakan itu, dia pasti tak sadar dirinya berjalan di dalam Docker. Atau jika ingin menjalankan 20 instance MariaDB, cukup ketik ‘docker run mariadb’ sebanyak 20 kali (gak kurang mas? kemarin aja Udin pesen 37), maka 20 instance MariaDB akan berjalan dalam hitungan detik. Dalam mesin yang sama.

Setiap proses MariaDB akan memiliki port yang identik, karena terisolasi mereka tidak akan memiliki konflik atau bahkan dendam dengan proses yang lain, sampai mereka diperintahkan untuk membuka isolasi port itu. Alih-alih menjalankan ‘docker run’ X kali, docker-compose membuatnya lebih kece:

docker-compose scale mariadb=20

Arsitektur Docker

Docker menggunakan arsitektur client dan server. Docker client berkomunikasi dengan Docker daemon yang akan membangun, menjalankan dan mendistribusikan Docker container.

Docker Images

Docker images pada dasarnya adalah sekumpulan file yang menyertakan apa saja yang dibutuhkan untuk membangun sebuah Docker container, termasuk sistem operasi, system tool, libraries, dan teman-temannya. Untuk membuat Docker images panggillah ‘docker build’ pada sebuah file konfigurasi bernama Dockerfile.

File ini biasanya terdiri beberapa baris yang berisi instruksi seperti FROM untuk mengambil dasar Docker images dari registry privat atau publik, RUN untuk menjalankan perintah, ADD dan COPY untuk yang berkaitan dengan file, ENV untuk mengeset variable env dan CMD untuk menjalankan proses. Tiap barisnya akan menciptakan layer dalam format UnionFS.

Layer

Docker images terdiri dari beberapa layer. Contohnya jika ingin menjalankan sebuah Django instance, maka bisa dimulai dengan menggunakan layer Debian, setelah itu layer libraries yang dibutuhkan Python dan Django, lalu layer Nginx, lalu layer aplikasi Django.

Layer-layer yang sama bisa digunakan berulang-kali dan dipakai bersamaan. Jadi layer-layer Debian dan Nginx bisa dipakai ulang dan hanya menambahkan layer Flask atau Turbogears untuk Docker images yang berbeda.

Karena itu juga Docker images sangat murah karena tak harus membangun ulang semuanya. Di sini perbedaan dengan virtual machine sangat kelihatan. Untuk membuat 10 server yang menjalankan MariaDB dibutuhkan bergiga-giga storage disk, sementara Docker hanya ada penambahan kecil di file data di setiap Docker container yang dijalankan.

Docker memakai copy-on-write, yang berarti setiap Docker image menggunakan file yang sama sampai salah satu dari mereka mengganti sebuah file. Di titik itu, proses akan menyalin file dan menulis versinya sendiri. Ini juga berarti Docker image tidak terlalu sering menulisi disk ketika memulai sebuah proses. Itu yang menyebabkan Docker sangat cepat.

Bahkan ada legenda sebuah Docker sudah menjalankan aplikasi sebelum developer mengetik ‘docker run’.

That’s. Pretty. Damn. F**kin. Holy. Molly. Barry Allen. Lucky Luke. Fast

Docker Container

Jika Docker images adalah file make Docker container adalah direktori. Ia memiliki semua yang dibutuhkan sebuah aplikasi untuk berjalan. Docker container bisa di run, start, stop, move, dan delete. Docker container adalah bagian yang menjalankan aplikasi.

Docker Registry

Docker registry menyimpan Docker images. Bisa bersifat privat atau publik. Docker menyediakan Docker registry publik default yang tersedia di https://hub.docker.com/.

Arsitektur Docker

Jadi, apakah seorang developer harus mempelajari Docker?

Dari saya sih iya, gak tahu kalo Mas Anang.