Di era dimana cloud computing semakin banyak digunakan seperti saat ini, developer dituntut untuk semakin cepat dalam mengembangkan serta mendeploy aplikasi. Aplikasi yang dibuat juga harus konsisten dan portabel untuk semua platform. Dulu, memindahkan aplikasi dari satu lingkungan atau sistem ke lingkungan atau sistem lain yang berbeda berarti “main tebak-tebakan” dependensi dan versi – jalan di komputer lokal, belum tentu jalan di server, jalan di development, belum tentu jalan di production. Ini menimbulkan masalah klasik, “it works on my machine”, yang lama-kelamaan jadi legenda tersendiri di dunia developer.
Nah, dari sinilah konsep containerization muncul sebagai solusi: mengemas seluruh aplikasi, dependensi dan versi, dan environment ke sebuah unit portabel bernama container. Dalam konteks mata kuliah Cloud Services di jurusan Cloud Computing, Computer Science, saya diharuskan mencoba secara praktis konsep containerization ini: “buat website, bungkus dengan Docker, jalankan containernya di host OS dan uji coba juga di OS berbeda.”
Untuk websitenya sendiri, saya menggunakan proyek web bernama GudanginAja (https://github.com/gabrielle-jeco/inventorygudang) yang pernah saya buat sebelumnya. Website ini sendiri berbasis Laravel + Vite yang sebelumnya pernah saya deploy ke Google Cloud Run.
Tujuan saya melaksanakan proyek ini bukan hanya untuk develop sebuah web dan membuatnya berjalan di container, tapi juga untuk memahami keseluruhan workflow dari pengembangan hingga deployment:
- Menggunakan GitHub untuk version control, kolaborasi, dokumentasi, dan otomatisasi (dengan GitHub Actions)
- Mengimplementasikan Dockerfile multi-stage agar container image yang dihasilkan ringan, efisien, dan terpisah antara tahap build dan runtime
- Menguji portabilitas container image dengan cara menjalankannya di dua mesin berbeda dengan OS berbeda, dalam kasus ini Windows (Docker Desktop) dan Linux Ubuntu (Docker Engine)
- Menyimpulkan containerization meningkatkan konsistensi, fleksibilitas, dan portabilitas aplikasi lintas platform
Pertama-tama, saya melakukan fork terhadap repo publik yang berisi template website penyimpanan barang untuk pergudangan. Kemudian saya men-clone repo tersebut ke mesin lokal dengan git clone. Setelah diclone, saya melakukan beberapa perubahan pada kodingan, menambahkan beberapa fitur (QR code scanner, pencatatan dan pengenalan plat nomor kendaraan), dan lainnya. Kemudian, setelah proses koding selesai, saya membuat Dockerfile multi-stage, berisi tiga tahap build:
- Stage 1 – Node Build Menggunakan image node:18-alpine untuk frontend build dengan Vite. Saya menginstall dependensi dari package.json, menjalankan npm ci, dan build aset frontend di tahap ini.
- Stage 2 – Composer Build Menggunakan image composer:2 untuk install dependensi PHP dari composer.json. Ini penting agar layer Composer dan Node terpisah supaya image yang dihasilkan tetap kecil dan modular
- Stage 3 – Production Image Menggunakan image php:8.2-fpm-alpine, dengan Nginx dan Supervisor dikonfigurasi supaya website Laravel bisa jalan dan production ready. Hasil build frontend dan vendor juga disalin, lalu mengekspos port 8080 untuk deployment di Cloud Run
Setelah Dockerfile siap, saya build imagenya dari Dockerfile tersebut dengan bantuan Docker Desktop, lalu saya run di localhost. Website berhasil diakses lewat http://localhost:8080 dengan semua aset berhasil dimuat dengan sempurna. Kemudian image tersebut saya push ke registry, lebih tepatnya menggunakan GHCR, agar memudahkan proses pengujian di mesin lain dengan OS berbeda. Jadi tidak perlu memindahkan seluruh proyek beserta Dockerfilenya dan rebuild image dari awal, karena akan memakan waktu dan kurang efisien.
Lalu di Linux Ubuntu (saya menggunakan VM VirtualBox untuk menjalankannya), saya tinggal login ke GHCR saya, pull imagenya, dan run. Hasilnya website dapat berjalan identik tanpa error, dan yang terpenting tanpa penyesuaian konfigurasi apapun.
Walaupun containerization ini sangat mempermudah pekerjaan developer, praktiknya bukan tanpa tantangan. Beberapa tantangan yang mungkin muncul adalah dalam menyusun Dockerfile untuk pertama kali, butuh trial and error sampai Dockerfile yang valid dan tanpa error bisa dihasilkan dan dibuild. Lalu build time bisa jadi lama di Node stage, karena package frontend cukup banyak, maka dari itu pada Dockerfile yang saya buat, saya menggunakan npm ci (bukan npm install) supaya lebih deterministik dan cepat. Terlepas dari itu semua, jika sudah terbiasa dengan workflow ini, dalam praktiknya seharusnya tidak akan mengalami terlalu banyak masalah – koding, buat Dockerfile, build image, push ke registry, run, pull dari mesin lain jika perlu dan tinggal run.
Dari proyek ini, satu hal yang paling menonjol: containerization menghapus batas antara environment dan runtime development dan produksi. Buktinya, image yang saya build di Windows dapat berjalan secara identik di Ubuntu tanpa melakukan perubahan apapun – sama sekali. Implikasinya adalah, deployment ke platform cloud seperti PaaS atau FaaS, juga akan menghasilkan perilaku yang konsisten, mengatasi masalah klasik “it works on my machine”.
Selain itu, workflow berbasis GitHub Flow dan container registry mempermudah otomatisasi dan kolaborasi, secara semua versi image yang pernah dibuild terdokumentasi rapi, siap dipull dan dirun kapan saja dan dimana saja. Pada akhirnya, proyek GudanginAja ini bukan hanya tentang latihan containerization dengan Docker, tapi juga cerminan nyata dan langsung dari prinsip “build once, runs everywhere”. Dan itulah ini dari cloud-native development yang sesungguhnya.







Top comments (0)