Mengenal Konsep Pada Docker
Halo! Sebenarnya ini adalah post pertama saya di Medium, mumpung sedang berlibur sambil saya bermain dengan infrastruktur, supaya tetap produktif, saya memutuskan untuk membagikan sedikit pengetahuan saya, hehe :) Semoga bermanfaat.
Saya mencoba sebisa mungkin menjelaskan secara berurutan dengan bahasa yang mudah dipahami, Sebelum membahas apa itu Docker, saya ingin memberitahu bahwa bahasan ini melibatkan bahasan Arsitektur & Infrastruktur, untuk Anda yang kurang menyukai ranah ini tetapi ingin belajar, silakan baca secara perlahan saja :)
Konsep Dasar
- Bundling Aplikasi
Bayangkan Anda punya aplikasi web sederhana (misalnya menggunakan framework Django), lalu Anda ingin melakukan deployment di server atau komputer teman, tentunya Anda harus melakukan instalasi semua dependecies atau modul yang diperlukan satu persatu, bukan (minimal Django nya itu sendiri).
Sekarang bayangkan jika ada banyak komputer yang harus menjalankan aplikasi yang sama, akan merepotkan jika harus menginstal dependencies secara repetitif, belum lagi masalah yang bisa muncul seperti kompatibilitas, OS, dan lainnya yang disebabkan konfigurasi yang berbeda, dimana dapat menyebabkan aplikasi tidak bisa berjalan dengan normal di setiap komputer.
Solusinya adalah dengan membungkus aplikasi bersama dependencies yang diperlukan menjadi suatu bundel lalu deploy bundel ke setiap komputer, sehingga tidak perlu melakukan instalasi dependecies secara terpisah. Lebih nyaman, bukan~
Bayangkan seperti mirip DVD Windows 7 with SP1, di mana terdapat bundling windows 7 + update Service Pack 1, jadi update SP1 ada didalamnya & tidak perlu melakukan instalasi SP1 secara terpisah. Atau contoh lain seperti bundling software bajakan yang didalamnya ada crack, pengguna biasanya tidak perlu memasang crack sendiri.
Iya iya iya… Jadi Docker itu apa? Eits, tunggu dulu, ada 1 hal yang harus dipahami dulu, yaitu Virtualiasi.
- Virtualisasi
Virtualisasi merupakan upaya membuat resource yang dimiliki secara fisik menjadi virtual, biasanya digunakan untuk membagi resource menjadi bagian yang lebih kecil agar komputasi menjadi efisien. Proses virtualisasi memungkinkan menjadikan resource fisik suatu individu dianggap sebagai banyak resource virtual dan sebaliknya. Virtualisasi ada beberapa jenis, tetapi yang akan dibahas disini adalah Container dan Virtualisasi Hypervisor (biasanya dikenal dengan Virtual Machine / VM)
Virtualisasi Hypervisor (VM) memanfaatkan arsitektur mikroprosesor, biasanya ada di prosesor x86 dengan nama dan implementasi yang berbeda tergantung pada vendor yang membuat prosesor itu (Intel: VT-x, AMD: AMD-V). virtualisasi ini memungkinkan Hypervisor untuk berkomunikasi langsung dengan prosesor tanpa harus melewati sistem operasi utama komputer. Setiap VM menggunakan OS didalamnya yang disebut dengan Guest OS beserta library dan aplikasi lain didalamnya (Bayangkan saja menjalankan full komputer yang memiliki OS dalam komputer).
VM memanfaatkan OS dan resources sesuai yang didefinisikan saat awal instalasi (misalnya Anda punya 1 komputer dengan RAM 10 GB, lalu membuat 1 VM didalamnya dengan spesifikasi RAM 2 GB, maka dia akan memanfaatkan RAM 2 GB itu), lingkungan VM juga terisolasi dari lingkungan komputer asli, modifikasi pada VM tidak mempengaruhi komputer asli.
Container adalah virtualisasi yang mirip seperti VM, tetapi tidak menggunakan Guest OS & Hypervisor. Container sebenarnya bukanlah VM, dan container memiliki keterbatasan fitur dibanding VM tetapi memiliki kelebihan untuk deployment aplikasi yang terisolasi.
Setiap container dikelola oleh Container Manager dengan memanfaatkan OS dan resource dari komputer asli (misalnya Anda punya 1 komputer dengan RAM 10 GB, maka container akan memanfaatkan RAM 10 GB tersebut).
Meskipun tidak seberat VM, Container secara umum tidak memiliki batasan penggunaan resource, jadi bisa saja kalau resource aplikasi terlalu tinggi tetapi spesifikasi komputer terlalu rendah akan terjadi out of memory
Meskipun container memanfaatkan resource dan OS komputer asli, tetapi lingkungan container tetaplah bersifat terisolasi karena sudah diatur oleh Container Manager, sehingga modifikasi pada container tidak akan mempengaruhi komputer asli.
Teknologi yang menyusun virtualisasi dengan container disebut dengan Containerization.
Kelebihan dari container dibandingkan dengan VM adalah penggunaan resource yang lebih sedikit, karena tidak adanya Guest OS yang menyebabkan boot & eksekusi aplikasi berlangsung jauh lebih cepat.
Bagaimana kedua konsep (container dan bundling aplikasi) apabila digabungkan, sederhananya menghasilkan konsep lain yaitu:
Wrapping an application in a container means that the application is easy to deploy alongside all the appropriate configuration files and dependencies
Sudah terbayang belum nih ? contoh sederhananya, aplikasi web Django milik Anda dapat di deploy di berbagai komputer dengan mudah tanpa harus mengurus kemungkinan ada konfigurasi yang berbeda setiap komputernya.
Sebelum menuju ke bagian selanjutnya, coba stop dulu bacanya sampai sini, dan pelan-pelan pahami dulu konsep dasarnya, kalau sudah siap, boleh lanjut membaca ke bawah. :)
Mengenal Docker
Wah hebat! ternyata Anda masih sanggup sampai sini! :) Oke lanjut ya.
Jadi Docker itu sebenarnya apa sih ?
Docker adalah sebuah container manager yang berperan mengelola container dan melakukan otomatisasi deployment di dalam container. Docker bertugas menjalankan aplikasi dalam container & mengelola container yang berjalan dalam suatu komputer.
Docker bekerja dengan memanfaatkan kernel Linux, dan secara mature mendukung sistem operasi Linux. Docker sebenarnya juga menyediakan instalasi untuk Windows tetapi containerization yang dijalankan tetap berbasis Linux (Bayangkan saja ada container Linux berjalan di Windows).
Informasi lebih lengkapnya ada di Website Resmi Docker
- Mengapa Docker
Sebenarnya Docker hanya salah satu dari beberapa platform containerization yang tersedia di pasaran, disini yang dibahas adalah Docker karena populer di kalangan pengembang. Ada beberapa manfaat menggunakan Docker:
- Docker dapat meng-optimalisasi infrastruktur IT perusahaan dan meningkatkan kinerja pada tim pengembang karena mempermudah dan distribusi aplikasi ke lingkungan production lebih cepat
- Apabila menggunakan sistem container, seluruh pekerjaan pebuatan aplikasi, modul, monitoring, serta manajemen infrastruktur dapat lebih cepat, efisien dan lebih aman
- Docker membuat Anda tidak perlu memikirkan kemungkinan konfigurasi yang berbeda dari setiap komputer yang akan menggunakan aplikasi yang Anda miliki (Berfokus pada penggunaan universal)
- Docker juga sering digunakan untuk membuat soal CTF (Capture The Flag) untuk menghasilkan environment dan instances yang berbeda untuk setiap tim yang bertanding dalam kompetisi, sehingga modifikasi yang dilakukan suatu tim tidak mempengaruhi konfigurasi pada tim lainnya.
- Docker juga biasa digunakan untuk arsitektur cloud computing, misalnya membuat instances yang berbeda untuk setiap pengguna yang login dan hendak memanfaatkan layanan
Selain itu, masih banyak lagi contoh kegunaan Docker di dunia nyata
Arsitektur Docker
Hiya hiya hiya gambar apa itu di atas, kok kelihatan susah ya :( . Eits tenang dulu, akan coba dibahas satu persatu disini.
Pada gambar terdapat 3 bagian, yaitu client, host, dan registry. Sebenarnya saat Anda mengunduh & menginstal Docker, maka Anda akan mendapatkan suatu lingkungan didalamnya terdapat Docker Client dan Docker Server / Host (Berikutnya saya sebut Docker Server saja ya)
Arsitektur pada Docker sebenarnya menggunakan mekanisme Client dan Server, Docker Client mengirimkan request ke Docker Server (lebih tepatnya menuju Docker Daemon) agar docker dapat membangun, mendistribusikan, dan menjalankan container. Docker Client dan Docker Server dapat berjalan pada sistem yang sama, antar Docker Client dan Docker Server dapat berkomunikasi via socket menggunakan Restful API atau CLI.
Hmm terdengar susah ya… Sebenarnya tidak kok!
Bayangkan saja begini, misalnya Anda mengirimkan perintah kepada Docker untuk membuat container aplikasi web Django, disitulah Anda menggunakan Docker Client sebagai perantara, kemudian Docker Client mengirimkan perintah ke Docker Server untuk membuat container Django. Sudah~
Tadi sempat disinggung Docker Daemon ya ? Jadi…
Docker Daemon adalah komponen pada Docker Server yang berfungsi untuk membangun, mendistribusikan dan menjalankan container. Pengguna tidak bisa langsung menggunakan docker daemon, tetapi harus melalui perantara Docker Client.
TL;DR : Docker Daemon adalah komponen yang menjalankan container
Setelah semua penjelasan diatas, mungkin Anda seharusnya mulai ada sedikit gambaran tentang arsitektur Docker pada gambar di bawah ini
Oke, lalu bagaimana dengan Docker Registry, belum dibahas tuh ?
Docker Registry adalah komponen penyimpanan untuk Docker Image. Docker Registry bisa berupa tempat penyimpanan terpisah atau berupa repository yang bersifat public maupun private. Salah satu contoh Docker Registry yang paling umum adalah Docker Hub
TL;DR : Docker Registry adalah tempat menyimpan kumpulan Docker Image
Docker Hub sebenarnya merupakan layanan repository dari Docker yang menyimpan kumpulan Docker Image yang siap digunakan. Bayangkan saja Docker Hub seperti GitLab atau GitHub, tetapi yang disimpan bukanlah source code, melainkan Docker Image. Misalnya saja Docker Image aplikasi Django ada pada Link Ini
TL;DR : Docker Hub adalah salah satu Docker Registry
OI , OI… Tunggu ! Apa lagi itu Docker Image
Docker Image adalah sebuah template yang bersifat read only. Template ini sebenarnya adalah sebuah OS atau OS yang telah diinstall berbagai aplikasi. Hanya 1 Docker Image kita dapat membuat banyak container. Docker Image juga boleh dianalogikan seperti aplikasi + dependencies yang sudah dibundling dan siap untuk dijalankan di komputer yang diinginkan.
Docker Image yang sudah jadi biasanya akan disimpan dalam Docker Registry untuk penggunaan di masa depan. Pembuatan suatu Docker Image pada aplikasi dapat melibatkan Docker Image lain. Misalnya Anda ingin membuat sebuah blog pribadi menggunakan Django, maka prosedur secara umum adalah:
Docker Image Django + HTML, CSS, JS = Docker Image Blog Pribadi
Jangan bayangkan “image” sebagai suatu file gambar atau file ISO ya.
Dalam merancang suatu Docker Image, diperlukan 1 file khusus yang bernama Dockerfile. Dockerfile adalah sebuah file yang berisi konfigurasi dan perintah yang digunakan untuk membuat Docker Image aplikasi yang Anda miliki.
Pada contoh blog pribadi di atas, Dockerfile dapat berperan dalam:
- Mengambil Docker Image Django dari Docker Registry sebagai base image
- Memasukkan HTML, CSS, JS ke dalam base image
- Membuat Docker Image baru yang sudah berisi HTML, CSS, JS
Ilustrasi Cara Kerja Docker
- Dockerfile bertugas untuk membentuk Docker Image, dimana Docker Image dapat diperoleh dengan mengambil (pull) dari Docker Registry. Docker Image juga bisa dijalankan oleh Docker menjadi suatu container yang ada pada komputer.
- Docker Image juga dapat dibuat atau disimpan sebagai file berekstensi .tar yang dapat digunakan kembali di masa depan, biasanya ini digunakan untuk menyimpan Docker Image secara lokal.
- Apabila terjadi modifikasi pada container, tim pengembang dapat menyimpan perubahan menjadi suatu Docker Image baru dengan melakukan commit, sehingga menghasilkan Docker Image baru.
- Tim Pengembang dapat menyimpan Docker Image yang telah dimodifikasi ke dalam Docker Registry dengan menggunakan perintah push.
Selesai deh pengenalan Docker bagian 1 .. Huftt banyak juga :’)
Oke, sampai sini sepertinya sudah cukup banyak ya yang dijelaskan. Sebenarnya masih banyak yang belum dibahas, seperti cara container berkomunikasi, dan serangkaian hal teknis lainnya, tetapi itu akan coba saya bahas post bagian berikutnya :)
Sekian penjelasan dari saya mengenai pengenalan Docker untuk Bagian 1. Semoga tulisan ini dapat memberikan mnafaat bagi Anda yang membutuhkan. Silakan tinggalkan komentar jika ada pertanyaan atau hal yang saya lewatkan atau terdapat kekeliruan dari apa yang saya jelaskan.
Terima Kasih.