Docker memungkinkan Anda untuk mengemas aplikasi Anda dengan cara yang menyederhanakan kolaborasi dan penerapan. Tetapi jika Anda baru mengenal Docker dan bertanya-tanya bagaimana cara membuat wadah Django Docker untuk aplikasi web Anda, Anda siap menerimanya!
Dalam tutorial ini, Anda akan belajar menjadi master Anda sendiri dalam membangun image dan wadah Docker untuk aplikasi Django Anda.
Bersiaplah dan mulai kemas!
Prasyarat
Tutorial ini akan menjadi demonstrasi langsung. Jika Anda ingin mengikuti, pastikan Anda memiliki yang berikut:
- Docker dan Docker Compose diinstal.
- Mesin Linux – Tutorial ini menggunakan Ubuntu 20.04.3 LTS.
- Python terinstal – Tutorial ini menggunakan Python 3.8.12.
Membuat API Django dan Menghubungkan ke PostgreSQL
Sebelum membuat wadah aplikasi Django Docker, Anda memerlukan aplikasi untuk wadah terlebih dahulu. Anda akan membangun API resep dan menghubungkannya ke PostgreSQL, yang datang dengan Django secara default.
Tetapi pertama-tama, Anda harus menginstal kerangka kerja Django dan Django REST pada mesin lokal Anda. Kerangka kerja Django REST penting untuk membangun API di Django.
1. Buka terminal Anda dan jalankan pip
perintah di bawah ini untuk menginstal django
dan djangorestframework
pada mesin lokal Anda.
pip install django djangorestframework
2. Selanjutnya, jalankan perintah berikut untuk membuat direktori bernama ~/django_recipe_api dan arahkan ke direktori itu. Direktori ini akan berisi semua file yang diperlukan untuk proyek ini.
mkdir ~/django_recipe_api
cd ~/django_recipe_api
3. Jalankan perintah berikut untuk membuat proyek Django baru (recipe_api
) dan aplikasi (recipe
) di direktori saat ini tempat API akan hidup.
# Create a new Django project named "recipe_api" in the current directory.
django-admin startproject recipe_api .
# Create an app named "recipe" in the current directory where the API will live.
python manage.py startapp recipe
4. Sekarang buka ~/django_recipe_api/recipe_api/settings.py file di editor teks pilihan Anda, dan tambahkan kode berikut.
Kode di bawah ini menambahkan rest_framework
ke aplikasi (resep) yang Anda buat sebelumnya (langkah ketiga).
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework' # for Django REST Framework to work
'recipe', # newly created app
]
5. Buka ~/django_recipe_api/recipe/models.py file dan paste kode di bawah ini.
Kode di bawah ini memulai bidang dan jenis data yang akan Anda simpan dalam database.
from django.db import models
class Recipe(models.Model):
"""Recipe object"""
title = models.CharField(max_length=255)
time_minutes = models.IntegerField()
ingredients = models.CharField(max_length=255)
# display an instance of the model when necessary
def __str__(self):
return self.title
6. Buat file lain bernama ~/django_recipe_api/recipe/serializers.py dan isi file dengan kode di bawah ini.
Kode di bawah ini membuat serializer untuk model yang Anda buat sebelumnya (langkah lima). Serializer membantu mengonversi data dari API ke dalam bentuk, seperti JSON, yang dapat digunakan di frontend.
from dataclasses import fields
from rest_framework import serializers
from .models import Recipe
# create a serializer
class RecipeSerializer(serializers.Serializer):
# initialize model and fields you want to serialize
class Meta:
model = Recipe
fields = ('title', 'time_minutes', 'ingredients')
7. Sekarang buat file bernama ~/django_recipe_api/recipe/views.py dan rekatkan kode di bawah ini.
Kode di bawah ini membuat viewset untuk mengembalikan data dari API ke frontend dan menangani permintaan GET dari pengguna.
from rest_framework import viewsets
from .serializers import RecipeSerializer #impor the serializer we just created
from .models import Recipe
class recipe_view_set(viewsets.ModelViewSet):
# define queryset
queryset = Recipe.objects.all()
serializer_class = RecipeSerializer
8. Terakhir, buka file di jalur ~/django_recipe_api/recipe_api/urls.py dan ganti kode pada file tersebut dengan kode dibawah ini.
Dalam kode di bawah ini, Anda sedang menyetel URL sehingga Django REST Framework dapat terhubung ke aplikasi Anda dengan benar. Anda juga menyatakan rute yang akan digunakan saat mengakses API di browser.
from django.contrib import admin
from django.urls import path, include
from recipe.views import recipe_view_set
from rest_framework import routers
# define the router
router = routers.DefaultRouter()
router.register(r'recipe', recipe_view_set) #the route tha will be used to access your API on the browser
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
path('api-auth/', include('rest_framework.urls')) # Adds 'Login' link in the top right of the page
]
Membuat Dockerfile untuk Membangun API Django
Saat ini, Anda hanya memiliki API Django yang tidak ditampung dengan cara apa pun. Menampung aplikasi Anda memudahkan kolaborasi dan penerapan jika diperlukan.
Buat file bernama Dockerfile di root proyek Anda dan isi file dengan kode di bawah ini. Sebuah Dockerfile berisi daftar instruksi yang digunakan Docker untuk membangun image Docker Anda.
Kode di bawah ini membuat direktori di penampung Anda dan menyalin kode di mesin lokal Anda ke dalam penampung.
# The image you are going to inherit your Dockerfile from
FROM python:3.7-alpine
# Necessary, so Docker doesn't buffer the output and that you can see the output
# of your application (e.g., Django logs) in real-time.
ENV PYTHONUNBUFFERED 1
# Make a directory in your Docker image, which you can use to store your source code
RUN mkdir /django_recipe_api
# Set the /django_recipe_api directory as the working directory
WORKDIR /django_recipe_api
# Copies from your local machine's current directory to the django_recipe_api folder
# in the Docker image
COPY . .
# Copy the requirements.txt file adjacent to the Dockerfile
# to your Docker image
COPY ./requirements.txt /requirements.txt
# Install the requirements.txt file in Docker image
RUN pip install -r /requirements.txt
# Create a user that can run your container
RUN adduser -D user
USER user
Sekarang, buat requirements.txt file di root proyek Anda dan masukkan teks di bawah ini.
Di bawah ini adalah daftar dependensi yang diperlukan untuk menjalankan proyek Anda.
django==3.1.2
djangorestframework==3.13.1
Membangun Berkas Tulis Docker untuk Menjalankan Django dan PostgreSQL
Anda baru saja membangun image Docker aplikasi Anda, tetapi bagaimana Anda menjalankannya? Docker-compose adalah alat yang digunakan untuk menjalankan image Docker dari mesin lokal. Docker-compose membantu Anda mengelola berbagai layanan dalam aplikasi Anda, seperti Django dan database.
1. Buat file bernama docker-compose.yml di root proyek Anda dan rekatkan kode di bawah ini.
Kode di bawah ini memetakan port dari mesin lokal Anda ke port gambar Anda dan menjalankan aplikasi Anda.
# Verion of docker-compose to use
version: "3"
services:
django_recipe_api:
build:
context: . #Sets the directory for docker-compose to build.
# Maps port on the local machine to port on Docker image
ports:
- "8000:8000"
volumes:
# Copy changes made to the project to your image in real-time.
- .:/django_recipe_api
# Handles the command used to run the project in the Docker container.
command: sh -c "python manage.py runserver 0.0.0.0:8000"
2. Selanjutnya, buka settings.py your Anda file dan tambahkan 0.0.0.0
sebagai nilai ALLOWED_HOSTS
karena Docker berjalan di host (0.0.0.0). ALLOWS_HOSTS
variabel menyimpan daftar domain/host yang dapat mengakses aplikasi Anda.
ALLOWED_HOSTS = ['0.0.0.0']
3. Jalankan perintah berikut untuk menghasilkan database untuk model API Anda.
# Generates the SQL code for yuou models.
sudo docker-compose run django_recipe_api sh -c "python manage.py makemigrations"
# Runs the SQL commands that you generated.
sudo docker-compose run django_recipe_api sh -c "python manage.py migrate"
4. Sekarang, jalankan setiap perintah di bawah ini untuk membangun dan menjalankan wadah Django Anda.
sudo docker-compose build # Build your Service
sudo docker-compose up # Runs your application
5. Terakhir, buka browser web pilihan Anda dan navigasikan ke http://0.0.0.0:8000/recipe/ untuk menjalankan API Anda.
Seperti yang Anda lihat di bawah, API Anda berjalan dengan sempurna, yang memungkinkan Anda menambahkan resep.

Mengonfigurasi PostgreSQL ke W ork dengan Docker dan Django
Anda sedang bekerja dengan SQLite sebagai database saat ini, yang tidak ideal saat Anda ingin menskalakan aplikasi Anda. Opsi yang lebih baik yang terhubung baik dengan Django adalah PostgreSQL, yang akan Anda tambahkan ke aplikasi Anda.
Untuk mengonfigurasi PostgreSQL agar bekerja dengan Docker dan Django:
1. Buka Dockerfile your Anda dan tambahkan kode di bawah ini di atas RUN pip install -r /requirements.txt
garis. Dependensi ini diperlukan agar PostgreSQL bekerja dengan baik dengan Django.
RUN apk add --update postgresql-client jpeg-dev
RUN apk add --update --virtual .tmp-build-deps \
gcc libc-dev linux-headers postgresql-dev musl-dev zlib zlib-dev
2. Selanjutnya, buka requirements.txt file dan tambahkan psycopg2==2.8.6
persyaratan.
3. Jalankan kembali perintah di bawah ini untuk membuat gambar lagi.
docker-compose build
4. Buka settings.py your Anda file, dan ganti DATABASES
blok dengan kode berikut.
Kode di bawah ini memperbarui basis data Anda di Django untuk menggunakan PostgreSQL.
os
modul digunakan dalam kode di bawah ini, jadi Anda harus menambahkan import os
di bagian atas ~/django_recipe_api/recipe_api/settings.py Anda konten file.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': os.environ.get('DB_HOST'),
'NAME': os.environ.get('DB_NAME'),
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASS'),
}
}
5. Buka docker-compose.yml file dan ganti konten file dengan kode di bawah ini.
Kode di bawah ini membuat layanan untuk basis data yang Anda buat (langkah empat) dan mengumpankan kredensial basis data ke Django.
# Verion of docker-compose to use
version: "3"
services:
django_recipe_api:
build:
context: . # Sets the directory for docker-compose to build.
# Maps port on the local machine to port on Docker image
ports:
- "8000:8000"
volumes:
# Copy changes made to the project to your image in real-time.
- .:/django_recipe_api
# Handles the command used to run the project in the Docker container.
command: sh -c "python manage.py runserver 0.0.0.0:8000"
environment:
# The environment variable credetials that is needed
# in the settings for Postgres.
- DB_HOST=db
- DB_NAME=recipe
- DB_USER=postgres
- DB_PASS=supersecretpassword
depends_on:
- db
db:
image: postgres:10-alpine
environment:
# credentials required by postgres:10-alpine
- POSTGRES_DB=recipe
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=supersecretpassword
6. Jalankan perintah berikut untuk menerapkan migrasi untuk database baru yang Anda buat (langkah lima).
sudo docker-compose build
sudo docker-compose run django_recipe_api sh -c "python manage.py makemigrations"
sudo docker-compose run django_recipe_api sh -c "python manage.py migrate"
7. Sekarang, jalankan perintah berikut untuk menjalankan aplikasi Django Anda di wadah Docker.
sudo docker-compose up

8. Terakhir, navigasikan ke http://0.0.0.0:8000/recipe/ di browser Anda lagi.
Seperti yang Anda lihat di bawah, data yang disimpan sebelumnya tidak ada lagi karena Anda telah mengubah database Anda. Sekarang Anda dapat melanjutkan dan menambahkan lebih banyak data jika Anda mau.

Kesimpulan
Dalam tutorial ini, Anda belajar menyiapkan wadah Docker untuk Django API yang menggunakan PostgreSQL untuk menyimpan data. Anda juga telah melalui peluncuran kontainer Django menggunakan Dockerfile dan docker-compose.yml file.
Pada titik ini, Anda telah menguasai dasar-dasar menjalankan aplikasi dalam wadah Docker. Jadi, aplikasi lain apa yang ingin Anda jalankan di wadah Docker? Mungkin wadah Docker untuk wadah Django dan MongoDB?