Membangun Aplikasi Menggunakan Docker

By : Wahyu Hidayat 22 September 2022


Ada banyak tantangan yang dihadapi oleh pengembang perangkat lunak dalam membangun aplikasi yang robust, scalable dan maintainable. Masalah yang dihadapi oleh setiap pengembang perangkat lunak salah satunya berkaitan dengan deployment yang seringkali memerlukan konfigurasi yang berbeda antara server yang digunakan untuk development dan server yang digunakan untuk deployment. Misalkan saja ketika developer membangun aplikasi backend di windows, sedangkan OS yang digunakan untuk deployment adalah linux. Bagaimana kita menjamin bahwa aplikasi yang dikembangkan saat fase development akan berjalan lancar saat sudah di deploy ke cloud environment

Salah satu cara untuk menjamin hal tersebut yaitu dengan “membungkus” aplikasi di dalam virtual machine. Namun, penggunaan virtual machine membutuhkan resource yang tidak sedikit karena harus menjalankan semua komponen OS dan melakukan virtualisasi hardware termasuk perangkat lunak yang sebenarnya tidak diperlukan oleh aplikasi kita. Docker menyelesaikan masalah ini dengan cara hanya menjalankan komponen-komponen yang diperlukan oleh aplikasi karena Docker dijalankan dengan cara “menumpang” kernel sistem operasi komputer host dalam proses yang terisolasi.

Gambar kiri dengan menggunakan VM, gambar kanan dengan menggunakan docker

Apa itu Docker?

Docker sendiri sebenarnya merupakan platform untuk mengembangkan aplikasi berbasis kontainer sehingga dapat dijalankan pada semua sistem operasi yang dapat menjalankan docker engine . Pada docker terdapat beberapa istilah yang Anda perlu tahu diantaranya yaitu :

Dockerfile

Dockerfile adalah sebuah file konfigurasi yang berisi langkah-langkah untuk membangun sebuah container. Dockerfile biasanya terdiri dari beberapa layer. Setiap baris perintah pada Dockerfile yang dijalankan akan menjadi layer dan mempunyai identitas tersendiri, yang akhirnya akan digabung menjadi sebuah image

Image

Image merupakan kumpulan dari perubahan file system yang perubahannya urut berdasarkan layer Dockerfile dan disimpan menjadi sebuah file immutable untuk menjalankan sebuah container.

Container

Container adalah unit dari aplikasi yang telah disatukan dengan dependensinya sehingga langsung dapat dijalankan sebagai executable menggunakan docker engine

Perbedaan Docker dan Kubernetes

Docker sendiri merupakan container runtime, sedangkan Kubernetes merupakan container orchestration tool yang fungsinya adalah untuk melakukan manajemen pada banyak container runtime, dan tidak hanya terbatas menggunakan Docker. Kubernetes dapat digunakan untuk men-deploy banyak container sekaligus ke kumpulan komputer host (atau biasa disebut cluster) dan dilengkapi dengan fitur load balancing, auto scale, dan auto healing.

Docker Swarm

Sama halnya dengan Kubernetes, docker swarm juga merupakan salah satu container orchestration tool untuk melakukan management pada banyak container di banyak host, perbedaan keduanya hanya pada fitur tambahan yang ditawarkan, yang mana kubernetes lebih cocok digunakan pada aplikasi kompleks yang membutuhkan monitoring.

Memulai Menggunakan Docker

Percobaan kali ini kita akan membuat aplikasi API simple menggunakan Node JS express yang menampilkan response ‘Hello Docker!’

  1. Instal docker sesuai dengan OS yang Anda gunakan. Petunjuk instalasi dapat anda lihat disini https://docs.docker.com/desktop/
  2. Buatlah satu folder baru dengan nama hello-docker
$ mkdir hello-docker
$ cd hello-docker
  1. Lalu jalankan perintah npm init untuk membuat project node js
$ npm init
  1. Buatlah file baru dengan nama index.js , lalu copy kode javascript dibawah
//to run : node filename.js
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => res.send('Hello Docker!'))
app.listen(port, () => console.log(`listening at http://localhost:${port}`))
  1. Buatlah file baru dengan nama Dockerfile , lalu copy kode dibawah
FROM node:16-alpine
COPY package.json package.json
RUN npm install
COPY . .
CMD node index.js
  1. Lalu jalankan perintah untuk membuat docker image
$ docker build . -t hello-docker
  1. Lalu jalankan docker image yang telah dibuat dengan perintah
$ docker run -p 0.0.0.0:3000:3000 -d hello-docker
  1. Akses aplikasi yang telah anda buat di http://localhost:3000/

Penjelasan Dockerfile :

  • FROM node:16-alpine

menggunakan node js 16 alpine sebagai base image. Salah satu best practice dalam membuat Dockerfile yaitu langsung menggunakan base image aplikasi seperti node, python, golang, mysql, dll dibandingkan dengan menggunakan base image OS seperti ubuntu, debian, dll. Daftar base image dapat Anda eksplorasi lebih jauh di website docker hub

  • COPY package.json package.json

Menyalin file package.json ke dalam image

  • RUN npm install

Menjalankan perintah npm install untuk mengunduh dependensi project

  • COPY . .

Menyalin semua file di folder project ke dalam image

  • CMD node index.js

Menjalankan perintah node index.js untuk menjalankan aplikasi


Jika anda perhatikan diatas, perintah copy dijalankan 2x dan file package.json terpisah, mengapa demikian? Hal ini dikarenakan Docker akan melakukan cache pada setiap layer. Jadi file yang tidak berubah tidak akan dibuild ulang oleh docker sehingga mempercepat waktu build. Dalam hal ini package.json hanya berisi informasi project dan list dependensi, selama tidak ada penambahan dependensi maka perintah docker build tidak akan menjalankan perintah copy package.json dan run npm install sehingga mempercepat proses build karena tidak ada proses unduh dependensi. Dapat anda lihat pada gambar langkah ke-6 terdapat label CACHED pada perintah COPY dan RUN npm install.

Tips : rule of thumb pembuatan Dockerfile dimulai dari dependensi yang paling jarang berubah yang biasanya adalah base image.
Source code dapat Anda unduh disini : https://github.com/wahyudotdev/hello-docker

Do you want your company to grow exponentially?
Contact us now. Consultation provided.