Kontainerisasi dan Docker
Kontainerisasi telah menjadi salah satu teknologi yang paling berpengaruh dalam pengembangan dan deployment aplikasi modern. Ini adalah pendekatan yang memungkinkan pengembang untuk menjalankan aplikasi di lingkungan yang terisolasi, yang disebut sebagai kontainer. Kontainer berisi semua yang diperlukan untuk menjalankan aplikasi—mulai dari kode, runtime, pustaka, hingga pengaturan sistem. Dalam blog ini, kita akan mempelajari dasar-dasar kontainer, perbedaan antara metode deployment tradisional, virtual, dan berbasis kontainer, serta fokus pada salah satu teknologi kontainerisasi yang paling populer: Docker. Kita juga akan melihat arsitektur, cara kerja, dan beberapa perintah dasar Docker, diakhiri dengan studi kasus deployment yang dapat membantu Anda memahami aplikasi Docker secara praktis.
Apa Itu Kontainer?
Kontainer adalah paket perangkat lunak yang mencakup semua dependensi yang diperlukan untuk menjalankan aplikasi di berbagai lingkungan. Ini memungkinkan aplikasi untuk dijalankan secara konsisten di berbagai sistem tanpa masalah kompatibilitas. Kontainer menggunakan kernel sistem operasi host dan menyediakan lingkungan terisolasi yang menjalankan aplikasi seolah-olah berada di dalam sistem operasinya sendiri.
Berbeda dengan mesin virtual (VM), yang memerlukan seluruh sistem operasi untuk dijalankan di atas hypervisor, kontainer jauh lebih ringan karena berbagi kernel dengan sistem host dan hanya membutuhkan elemen yang diperlukan untuk aplikasi tertentu. Ini membuat kontainer lebih efisien dalam hal penggunaan sumber daya dan waktu startup.
Metode Deployment: Tradisional, Virtual, dan Kontainer
Sebelum kita melangkah lebih jauh ke dalam dunia kontainer, penting untuk memahami metode-metode deployment aplikasi yang ada:
- Deployment Tradisional:
- Dalam metode tradisional, aplikasi dijalankan langsung pada server fisik. Semua komponen aplikasi, termasuk kode, pustaka, dan sistem operasi, diinstal langsung di server tersebut. Meskipun metode ini sederhana, ia tidak efisien karena sumber daya server yang tidak terpakai tetap menganggur, dan manajemen skala besar bisa menjadi tantangan.
- Mesin Virtual (VM):
- Mesin virtual memungkinkan beberapa aplikasi berjalan pada satu server fisik dengan memvirtualisasikan perangkat kerasnya. Setiap VM memiliki sistem operasinya sendiri dan dapat menjalankan aplikasi secara independen. Meskipun VMs meningkatkan efisiensi dibandingkan dengan metode tradisional, mereka tetap memerlukan sumber daya yang signifikan karena setiap VM menjalankan salinan penuh dari sistem operasi.
- Kontainer:
- Kontainer memberikan keseimbangan antara isolasi aplikasi dan efisiensi sumber daya. Dengan menggunakan kernel sistem operasi host, kontainer mengemas aplikasi dan dependensinya dalam satu paket yang dapat dijalankan di mana saja, menjadikannya solusi yang lebih ringan dan cepat dibandingkan dengan VM.
Pengenalan ke Container Runtime
Container runtime adalah perangkat lunak yang bertanggung jawab untuk menjalankan dan mengelola kontainer pada host. Ini mencakup fungsi untuk membuat, mengeksekusi, dan menghentikan kontainer. Beberapa container runtime yang populer adalah Docker, containerd, dan CRI-O. Docker adalah yang paling terkenal di antara mereka dan telah menjadi standar de facto dalam kontainerisasi aplikasi.
Docker
Docker adalah platform yang menyederhanakan pembuatan, pengiriman, dan menjalankan aplikasi dalam kontainer. Docker memungkinkan pengembang untuk mengemas aplikasi bersama dengan semua dependensinya ke dalam kontainer, sehingga aplikasi dapat dijalankan secara konsisten di berbagai lingkungan, dari komputer pengembang hingga server produksi.
Docker terdiri dari beberapa komponen inti yang bekerja bersama untuk memberikan fungsionalitas kontainerisasi:
- Docker Client: Antarmuka yang digunakan pengguna untuk berinteraksi dengan Docker. Perintah Docker yang dijalankan oleh pengguna dikirim ke Docker Daemon untuk dieksekusi.
- Docker Daemon: Komponen yang melakukan pekerjaan sebenarnya, seperti membangun, menjalankan, dan mendistribusikan kontainer.
- Docker Image: Template read-only yang digunakan untuk membuat kontainer. Setiap image dapat memiliki beberapa lapisan, yang memungkinkan untuk penggunaan kembali dan efisiensi penyimpanan.
- Docker Container: Instansi runtime dari Docker Image. Kontainer adalah unit yang menjalankan aplikasi.
- Docker Registry: Tempat penyimpanan image Docker, baik publik (seperti Docker Hub) maupun privat, yang memungkinkan berbagi dan distribusi image.
Arsitektur Docker
Arsitektur Docker didasarkan pada model klien-server. Klien Docker adalah antarmuka baris perintah (CLI) yang digunakan untuk mengirim perintah ke Docker Daemon. Docker Daemon menjalankan perintah ini, seperti membangun, menjalankan, dan mengelola kontainer Docker.
Docker menggunakan konsep image untuk membangun kontainer. Image adalah snapshot dari aplikasi yang berisi semua dependensi yang diperlukan. Setiap kali perubahan dibuat pada aplikasi atau lingkungannya, sebuah lapisan baru ditambahkan ke image, yang memungkinkan penggunaan kembali lapisan dan mengurangi redundansi.
Kontainer Docker dibuat dari image ini. Ketika Anda menjalankan perintah docker run, Docker Daemon membuat kontainer baru dari image dan menjalankannya sebagai proses terisolasi.
Cara Kerja Docker
Docker bekerja dengan cara memvirtualisasikan sistem operasi, bukan perangkat keras. Ketika Anda menjalankan kontainer, Docker membuat lingkungan terisolasi untuk aplikasi, menggunakan kernel sistem operasi host dan menjalankan aplikasi seolah-olah di dalam sistem operasinya sendiri.
Docker mendownload image dari registry seperti Docker Hub, menyimpannya secara lokal, dan kemudian membuat kontainer dari image tersebut. Ketika kontainer dijalankan, Docker menambahkan lapisan baru yang writable di atas image read-only, memungkinkan aplikasi berjalan dan menyimpan perubahan tanpa memodifikasi image aslinya.
Perintah Dasar Docker
Berikut adalah beberapa perintah dasar Docker yang perlu diketahui:
- docker pull:
- docker pull adalah perintah yang digunakan untuk mengunduh (atau menarik) image Docker dari Docker Hub atau registry lain ke mesin lokal Anda. Image ini adalah template dari mana kontainer akan dibuat.
- Bagaimana Cara Kerjanya? Ketika Anda menjalankan docker pull, Docker akan menghubungi Docker Hub atau registry yang ditentukan, mencari image yang diminta, dan mengunduh image tersebut ke dalam sistem Anda.
- Contoh Penggunaan: Jika Anda ingin mengunduh image untuk NGINX (web server), Anda akan menjalankan:
- docker pull nginx
- nginx adalah nama image.
- latest adalah tag yang menunjukkan versi terbaru dari image tersebut. Jika tag tidak ditentukan, Docker akan menggunakan tag latest secara default.
- docker run:
- docker run adalah perintah untuk membuat dan menjalankan kontainer baru dari image yang sudah ada. Ini juga memungkinkan Anda untuk mengatur beberapa opsi tambahan seperti port, volume, dan variabel lingkungan.
- Bagaimana Cara Kerjanya? Perintah ini akan:
- Membuat kontainer baru dari image yang ditentukan.
- Menjalankan kontainer tersebut dengan pengaturan yang Anda tentukan.
- Contoh Penggunaan: Untuk menjalankan kontainer NGINX dengan memetakan port 80 di kontainer ke port 8080 di mesin lokal, Anda akan menggunakan:
- Contoh: docker run -d -p 8080:80 nginx
“-p 8080:80” memetakan port 80 di dalam kontainer ke port 8080 di mesin lokal.
- docker images:
- docker images adalah perintah yang menampilkan daftar semua image Docker yang tersedia di mesin lokal Anda.
- Bagaimana Cara Kerjanya? Perintah ini menunjukkan informasi seperti nama image, tag, ID image, ukuran, dan waktu pembuatan image.
- Contoh: docker images
- docker network:
- docker network adalah perintah yang digunakan untuk mengelola jaringan Docker. Jaringan ini memungkinkan kontainer untuk berkomunikasi satu sama lain dengan cara yang terisolasi.
- Bagaimana Cara Kerjanya? Docker menyediakan beberapa jenis jaringan, seperti bridge, host, dan overlay. Perintah ini memungkinkan Anda untuk membuat, melihat, dan menghapus jaringan.
- Contoh: docker network create my_network
Ini akan membuat jaringan baru
- docker expose:
- Memetakan port dalam kontainer ke port di host, membuat kontainer dapat diakses dari luar.
- Contoh: docker run -d -p 8080:80 nginx
- docker exec:
- docker exec digunakan untuk menjalankan perintah di dalam kontainer yang sedang berjalan.
- Bagaimana Cara Kerjanya? Perintah ini memungkinkan Anda untuk memasuki kontainer yang sedang berjalan dan menjalankan perintah tambahan, seperti membuka shell atau menjalankan skrip.
- Contoh: docker exec -it container_id bash
- docker attach:
- docker attach menghubungkan terminal ke sesi yang sedang berjalan di dalam kontainer.
- Bagaimana Cara Kerjanya? Perintah ini memungkinkan Anda untuk mengakses output dari proses yang sedang berjalan di dalam kontainer.
- Contoh Penggunaan: Jika Anda memiliki kontainer yang menjalankan aplikasi yang menampilkan output ke terminal, Anda bisa menghubungkan ke terminal tersebut dengan:
- Contoh: docker attach container_id
- docker volume:
- docker volume digunakan untuk mengelola volume Docker, yang merupakan penyimpanan persisten yang digunakan untuk menyimpan data di luar siklus hidup kontainer.
- Bagaimana Cara Kerjanya? Volume Docker menyimpan data yang dapat diakses oleh kontainer dan tetap ada meskipun kontainer dihentikan atau dihapus.
- Contoh: docker volume create my_volume
- docker logs:
- docker logs menampilkan log dari kontainer yang sedang berjalan.
- Bagaimana Cara Kerjanya? Perintah ini memungkinkan Anda untuk melihat output yang dihasilkan oleh aplikasi di dalam kontainer, termasuk pesan log atau error.
- Contoh: docker logs container_id
- docker inspect:
- docker inspect memberikan detail lengkap tentang konfigurasi dan status dari kontainer atau image.
- Bagaimana Cara Kerjanya? Perintah ini mengeluarkan informasi JSON yang mendetail tentang kontainer atau image, termasuk pengaturan, status, dan konfigurasi.
- Contoh: docker inspect container_id
- Dockerfile:
- Dockerfile adalah file teks yang berisi serangkaian instruksi untuk membangun image Docker.
- Bagaimana Cara Kerjanya? Dockerfile mendefinisikan langkah-langkah untuk membuat image, seperti memilih image dasar, menyalin file, dan mengatur variabel lingkungan.
- Contoh: FROM node:18.20.4-slim
- Push Docker Image to Docker Hub:
- Perintah ini digunakan untuk mengirim image Docker yang telah dibangun ke Docker Hub, registry publik untuk Docker images.
- Bagaimana Cara Kerjanya? Setelah image dibangun, Anda dapat mengirimnya ke Docker Hub untuk dibagikan dengan orang lain atau untuk digunakan di mesin lain.
- Contoh: docker push username/image_name
- docker-compose:
- Docker Compose adalah alat yang digunakan untuk mendefinisikan dan menjalankan aplikasi multi-kontainer dengan menggunakan file konfigurasi YAML.
- Bagaimana Cara Kerjanya? File docker-compose.yml mendefinisikan layanan, jaringan, dan volume yang diperlukan untuk aplikasi. Dengan docker-compose, Anda dapat mengatur beberapa kontainer sebagai satu unit.
- Contoh File docker-compose.yml:
Deployment Aplikasi dengan Docker
Untuk memahami bagaimana Docker digunakan dalam praktik, mari kita lakukan sebuah deployment aplikasi sederhana yang melibatkan tiga kontainer WordPress-NGINX yang dikembangkan oleh Bitnami, sebuah database MariaDB yang terpisah, dan konfigurasi load balancer NGINX dengan SSL.
- Install MariaDB
sebelum kita memulai konfigurasi, kita update terlebih dahulu server kita dengan command
‘’’
apt update && apt upgrade
‘’’
jika sudah kita install mariadb
‘’’
apt install mariadb-server
‘’’
- Konfigurasi MariaDB:
- Setup MariaDB di luar kontainer, pada server terpisah. Ini memastikan bahwa database dapat diakses dari kontainer Docker, tetapi tidak dari luar jaringan Docker.
- Membuat database dan user untuk wordpress
‘’’
sudo mysql -u root
CREATE DATABASE wordpress_db;
CREATE USER ‘wordpress’@’%’ IDENTIFIED BY ‘bayhaqqy123’;
GRANT ALL PRIVILEGES ON wordpress_db.* TO ‘wordpress’@’%’;
FLUSH PRIVILEGES;
‘’’
- Arahakan ip address database ke host
‘’’
vim /etc/mysql/mariadb.conf.d/50-server.cnf
‘’’
arahkan addressnya ke ip host, jika sudah kita restart service mariadbnya
‘’’
systemctl restart mariadb-server
systemctl status mariadb-server
‘’’
- Setup Kontainer WordPress-NGINX:
- Gunakan Docker Compose untuk mendefinisikan tiga layanan WordPress yang masing-masing menggunakan NGINX sebagai web server. Docker Compose akan memungkinkan kita untuk menjalankan dan mengelola ketiga kontainer ini secara bersamaan.
- Konfigurasi Docker Compose
sebelum kita membuat konfigurasi, kita buat folder wordpress terlebih dahulu, jika sudah kita buat docker-compose.yml
‘’’
mkdir wordpress
vim docker-compose.yml
‘’’
kita buat 3 container wordpress dengan mengarahkan port ke 8080 dan 8443, lalu kita masukkan kredensial yang kita buat sebelumnya di database ke konfigurasi kita, untuk hostnya kira arahkan ke ip yang sama di setting address mariadb sebelumnya. jika sudah kita save dengan klik :wq
- Pengujian Container
setelah kita membuat konfigurasi di docker compose, selanjutnya kita coba jalankan docker composenya
‘’’
docker compose up -d
docker compose ps -a
‘’’
jika sudah kita coba buka web browser kita lalu search http://ip_host:8081
nah, container kita sudah running dan bisa terhubung dengan database yang ada di luar container. selanjutnya kita buat loadbalancing
- Load Balancer dengan NGINX:
Load balancing adalah proses mendistribusikan lalu lintas jaringan ke beberapa server secara merata untuk mencegah satu server menjadi terlalu penuh dan kewalahan. Dengan cara ini, beban kerja dibagi secara efisien, sehingga meningkatkan kinerja, keandalan, dan ketersediaan layanan. Jika satu server mengalami gangguan atau tidak berfungsi, load balancer akan mengarahkan lalu lintas ke server lain yang masih berjalan, sehingga layanan tetap tersedia tanpa gangguan. Selain itu, load balancing memungkinkan peningkatan kapasitas dengan menambahkan lebih banyak server ketika permintaan meningkat. Hal ini sangat penting dalam menjaga agar layanan tetap cepat, stabil, dan mampu menangani jumlah pengguna yang besar.
- Konfigurasikan NGINX sebagai load balancer untuk mendistribusikan permintaan ke ketiga kontainer WordPress. Ini akan meningkatkan ketersediaan dan kinerja aplikasi.
‘’’
vim /etc/nginx/sites-available/wordpress-loadbalancer
‘’’
untuk konfigurasi load balancenya seperti diatas, untuk ip severnya kita masukkan ip host kita lalu masukkan juga port expose dockernya, jika sudah klik :wq lalu kita restart nginxnya
‘’’
systemctl restart nginx
systemctl status nginx
‘’’
‘’’
jika sudah mari kita buka web browser lalu klik http://ip_host
nah, semua port dari 8081-8083 sudah terdefinisikan menjadi port HTTP
- SSL dengan OpenSSL:
- Pasang sertifikat SSL menggunakan OpenSSL untuk mengamankan komunikasi antara klien dan server. SSL akan memastikan bahwa semua data yang dikirimkan antara pengguna dan server terenkripsi.
- Buat SSL
‘’’
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
‘’’
- Buat loadbalance HTTPS
‘’’
vim /etc/nginx/sites-available/wordpress-loadbalancer
‘’’
tambahkan konfigurasinya untuk HTTPS, gunakan port yang ada di konfigurasi https pada docker compose, jika sudah kita restart
‘’’
systemctl restart nginx
systemctl status nginx
‘’’
- Pengujian LoadBalance HTTPS
buka web browsernya dan klik https://172.23.1.7
c
nah, load balance untuk httpsnya sudah berhasil
Kesimpulan
Dengan mempelajari dan menerapkan Docker, Anda dapat dengan mudah membangun, mengelola, dan menjalankan aplikasi di lingkungan yang konsisten dan efisien. Docker memberikan fleksibilitas dalam deployment, memungkinkan Anda untuk mengelola aplikasi skala besar dengan efisiensi tinggi. Melalui studi kasus di atas, Anda bisa melihat bagaimana Docker dapat digunakan untuk deployment aplikasi yang nyata, mulai dari pengaturan kontainer hingga konfigurasi load balancer dan keamanan dengan SSL. Dengan pemahaman ini, Anda siap untuk menerapkan Docker dalam proyek Anda sendiri, baik dalam pengembangan maupun produksi.
Tertarik mengikuti training di ID-Networkers? Kami menyediakan berbagai pilihan training yang bisa kamu ikuti, klik disini untuk info lengkapnya.