Kamis, 07 November 2019

Docker phyton dg aplikasi django

Python, Django, dan MariaDB dalam Docker

Artikel ini sebagai catatan saya bagaimana memulai lingkungan kerja Python dengan framework Django yang menggunakan database MariaDB dengan memanfaatkan Docker sebagai kontainer program.
Sampai sini, jika pembaca ingin mengetahui lebih jauh tentang istilah-istilah aneh diatas, ada baiknya untuk meluangkan waktu mempelajarinya terlebih dahulu 🙂 Saat penulisan artikel ini, saya menggunakan sistem operasi Fedora 27, mungkin terdapat perbedaan perintah apabila pembaca menggunakan sistem operasi yang berbeda.
Salah satu kelebihan menggunakan docker ialah lingkungan kerja (work environment) akan terisolasi secara aman dan nyaman dalam image docker dan bersifat mandiri (self-sufficient), kita tidak perlu untuk melakukan instalasi paket dependensi apapun selain docker dan docker-compose (dan mungkin beberapa dependensinya) pada sistem utama yang dipakai.
Pada Fedora dapat menggunakan perintah dnf install :
$ sudo dnf install docker docker-compose
Lalu pastikan service docker telah berjalan pada sistem.

Persiapan

Sebelum melakukan hal hal yang rumit, ada baiknya membuat direktori baru. Lalu buat setidaknya 3 file dengan nama requirements.txtDockerfile, dan docker-compose.yml.

requirements.txt

File requirements.txt berisi paket paket yang dapat diinstall menggunakan python pip, sehingga isi dari file tersebut ialah
django==2.0.6
mysqlclient
Versi django dapat disesuaikan dengan mengubah angka 2.0.6 menjadi sesuai keinginan (misal 1.11 jika ingin memasang versi LTS-nya). Paket mysqlclient digunakan sebagai driver-connector antara django dengan mariadb. Selain kedua paket tersebut, tentu saja masih bisa ditambah paket paket lain sesuai keinginan dan kebutuhan, yaitu dengan cara menambahkan nama paket yang diinginkan di baris baru (misal ingin menggunakan django rest framework untuk server API, tinggal menambahkan nama paket djangorestframework di baris baru setelah mysqlclient.

Dockerfile

Dockerfile merupakan file konfigurasi untuk build image docker. Isi dari file tersebut ialah :
# base image
FROM python:3.6

# set environment untuk logging output python
# sehingga dapat menampilkan output tanpa delay buffer
ENV PYTHONBUFFERED 1

# membuat workdir di container
# copy isi direktori kedalam workdir
RUN mkdir /app
WORKDIR /app
ADD . /app

# install paket yang dibutuhkan
RUN pip install --trusted-host pypi.python.org -r requirements.txt
teks setelah tanda pagar ( # ) merupakan komentar, jadi tidak akan dihiraukan oleh docker saat membaca file konfigurasi ini.
Untuk membuat image docker yang baik, sebaiknya tidak terlalu banyak memasukkan yang tidak dibutuhkan, sehingga ukuran image docker dapat diminimalisir sekecil mungkin. Pada konfigurasi diatas, saya menggunakan base image python 3.6 yang sebenarnya masih terlalu besar (hasil akhir setelah build, ukuran image mencapai 900+ MB). Saya sudah mencoba menggunakan base image yang lebih ringan yaitu python:3.6-slim atau python:3.6-alpine tetapi ternyata mengakibatkan paket mysqlclient tidak dapat diinstal karena kurangnya dependensi. Saya akan usahakan update artikel ini jika menemukan solusi yang lebih baik 🙂

docker-compose.yml

File ini juga merupakan file konfigurasi docker. Bedanya, jika Dockerfile mengkonfigurasi image docker, docker-compose mengkonfigurasi service dari container docker (singkatnya container adalah image yang telah dieksekusi dan berjalan sebagai program). Isi dari file ini yakni :
version: '3'

services:
  db:
    image: mariadb
    restart: always
    command: ['--character-set-server=utf8', '--collation-server=utf8_unicode_ci']
    environment:
      MYSQL_DATABASE: "docker"
      MYSQL_USER: "docker"
      MYSQL_PASSWORD: "docker"
      MYSQL_ROOT_PASSWORD: "docker-root"

  web:
    build: .
    command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    container_name: dmd_web
    restart: always
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
Image mariadb telah disediakan pada server cloud, sehingga kita tinggal mengunduhnya dan menjalankannya. nama database, user, dan password dapat diubah sesuai keinginan dengan mengubahnya pada variabel environment.

Inisialisasi Projek Django

Pada direktori yang telah dipersiapkan sebelumnya, jalankan perintah berikut untuk membuat image docker sekaligus mempersiapkan file django
docker-compose run web django-admin.py startproject dmd .
Ubah dmd sesuai nama projek yang diinginkan. Perintah tersebut akan menghasilkan file django pada direktori saat ini.
Pada sistem dengan SELinux yang diaktifkan (seperti Fedora, Centos, dan keluarganya), perintah tersebut akan gagal karena ditolak oleh SELinux saat docker berusaha menuliskan data pada volumes. Solusinya ialah dengan menambahkan rule SELinux dengan perintah
chcon -Rt svirt_sandbox_file_t /path/to/directory
ubah /path/to/directory sesuai dengan lokasi direktori, lalu jalankan perintah docker-compose run sebelumnya jika file django masih belum dibuat pada direktori.
Setelah berhasil menjalankan perintah docker-compose run… pada direktori saat ini akan terdapat file django (manage.py dan satu folder sesuai nama projek)
tetapi jika diperhatikan lebih detail, file dan folder django tersebut memiliki user dan group root, sehingga harus diubah sesuai dengan user dan group kita sendiri.
sudo chown -R $USER:$USER .

Django dan MariaDB

Pada bagian databases, secara default django menggunakan sqlite. Untuk menggunakan mariadb, dibutuhkan untuk mengubah file settings.py pada folder projek yang baru dibuat oleh django sebelumnya. berikut konfigurasi database yang saya gunakan pada file settings.py :
DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'docker',
    'USER': 'docker',
    'PASSWORD': 'docker',
    'DEFAULT-CHARACTER-SET': 'utf8',
    'HOST': 'db',
    'PORT': 3306,
  }
}
Konfigurasi nama, user dan password database disesuaikan dengan konfigurasi yang ditulis pada docker-compose.yml.

Menjalankan Projek

Setelah menjalani proses dan konfigurasi yang cukup panjang jika dituliskan tersebut, kini saatnya untuk mencoba untuk menjalankan projek django-mariadb dalam docker kita. Caranya ialah dengan menjalankan perintah berikut :
docker-compose up
tunggu beberapa saat, lalu buka browser, dan kunjungi localhost:8000
Jika benar, seharusnya sudah dapat terlihat halaman khas django setelah diinstal 🙂
Untuk menambahkan superuser agar dapat login ke halaman admin django (localhost:8000/admin) dapat menggunakan perintah berikut (jalankan pada terminal lain, biarkan terminal yang menjalankan perintah docker-compose up tetap berjalan) :

docker-compose exec web python manage.py createsuperuser

Menghentikan projek

Untuk menghentikan jalannya projek, bisa dilakukan dengan menekan CTRL-C pada terminal yang menjalankan docker-compose up. Atau menggunakan perintah berikut pada terminal lain
docker-compose stop
perintah tersebut akan menyebabkan service berhenti, tetapi tidak hilang. Untuk menjalankan kembali, gunakan perintah
docker-compose start
Sedangkan untuk menghapus service program dapat menggunakan perintah
docker-compose down

GitHub

Tidak ada komentar:

Posting Komentar