Docker Orchestration: A Not-Really Simple Guide with Django

Ihwan Edi Saputro
Akhirnya
Published in
5 min readMay 13, 2020

Mari Hindari Masalah “It Works on My Machine”

Source: https://realpython.com/django-development-with-docker-compose-and-machine/

Penulis mendapat tugas untuk menulis sebuah artikel, dan tema artikel kali ini adalah Docker Orchestration, atau disingkat dengan DO (bukan Drop-Out). Istilah yang mungkin cukup asing bagi mereka yang belum terjun langsung ke dunia korporasi IT ini sejatinya adalah sebuah konsep yang sangat bermanfaat terutama dalam membangun sebuah Software yang kompleks.

Oke, jadi, Docker Orchestration itu apa?

Docker Orchestration?

Sebelumnya, selain Docker, kita juga akan membahas tentang Container. Jika kita sering menghadapi masalah “It works on my machine”, yang mana program berjalan lancar di device kita tapi tidak di device client atau orang lain, maka Container, yang mampu membuat Developer mengisolasi app mereka dari environmentnya, dapat mengatasi masalah ini. Mengapa bisa? Karena Container menampung semua requirements/environment yang dibutuhkan oleh program agar siapapun yang menjalankannya di manapun, terlepas dari environment tempat orang tersebut menjalankan program itu, dapat dipastikan berjalan dengan baik sebagaimana program itu berjalan di sisi sang Developer.

Docker adalah salah satu platform yang dibangun dengan dasar teknologi container, akan tetapi container tidak hanya Docker saja, ada juga Tectonic, Open Shift Container Platform, Rancher, dan sebagainya. Docker memiliki beberapa fungsi, diantaranya:

#1. Membuat Aplikasi Dapat Digunakan di Mana Saja dengan Output yang Sama

Ini fungsi utama Docker/Container, memastikan sistem bekerja di manapun. Dengan membungkusnya ke Container dan membiarkan rekan atau klien menggunakannya, output yang dihasilkan akan sama, terlepas dari environment yang berbeda dengan yang kita miliki.

#2. Konfigurasinya Semakin Sederhana

Adanya Docker/Container ini membuat kita bebas dalam menjalankan berbagai aplikasi dalam beberapa IaaS/PaaS dengan tidak menggunakan tweak tambahan. Penyedia layanan Iaas/PaaS yang ada di Amazon sampai Google telah mendukung berbagai penggunaan Docker.

#3. Penyebarannya Cepat

Dengan Docker/Container ini, membangun aplikasi dapat mempersingkat waktu, tidak perlu berlarut-larut dalam hal sumber daya hardware atau sejenisnya. Hal ini juga bisa memberikan kepastian kepada klien akan hasil yang sesuai dengan keinginan mereka.

Cara Menggunakan Docker: Studi Kasus Django

Karena penulis dalam Proyek Perangkat Lunak-nya menggunakan Django, berikut penulis jabarkan cara menggunakan Docker dalam Django. Perlu diingat bahwa sebelum menjalankan tutorial ini, anda harus install Compose.

Define the project components

Kita perlu membuat Dockerfile, sebuah Python dependencies file, dan sebuah docker-compose.yml file (Boleh pilih antara .yml atau .yaml extension untuk file ini)

#1. Buat direktori projek kosong

Boleh dinamai apa saja terserah Anda. Direktori ini adalah konteks dari application image Anda, dan hanya boleh mengandung resources untuk membangun image tersebut

#2. Buat file baru bernama Dockerfile di projek tadi.

#3. Tambahkan syntax berikut di Dockerfile tadi.

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

#4. Save dan close Dockerfile.

#5. Buat requirements.txt di direktori projek tadi.

File ini digunakan oleh command RUN pip install -r requirements.txt di Dockerfile.

#6. Tambahkan required software berikut.

Django>=2.0,<3.0
psycopg2>=2.7,<3.0

#7. Save dan close file requirements.txt.

#8. Buat file docker-compose.yml di direktori projek #1.

File itu menjelaskan service yang membuat app Anda. Contoh di sini adalah web server dan database.

#9. Tambahkan konfigurasi berikut di file #8.

version: '3'

services:
db:
image: postgres
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

#10. Save dan close file docker-compose.yml tadi.

Create a Django Project

Di tahap ini Anda membuat Django starter project dengan membuild image dari build context yang didefinisikan di prosedur sebelumnya

#1. Ganti root dari direktori projek.

#2. Buat Django project dengan menjalankan docker-compose run berikut.

sudo docker-compose run web django-admin startproject composeexample .

#3. Setelah docker-compose selesai, list konten dari projek Anda.

$ ls -l
drwxr-xr-x 2 root root composeexample
-rw-rw-r-- 1 user user docker-compose.yml
-rw-rw-r-- 1 user user Dockerfile
-rwxr-xr-x 1 root root manage.py
-rw-rw-r-- 1 user user requirements.txt

Atau bisa juga dengan command dir

Connect the database

#1. Di direktori projek tadi, edit file composeexample/settings.py.

#2. Ganti DATABASES = … dengan kode berikut.

# setting.py

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

#3. Save dan close file tersebut.

#4. Jalankan command docker-compose up dari top level direktori untuk projek anda.

$ docker-compose up
djangosample_db_1 is up-to-date
Creating djangosample_web_1 ...
Creating djangosample_web_1 ... done
Attaching to djangosample_db_1, djangosample_web_1
db_1 | The files belonging to this database system will be owned by user "postgres".
db_1 | This user must also own the server process.
db_1 |
db_1 | The database cluster will be initialized with locale "en_US.utf8".
db_1 | The default database encoding has accordingly been set to "UTF8".
db_1 | The default text search configuration will be set to "english".

. . .

web_1 | May 30, 2017 - 21:44:49
web_1 | Django version 1.11.1, using settings 'composeexample.settings'
web_1 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C.

Bisa dicek dengan link http://localhost:8000. Selain itu, catatan untuk Windows 10, anda mungkin perlu mengedit ALLOWED_HOSTS di settings.py dan tambahkan Docker host name atau IP Address anda ke list. Contoh untuk demo ini, walau tidak aman untuk hal produksi, adalah sebagai berikut.

ALLOWED_HOSTS = ['*']

#5. List running containers

Di terminal window lain, list proses Docker yang sedang berjalan dengan command docker container ls

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
def85eff5f51 django_web "python3 manage.py..." 10 minutes ago Up 9 minutes 0.0.0.0:8000->8000/tcp django_web_1
678ce61c79cc postgres "docker-entrypoint..." 20 minutes ago Up 9 minutes 5432/tcp django_db_1

#6. Shut down service dan bersihkan dengan beberapa method ini.

a. Di shell/terminal yang sama dengan yang anda mulai, tekan Ctrl-C

Gracefully stopping... (press Ctrl+C again to force)
Killing test_web_1 ... done
Killing test_db_1 ... done

b. Untuk solusi lebih elegan, pindah shell/terminal, dan jalankan docker-compose down dari top level dari direktori projek anda

vmb at mymachine in ~/sandbox/django
$ docker-compose down
Stopping django_web_1 ... done
Stopping django_db_1 ... done
Removing django_web_1 ... done
Removing django_web_run_1 ... done
Removing django_db_1 ... done
Removing network django_default

Setelah anda melakukan shut down app tersebut, anda bisa secara aman menghapus Django project directory tadi (contohnya, rm -rf django).

Kesimpulan

Untuk developer pemula seperti penulis, konsep Docker/Container memang terlihat sulit dipahami. Akan tetapi, ketika kita menguasai dan selalu menggunakan Container untuk development, maka salah satu problem paling menjengkelkan bagi para developer yaitu “It works on my machine” dapat diminimalisir hingga sekecil mungkin.

Referensi

Untuk info tutorial lebih lanjut serta manfaat Docker/Container lebih luas, berikut penulis jabarkan referensi yang penulis gunakan. Semoga bermanfaat!

--

--