Docker? Sederhana!
Sebagai software developer, kamu pasti pernah mencoba untuk menjalankan program yang dibuat oleh orang lain. Namun, tentu untuk menjalankan program tersebut harus meng-install terlebih dahulu seluruh dependencies yang diperlukan oleh program tersebut, dan hal itu dapat memakan waktu yang lama. Selain itu, ada kemungkinan bahwa dependencies yang dibutuhkan oleh program tersebut dapat “crash” dengan dependencies yang sudah ada pada komputer kamu sebelumnya yang dapat menyebabkan masalah baru yang sebelumnya tidak ada sama sekali. Masalah tersebut dapat diselesaikan dengan bantuan Docker Container!
WHAT IS DOCKER CONTAINER?
Container adalah kesatuan perangkat lunak yang didalamnya sudah terdapat seluruh code aplikasi beserta dependencies yang diperlukan untuk menjalankan aplikasi tersebut. Container dibuat agar sebuah aplikasi dapat berjalan dengan cepat dan lancar dalam berbagai environment berbeda tanpa harus melakukan instalasi terhadap dependencies yang dibutuhkan pada environment tersebut. Pada Docker, semua code dan dependencies yang dibutuhkan dibungkus dalam 1 buah Docker Image yang menjadi container ketika dijalankan pada Docker Engine.
IMPORTANT COMPONENTS OF DOCKER
Untuk memahami lebih lanjut mengenai Docker dan cara kerjanya, maka mari kita lihat komponen penting yang digunakan dalam Docker:
- Docker Image — adalah sebuah executable berisi semua code beserta dependencies yang dibutuhkan oleh code tersebut. Image ini nantinya yang akan membangun Container
- Docker Container — adalah environment dimana sebuah aplikasi berjalan secara independen dari host OS. Mirip seperti cara kerja mesin virtual.
- Docker Client — adalah CLI untuk user memasukkan berbagai perintah
- Docker Engine — adalah engine untuk berinteraksi dengan Docker Daemon
- Docker Daemon — adalah Pengelola Docker images, container, dll.
- Docker Registry — adalah wadah penyimpanan Docker Image secara online, dimana yang paling utama adalah Docker Hub.
HOW DOCKER WORKS
Sekarang, kita akan mencari bagaimana docker melakukan pekerjaannya. Contoh sederhana adalah saat kita ingin menjalankan aplikasi redis untuk caching, namun tanpa menginstall aplikasi tersebut beserta dependenciesnya terlebih dahulu. Untuk melakukan hal tersebut, kita dapat menjalankan perintah “docker run redis” pada docker client.
- Yang pertama dilakukan adalah pemeriksaan apakan sudah ada Docker Image dari redis beserta dependencies yang dibutuhkan pada docker daemon yang ada di lokal perangkat kita.
- Jika belum terdapat Docker Image redis beserta dependenciesnya, maka Docker Engine akan berkomunikasi dengan Docker Registry (Docker Hub) apakah ada image redis pada registry tersebut. Jika ada, maka dilakukan “pull” sehingga kita memiliki image redis dan dependenciesnya di lokal perangkat kita.
- Setelah dipastikan bahwa image redis sudah ada pada docker daemon, maka akan dibuatkan container untuk menjalankan image tersebut.
- Voila! aplikasi redis sudah dapat dijalankan.
BENEFITS OF DOCKER CONTAINER
Ada banyak alasan mengapa banyak software developer beralih menggunakan docker untuk containerize aplikasi mereka dibandingkan dengan melakukan direct deployment. Alasan tersebut diantaranya sebagai berikut :
- Distribusi aplikasi lebih cepat — Menurut AWS, pengguna docker mengirimkan perangkat lunak lebih sering daripada pengguna non-docker.
- Konfigurasi yang sederhana — Untuk membuat Docker Image tidaklah sulit. Yang harus kita lakukan adalah membuat sebuah Dockerfile yang berisi konfigurasi mengenai apa saja yang harus dilakukan untuk menjalankan aplikasi tersebut, serta image lain apa saja yang dibutuhkan sebagai dependencies agar image bersangkutan dapat berjalan.
- Isolasi — Docker mengisolasi sumber daya setiap container, sehingga user dapat menyesuaikan kebutuhan setiap aplikasi tanpa mempengaruhi konfigurasi aplikasi lain
- Keamanan — Aplikasi yang berjalan tidak dapat mengambik kontrol penuh terhadap container, lebih lagi terhadap Host OS.
DOCKER IMPLEMENTATION
Untuk dapat merasakan manfaat yang telah disebutkan diatas, tentu saja saya dan kelompok saya dalam pengerjaan proyek mata kuliah PPL Fasilkom UI 2021 menggunakan Docker untuk menjalankan dan distribusi aplikasi yang saya buat. Langkah pertama yang saya lakukan tentu saja melakukan instalasi Docker Client agar dapat menjalankan berbagai perintah. Untuk panduan instalasi, dapat dilihat disini sesuai dengan sistem operasi yang digunakan perangkat masing-masing (perhatikan bahwa pada sistem operasi Windows 10 home dibutuhkan layanan WSL 2).
Yang saya lakukan selanjutnya adalah membuat sebuah Dockerfile, untuk menjelaskan konfigurasi seperti apa yang ingin saya terapkan pada image aplikasi saya. Dockerfile yang saya buat adalah sebagai berikut :
Terlihat ada beberapa hal yang saya tuliskan sebagai konfigurasi Docker Image pada Dockerfile yang saya buat, diantaranya sebagai berikut :
- Base image yang digunakan, dengan kata lain image dependency yang dibutuhkan agar aplikasi dapat berjalan (FROM). Karena aplikasi yang saya kembangkan berbasis Python Django, maka image dependency yang saya butuhkan adalah Python.
- Setup dan membuat environment variable yang digunakan oleh aplikasi setelah berjalan (ENV).
- Melakukan install requirement (RUN).
- Membuka port tertentu agar dapat dibuka di perangkat user (EXPOSE).
- Command untuk menjalankan aplikasi (CMD).
Setelah saya membuat Dockerfile yang sesuai dengan kebutuhan aplikasi, maka selanjutnya saya menjalankan perintah “docker build” agar dibuatkan Docker Image sesuai dengan Dockerfile yang sudah saya buat. Saya menambahkan opsi -t agar dapat menambahkan nama image yang saya mau.
Kemudian saya hanya tinggal menjalankan image tersebut dengan command “docker run”. Hasil dari command ini adalah sama persis seperti kita menjalankan aplikasi django seperti biasa, namun sebenarnya kita menjalankan sebuah container didalamnya terdapat aplikasi django.
Untuk memeriksa apakah Image dan Container yang dibuat sebelumnya sudah terdaftar dalam docker daemon, anda dapat menjalankan 2 command ini :
- docker image ls — untuk memeriksa apakah image yang anda buat sudah terdaftar dalam docker daemon
- docker ps — untuk memeriksa apakah container anda sudah berjalan
Berikut adalah hasil dari kedua command diatas.
Terakhir, untuk menghentikan container yang sedang berjalan, hanya perlu menjalankan command “docker stop” yang diikuti dengan container id yang ingin dihentikan.
CONTAINER ORCHESTRATION
Setelah mengetahui bagaimana container bekerja, maka kita perlu belajar tahap selanjutnya yaitu mengenai Container Orchestration. Container Orchestration berarti mengurus semua container yang dibutuhkan dalam environment yang dinamis, baik daur hidup container maupun interaksi antar container yang ada. Tools untuk melakukan Container Orchestration disebut Orchestrator. Ada beberapa pilihan orchestrator yang dapat digunakan, diantaranya adalah Kubernetes dan Docker Swarm. Namun, untuk melakukan Container Orchestration sederhana dalam 1 perangkat saja dapat menggunakan layanan Docker yang bernama docker compose.
Ada banyak yang dapat diautomasi dengan adanya penggunaan orchestrator, diantaranya :
- Pembuatan dan deployment dari kontainer yang ada
- Redundancy dari kontainer yang ada
- Mengatur load dari setiap docker itu sendiri
- Pemindahan host jika salah satu host mati
- Alokasi resources
- Untuk menampilkan detil services yang jalan
- Health monitoring dan load balancing
- Konfigurasi dari aplikasi yang menjalankan docker
Seperti yang disebutkan diatas, ada 1 layanan/framework orchestrator sederhana yang bernama docker-compose. Docker-compose adalah framework yang memungkinkan user membuat 1 aplikasi besar yang bersifat container-based (terdiri dari beberapa container yang berjalan dalam 1 waktu) hanya dengan 1 file YAML. Contoh snippet code dari docker-compose.yml adalah sebagai berikut :
Pada snippet diatas, terlihat bahwa ada 2 layanan atau 2 container yang diharapkan untuk berjalan berdampingan agar suatu aplikasi dapat befungsi dengan baik. Komponen yang dapat dituliskan pada file YAML dari docker-compose dapat berupa Docker Image yang digunakan, port yang ingin di-expose, dependencies, dll. Dengan menggunakan layanan docker-compose, kita dapat menjalankan kedua container yang disebutkan dalam file YAML dengan hanya 1 perintah, yaitu “docker-compose up”.
Sekian dari pengenalan Docker Container serta Container Orchestration untuk mengenalkan pada software developer kepada sistem container yang dapat memudahkan pengembangan aplikasi.
Semoga artikel ini membantu ^-^.
Referensi: