Catatan Kecil tentang Docker : Membuat Proyek Django dengan Docker

Evando Wihalim
7 min readMay 1, 2021
Sumber: https://www.docker.com/sites/default/files/d8/2019-07/horizontal-logo-monochromatic-white.png

Apa itu Docker?

Setiap orang memiliki komputer yang berbeda-beda. Jika kita ingin membuat aplikasi, ada kemungkinan aplikasi kita dapat berjalan di komputer kita namun tidak dapat dijalankan di komputer lain. Untuk memastikan aplikasi kita dapat dijalankan di semua komputer apapun environment-nya, maka kita mungkin membutuhkan docker.

Docker adalah salah satu penyedia layanan containerization. Docker menjadi semacam pembungkus dari aplikasi kita beserta dependencies yang dibutuhkan oleh aplikasi kita untuk berjalan dengan normal. Aplikasi kita akan disimpan dalam bentuk suatu images. Images disini bukanlah gambar melainkan read-only template untuk membuat container yang didalamnya juga berisi aplikasi kita. Container sendiri adalah runnable instance dari image. Singkatnya, kita menjalankan container yang didefinisikan oleh image yang berisi aplikasi kita.

Gambaran docker

Gambar di atas menunjukkan letak docker di antara aplikasi-aplikasi kita dan sistem operasi yang menjalankan aplikasi tersebut. Misalkan kita membuat aplikasi pada sistem operasi windows. Namun kita ingin melakukan deployment di server dengan sistem operasi linux. Tanpa docker, kita harus mengubah berbagai macam hal seperti penyesuaian dependencies bahkan kodenya untuk menyesuaikan environment tempat kita melakukan deploy. Namun dengan adanya docker, semua aplikasi kita beserta dependencies-nya dibungkus ke dalam sebuah container. Hal ini membuat kita dapat menjalankan program kita apapun environment tempat program kita dijalankan.

Docker Containers vs Virtual Machines

Sebenarnya selain docker, kita juga dapat menggunakan virtual machine untuk menjalankan aplikasi kita. Misalkan kita membuat aplikasi berbasis Linux. Kita dapat menggunakan aplikasi tersebut pada Windows asalkan ada virtual machine yang menjalankan OS Linux. Lalu apa bedanya dengan container pada docker?

Virtual Machine (VM) adalah abstraksi hardware yang membuat satu server menjadi banyak server. Misalkan komputer kita berbasis Windows 10, dengan adanya VM kita bisa saja menjalankan Windows 7, Windows 8, dan Linux pada VM tersebut. Sehingga kita seperti memiliki lebih dari satu sistem operasi dalam satu komputer.

Container adalah abstraksi dari layer aplikasi dan dependecies-nya. Jika pada VM benar-benar satu sistem operasi yang dijalankan, pada Container kita menjalankan banyak aplikasi dalam satu mesin. Dengan demikian, container tentu lebih ringan daripada VM sebab VM memiliki keseluruhan sistem operasi sedangkan container hanya memiliki aplikasi dan dependencies yang dibutuhkan.

Container vs VM

Jadi lebih baik menggunakan Container atau VM?

Jawabannya tergantung kebutuhan anda. Jika anda ingin membuat aplikasi secara cepat dan tidak ingin pusing melakukan konfigurasi namun ingin memastikan aplikasi tersebut dapat dijalankan di berbagai macam sistem maka saya sarankan untuk menggunakan container. Namun, jika anda ingin benar-benar melakukan banyak konfigurasi dan tidak peduli akan portability aplikasi maka VM solusinya.

Langkah Menggunakan Docker untuk Windows

Pada tutorial ini, saya akan mencoba membuat docker untuk proyek Django dengan basis data PostgreSQL.

Pertama, bagi pengguna windows, anda dapat melakukan instalasi Docker Desktop yang dapat ditemukan di link ini. Setelah melakukan instalasi, berikut ini adalah tampilan layar utama dari Docker Desktop

Tampilan utama Docker Desktop

Kedua, buat folder baru tempat penyimpanan image dari docker nantinya.

Folder baru

Ketiga, buat suatu file baru bernama “Dockerfile” (tanpa ekstensi apapun) yang diisi dengan beberapa hal berikut ini:

# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
Tampilan isi dari Dockerfile

Ekstra: Berikut ini, saya tampilkan konfigurasi Dockerfile yang kami implementasikan di proyek kami.

Dockerfile pada PPL

Dari gambar di atas, dapat dilihat bahwa kami menggunakan python versi 3.8.3-alpine. Selain itu, di dalam Dockerfile ini, kami menambahkan dependencies yang dibutuhkan oleh proyek kami (lihat bagian run apk update && apk add postgresql-dev, jpeg-dev, dll)

Keempat, buat file requirements.txt. File ini berisi daftar dependencies yang dibutuhkan oleh proyek Django yang kita buat. Untuk sekarang cukup isi file tersebut dengan:

Django>=3.0,<4.0
psycopg2-binary>=2.8
Isi dari requirements.txt

Kelima, buat file “docker-compose.yml”. File ini akan menampung service-service yang dibutuhkan oleh aplikasi kita.

version: "3.9"

services:
db:
image: postgres
volumes:
- ./data/db:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db

Dari konfigurasi di atas, kita memiliki dua service, yakni db yang berisi basis data dan web yang berisi proyek Django kita.

Isi dari docker-compose

Keenam, buat proyek Django

# <nama-project> diisi sesuai nama proyek yang anda inginkan 
# tanda titik di akhir menandakan proyek akan dibuat di folder
# yang berjalan saat itu (Current working directory)
docker-compose run web django-admin startproject <nama-project> .
# Nama proyek yang ingin saya buat adalah djangodocker sehingga saya # harus menjalankan perintah:
docker-compose run web django-admin startproject djangodocker .
Awal pembuatan proyek Django
Proyek Django sudah terbuat
Kondisi folder setelah proyek Django dibuat

Ketujuh, ganti database pada file settings.py di dalam proyek Django dengan konfigurasi ini:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}

Perhatikan bahwa nama database (NAME) sesuai dengan isi dari POSTGRES_DB pada file “docker-compose.yml”, nama user (USER) sesuai dengan isi dari POSTGRES_USER pada file “docker-compose.yml”, dan hal ini juga berlaku pada password database.

Penggantian konfigurasi database pada settings.py

Terakhir, jalankan perintah berikut untuk membuat ulang dan menjalankan proyek Django.

docker-compose up -d --build

Kemudian coba buka localhost:8000. Perhatikan bahwa port 8000 sama dengan konfigurasi services bagian web.ports pada file “docker-compose.yml”.

Tampilan proyek Django yang sudah berjalan

Membuat App Baru

Jika anda ingin membuat aplikasi baru di dalam proyek Django, gunakan perintah:

# Ganti <nama-app> sesuai dengan nama aplikasi yang anda inginkan
docker-compose run web python manage.py startapp <nama-app>
Membuat app baru dalam project
Kondisi setelah membuat app baru

Kemudian, tambahkan url di file urls.py pada folder proyek

Penambahan url untuk aplikasi cobaapp

Tambahkan app ke dalam INSTALLED_APPS di settings.py

Penambahan cobapp

Kemudian ubah views.py di dalam folder app menjadi seperti ini:

Penambahan fungsi dalam view

Lalu, tambahkan file url di dalam folder app

Penambahan file url di dalam folder cobaapp

Kemudian, tambahkan folder templates dan buat file html di dalamnya.

Pembuatan folder templates dan file html baru

Kemudian jalankan ulang docker-compose up -d — build

Membuat dan jalankan ulang docker

Lalu coba jalankan kembali localhost:8000/coba di browser

Tampilan localhost

Selamat anda telah berhasil membuat proyek Django di atas docker.

Menghentikan Docker

Untuk menghentikan docker yang sedang berjalan, anda dapat menggunakan perintah:

# opsi -v digunakan untuk menghapus volume database
docker-compose down -v
Docker telah berhenti

Extras

Konfigurasi docker-compose di atas belum mengumpulkan file static. Hal ini mungkin dapat menyebabkan file static anda (seperti css) tidak dapat dimuat oleh Django. Selain itu, jika menggunakan models maka pasti butuh migrasi untuk menjadikannya table. Oleh sebab itu kita harus membuat script baru yang satu level dengan file manage.py. Script baru ini saya namakan deployment.sh

#!/bin/bash
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic — no-input
python manage.py runserver 0.0.0.0:8000
Membuat script baru yang satu level dengan file manage.py

Kemudian ubah file “docker-compose.yml” bagian services web command. Awalnya command hanya berisi :

python manage.py runserver 0.0.0.0:8000

Kita harus menggantinya menjadi perintah seperti di bawah ini sehingga docker-compose menjalankan script yang baru saja kita buat.

bash deployment.sh
Mengganti services.web.command menjadi bash script

Kemudian jalankan ulang docker-compose up -d — build

Demikian catatan kecil saya mengenai docker, semoga catatan ini dapat membantu anda untuk memulai proyek Django dengan Docker.

Referensi:

  1. https://www.docker.com/resources/what-container
  2. https://docs.docker.com/samples/django/#define-the-project-components
  3. https://docs.docker.com/get-started/overview/

--

--