Don’t Give Up on Docker

Siti Aulia Rahmatussyifa
Akhirnya
Published in
6 min readApr 16, 2020

Software Architecture

Arsitektur suatu sistem menggambarkan komponen utamanya, hubungan mereka secara struktur, dan bagaimana mereka berinteraksi satu sama lain. Software architecture mencakup beberapa faktor kontribusi seperti business strategy, quality attributes, human dynamics, design, dan IT environment.

“Software architecture is the process of converting software characteristics such as flexibility, scalability, feasibility, reusability, and security into a structured solution that meets the technical and the business expectations.”

Why?

Untuk mengantisipasi kemungkinan-kemungkinan yang terjadi apabila terdapat perubahan pada masa yang akan datang. Contohnya ketika ingin mengganti bisnis model, secara tidak langsung kita juga harus mengubahnya dari sisi sistem. Hal ini dilakukan untuk mencapai tujuannya sendiri, supaya mampu memenuhi kriteria bisnis model yang baru. Tidak hanya itu, dari sisi user experience pun juga akan mengalami hal yang sama.

Tujuan

Untuk menciptakan suatu jembatan antara kebutuhan bisnis dengan kebutuhan teknis melalui use case yang sudah dibuat, dan menemukan cara bagaimana untuk mengimplementasikan use cases tersebut. Hal ini dapat dipenuhi dengan meminimalisir kemungkinan resiko/kegagalan yang diciptakan oleh para developer.

Implementasi

Karena pada proyek kami menggunakan Django, kami mengikuti arsitektur standar yang ditawarkan oleh Django, yaitu Model-View-Templat (MVT). MVT ini semacam turunan dari MVC, hanya saja di MVT, seluruh kerangka bertindak sebagai controller yang memproses HTTP requests dan mengirimkan melalui url ke view functions yang tepat.

how request is processed in Django
illustration

“Write once, run anywhere”

  • Developers use Docker to eliminate “works on my machine” problems when collaborating on code with co-workers.
  • Operators use Docker to run and manage apps side-by-side in isolated containers to get better compute density.
  • Enterprises use Docker to build agile software delivery pipelines to ship new features faster, more securely and with confidence for both Linux and Windows Server apps

Apa itu Docker?

Docker merupakan sebuah platform yang dibangun berdasarkan teknologi container. Platform ini bisa mempermudah para developer untuk create, deploy, dan run the applications dimana pun layaknya sebuah container. Container ini berguna untuk bundle up aplikasi dengan bagian-bagian yang dibutuhkan, seperti dependencies, libraries, dan service lainnya. Lain dengan virtual machines, container ini tidak membutuhkan overhead yang tinggi ataupun maintenance costs yang besar. Sehingga memungkinkan penggunaan sistem dan sumber daya yang lebih efisien. Container menggunakan 1 shared OS yang membuat container jadi jauh lebih ringan dibanding VM.

Image source: https://neeners.neen.it/docker-servizi-allinterno-di-un-container/

Dari ilustrasi di atas kita dapat membandingkan, Virtual Machines harus meng-install 3 OS tambahan dalam 1 hardware sedangkan container hanya butuh 1.

Alokasi Resource

Pada virtual machine, pengaturan resource-nya ditentukan pada saat instalasi. Tidak fleksibel. Contohnya ada 2 VM, resource V1 tidak dapat digunakan oleh V2 walaupun V1 cuma pake resource sedikit. Lain halnya dengan container, memiliki alokasi resource yang dapat dibagi langsung oleh Host Server itu sendiri. Container akan mengambil alokasi resource yang ada di Hardware sesuai dengan yang container butuhkan.

Jadi, kenapa Docker?

Simplenya gini, Docker dapat membuat developers less confused ketika mereka udah buat aplikasi selama beberapa hari (atau bahkan minggu). Misal di local machine mereka bisa tapi pada saat di deploy tiba-tiba aplikasi itu gabisa jalan. Biasanya kejadian ini terjadi karena ada beberapa dependencies yang harus di install in order to run the application tapi lupa dimasukin ke build.gradle, manifest.xml, atau lupa migrate dan sejenisnya.

Penggunaan Docker idealnya dapat mengirimkan kode dengan lebih cepat, memindahkan kode dengan lancar, standardization of application operations, dan mampu menghemat pengeluaran karena adanya pemanfaatan sumber daya. Tujuan digunakannya Docker adalah membuat aplikasi menjadi portable.

Docker Architecture

Image source: https://nordicapis.com/

Docker dapat dibagi menjadi beberapa elements

  • Docker daemon: bertanggung jawab untuk semua tindakan terkait container dan menerima commands via CLI atau REST API. Docker client mengirimkan API requests ke daemon dan daemon itself actually does all the magic.
  • Docker Client: A Docker client is how users interact with Docker. Client Docker dapat berada di host yang sama dengan daemon atau remote host.
  • Images: Docker image bisa dibilang kaya template, atau yang kita sebut Dockerfile, untuk docker container. Images digunakan untuk menyimpan dan mengirimkan aplikasi.
  • Containers: Encapsulated environments dimana tempat aplikasi dijalankan (the instantiations of images). Sebuah container ditentukan berdasarkan image dan configuration options. At a lower level, kita punya container, yang merupakan core container runtime yang menginisiasi dan mengawasi kinerja container. Docker container ini yang dibuat oleh daemon tadi. Container berjalan diatas image dan setiap perubahan yang disimpan pada container akan menyebabkan terbentuknya layer baru di atas base image.
  • Docker Registries: Docker registry adalah kumpulan docker image yang bersifat public dan private repository. Registries merupakan lokasi dari tempat dimana kita store and download images. Disini kita bisa push image kita sendiri maupun pull image.
# Dockerfile

# FROM directive instructing base image to build upon
FROM python:3.5-slim

RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code
RUN pip install -r requirements.txt
COPY . /code

COPY start.sh /code

CMD ["./start.sh"]

Dockerfile berisi instruksi untuk membuat image, start.sh ini akan mengatur supaya Gunicorn bisa menjalankan proses server untuk sebuah project dan mengatur port mana yang bakal digunakan project itu.

Dalam sebuah image biasanya berisi OS atau aplikasi yang telah di install dan udah jadi. Image ini nanti akan digunakan untuk menjalankan container. Dengan 1 image kita bisa bikin banyak Docker container.

Docker Orchestration

Docker Orchestration ini merupakan proses mengurus lifecycle dari container-container yang ada, yang ada dalam environment yang dinamis. Untuk cara kerja Docker Orchestration pertama kita harus melakukan konfigurasi pada file JSON/YML (tergantung tool yang digunakan). Konfigurasi ini akan mengatur bagian yang membangun koneksi antar docker, mengumpulkan container images, dan besar volume storage yang akan digunakan. Pada saat container sudah berjalan pada host, orchestration akan menjalankan instruksi yang sesuai dengan konfigurasi. Keuntungan dari penggunaan orchestration adalah kita dapat menggunakan dalam environment apapun.

Implementasi

Pada proyek PPL kami, kami menggunakan GitLab sebagai repository dan heroku untuk deployment-nya.

Create Heroku app

Tahap pertama kami mendaftarkan akun dan create the Heroku app di heroku.com

Membuat remote repository di GitLab

Sebelum mulai coding hal yang harus dilakukan adalah membuat proyek baru di GitLab. Khusus pada mata kuliah PPL, remote repository sudah dibuatkan oleh Scrum Master. Sebagai development team, hal yang perlu kami lakukan adalah setup remote repository supaya terhubung dengan device local kita.

Implement code

Setelah setup environment di awal, kami mengembangkan code sesuai dengan pembagian task pada Sprint Planning. Kami menggunakan Django sebagai framework aplikasi kami.

Setting file CI/CD

Karena kami menggunakan GitLab, kami menggunakan GitLab-CI sebagai pipeline CI/CD kami. Untuk memberi instruksi apa yang harus di eksekusi oleh Gitlab CS Runner, diperlukan untuk membuat file .gitlab-ci.yml File ini bertindak sebagai konfigurasi CI/CD. Kami menggunakan 3 stages, yaitu: lint, test (UnitTest dan SonarScanner), dan deploy.

Karena kami menggunakan Django, kami menggunakan python 3.6 sebagai image untuk test stage. Image yang dimaksud mengacu pada Docker image, yang berperan sebagai container dimana code kita akan berjalan di server.

Membuat Procfile

web: gunicorn <project_name>.wsgi

Procfile digunakan untuk memilih production web server yang akan digunakan untuk men-deploy aplikasi kita. Heroku merekomendasikan untuk menggunakan Gunicorn untuk men-deploy aplikasi Django ke Heroku.

Push code ke repository

Setelah mengimplement code yang sudah di push ke GitLab, GitLab Runner akan menjalankan pekerjaan yang telah ditetapkan dalam file .gitlab-ci.yml . Tunggu sampai pipeline selesai. Setelah itu kita dapat memeriksa url aplikasi Heroku untuk memeriksa apakah kode sudah ter-deploy atau belum.

--

--