Back to blog
May 25, 2023
5 min read

Dockerizing a Django Application

Docker explanation and how to containerize your Django app.

Dalam dunia software development, kita pasti telah sering mendengar tentang Docker. Docker merupakan salah satu tools populer yang sering digunakan dalam pengembangan software. Dengan menggunakan Docker, kita dapat meng-containerize aplikasi kita, yang memungkinkan kita untuk menjalankannya secara konsisten di berbagai environment tanpa harus khawatir tentang perbedaan konfigurasi atau dependensi yang tidak kompatibel. Dalam artikel ini, kita akan membahas tentang Docker dan penerapannya pada aplikasi Django.

Understanding Docker and Containers

Docker adalah platform open-source yang memungkinkan kita untuk meng-containerize aplikasi kita dalam container yang terisolasi. Container ini berisi semua dependensi yang diperlukan oleh aplikasi, termasuk sistem operasi, library, dan runtime environment. Dengan Docker, kita dapat memastikan bahwa aplikasi kita berjalan secara konsisten di berbagai environment, mulai dari tahap development di local hingga production.

Advantages

Portability
Docker memungkinkan aplikasi untuk dijalankan dengan konsisten di berbagai environment, termasuk environment development, staging, dan production. Hal ini memungkinkan developer untuk terhindar dari masalah yang disebabkan oleh perbedaan konfigurasi dan dependensi di environment yang berbeda.

Isolation
Setiap container Docker berjalan secara terisolasi, yang berarti bahwa aplikasi dan dependensinya tidak saling mempengaruhi. Ini memastikan bahwa aplikasi yang dijalankan dalam suatu container tidak akan terpengaruh oleh perubahan atau masalah di environment tempat container tersebut.

Replication
Docker memungkinkan replikasi yang mudah dari suatu environment ke environment lainnya. Kita dapat dengan cepat dan mudah membuat salinan identik dari container Docker dengan memanfaatkan Docker image. Docker image adalah template yang berisi semua konfigurasi dan dependensi yang diperlukan untuk menjalankan aplikasi. Image ini dapat disimpan dan dibagikan melalui repositori Docker, seperti Docker Hub atau repositori Docker pribadi.

Disadvantages

Overhead
Aplikasi yang dijalankan dengan menggunakan container tentunya akan mengonsumsi lebih banyak resource dibanding aplikasi yang dijalankan tanpa container. Walaupun, container pada Docker lebih efisien dalam menggunakan resource dibandingkan dengan virtual machine. Namun tetap saja penggunaan Docker dapat menyebabkan overhead tambahan pada resource sistem, terutama jika aplikasi yang dijalankan dalam container Docker memiliki kebutuhan yang tinggi terhadap resource.

Image Size
Docker image bisa memiliki ukuran yang besar, terutama jika dependensi dan komponen yang diperlukan oleh aplikasi cukup banyak. Hal ini dapat mempengaruhi waktu pengunduhan dan penggunaan ruang penyimpanan.

Security
Penggunaan Docker memperkenalkan risiko keamanan tambahan. Jika konfigurasi tidak benar, container Docker dapat menjadi rentan terhadap serangan atau penyalahgunaan. Penting untuk mengadopsi best practice dalam memastikan keamanan dalam penggunaan Docker. Best practice tersebut meliputi mengunduh image dari sumber yang terpercaya, rebuild image secara berkala, dan melakukan vulnerability scanning pada image.

Dockerize Django Application

Bagian ini akan membahas langkah-langkah untuk menerapkan Docker pada project Django. Sebagai contoh, kita memiliki project Django dengan dependencies yang tertulis dalam file requirements.txt. Hal pertama yang kita lakukan untuk menerapkan Docker pada project kita adalah membuat Dockerfile. Dockerfile adalah file yang berisikan instruksi dalam membuat Docker image, termasuk informasi mengenai operating system, languages, environmental variables, file locations, network ports, dan komponen lain yang diperlukan.

FROM python:3  
RUN mkdir /app  
WORKDIR /app  
COPY requirements.txt /app/  
RUN pip install -r requirements.txt  
COPY . /app/

FROM python:3
Baris ini menentukan base image yang akan digunakan untuk membangun image kita. Dalam kasus ini, kita menggunakan image Python versi 3 sebagai base image.

RUN mkdir /app
Baris ini membuat direktori baru bernama /app di dalam container.

WORKDIR /app
Baris ini menetapkan direktori kerja (working directory) untuk container ke /app. Ini berarti semua perintah berikutnya yang dijalankan dalam Dockerfile akan dilakukan di direktori /app.

COPY requirements.txt /app/
Baris ini menyalin file requirements.txt dari direktori lokal (di mana Dockerfile ini berada) ke direktori /app di dalam container.

RUN pip install -r requirements.txt
Baris ini menjalankan perintah pip install di dalam _container_untuk menginstal semua dependensi yang terdaftar dalam file requirements.txt.

COPY . /app/
Baris ini menyalin seluruh isi dari direktori lokal (di mana Dockerfile ini berada) ke direktori /app di dalam container.

Dengan Dockerfile ini, kita dapat membangun image Docker yang siap untuk menjalankan aplikasi Python di dalam container Docker. Image ini akan berisi semua dependensi yang diperlukan oleh aplikasi kita yang terdaftar dalam file requirements.txt dan juga semua file dan direktori yang ada di direktori lokal saat membangun image.

Langkah berikutnya yang harus kita lakukan adalah membuat file docker-compose.yml di root project

version: "3.9"  
services:  
    web:  
        build: .  
        command: python manage.py runserver 0.0.0.0:8000  
        volumes:  
            - .:/app  
        ports:  
            - "8000:8000"

Container sudah siap dijalankan dengan command berikut

docker-compose up -d

Kita sudah berhasil menerapkan Docker pada aplikasi Django kita yang dapat diakses melalui localhost:8000.

Kesimpulan

Docker adalah sebuah platform open-source yang memungkinkan pengembang untuk meng-containerize aplikasi mereka dalam container yang terisolasi. Keuntungan utama Docker adalah portabilitas, isolasi, dan kemampuan untuk replikasi environment. Namun, kekurangan Docker meliputi overhead tambahan pada penggunaan resource sistem, ukuran image yang besar, dan risiko keamanan tambahan. Meskipun demikian, dengan mengikuti praktik terbaik dalam penggunaan Docker, seperti mengunduh image dari sumber yang terpercaya dan melakukan scanning keamanan, manfaat yang diperoleh dari penggunaan Docker dapat melebihi kerugian yang mungkin timbul.