Deploy ứng dụng Django cùng với Nginx và Mysql bằng Docker

Hãy tưởng tưởng, bạn đang sử dụng một con ubuntu được cài đặt python 2.x và những phiên bản python3.x việc chuyển đổi giữa các phiên bản với nhau trong quá trình deploy 1 hoặc nhiều ứng dụng django sẽ rất mất thời gian và dễ bị nhầm lẫn. Do đó, việc ảo hoá sử dụng container được sử dụng khá phổ biến hiện nay. Vì vậy trong bài viết này, tôi sẽ hướng dẫn các bạn cách deploy một ứng dụng django, mysql lên nginx bằng docker.

Chuẩn bị các công cụ phát triển:

  • Docker 20.10
  • docker-compose 1.27.4
  • git 2.25

Nếu bạn chưa cài đặt Docker và docker-compose

MacOS

Cài đặt Docker từ website chính thức.

Docker Desktop cho Mac

Window

Docker Destop dành cho Window

Clone Dockerfile repository từ github

Dockerfile dành cho việc phát triển Django có sẵn trên github

https://github.com/E-handson/docker-django

Các bước thực hiện

Đầu tiền mở terminal trên máy tính và thực thi dòng lệnh sau

$ git clone https://github.com/E-handson/docker-django.git

Sau khi clone về hoàn tất, một thư mục có tên “docker-django” sẽ được tạo.

Thực tiếp dòng lệnh sau:

$ cd docker-django

Bạn hãy tìm file có tên “docker-compose.yml” bên trong thư mục “docker-django”. Lệnh “docker-compose” có thể được thực hiện ngay lập tức bên trong thư mục, nơi mà tồn tại file “docker-compose.yml”.

Chạy Docker

Đầu tiên, chúng ta cần thực thi lệnh sau để dựng lên một con docker service

$ docker-compose build

Tiếp theo, gõ lệnh bên dưới để khởi động docker

$ docker-compose up

Để thấy được Docker nào đang chạy, gõ tiếp lệnh như sau.

$ docker-compose ps
       Name                   Command                   State            Ports
---------------------------------------------------------------------------------------------
docker-django_app_1     uwsgi --socket :8001 --mod ...    Up         8001/tcp
docker-django_db_1      docker-entrypoint.sh --def ...    Up         3306/tcp, 33060/tcp
docker-django_web_1     /docker-entrypoint.sh ngin ...    Up         80/tcp, 0.0.0.0:8000->8000/tcp

docker-django_app_1 → Python Container
docker-django_db_1 → MySQL Container
docker-django_web_1 → Nginx Container

Nếu cột “State” có trạng thái là “Up”, tức có nghĩa là container đó đang được chạy.

Cài đặt Django

Cài đặt Django trong “app” container

Thực thi lệnh bên dưới để khởi tạo dự án

$ docker-compose exec app django-admin.py startproject app .

Một khi bạn khởi tạo dự án hoàn tất, bạn sẽ thấy thư mục “src” sẽ được tạo ra.

$ ll
drwxrwxr-x 8 user user 4096 Dec 24 01:43 .git/
-rw-rw-r-- 1 user user 486 Dec 24 01:43 README.md
drwxrwxr-x 5 user user 4096 Dec 24 01:43 docker/
-rw-rw-r-- 1 user user 719 Dec 24 01:43 docker-compose.yml
drwxr-xr-x 3 root root 4096 Dec 24 01:46 src/

Các file của mã nguồn Django được tạo ra bên trong thư mục “src”. Sau đó việc cần làm là restart lại docker để khởi động lại dự án bằng cách thực hiện lệnh sau:

$ docker-compose restart

Truy cập vào localhost:8000 sẽ đưa bạn đến trang welcom của Django.

Vậy là quá trình khởi tạo dự án Django đã thành công, tiếp theo để Django có thể kết nối được với Mysql, ta cần thực hiện thêm các bước sau

Cấu hình MySQL

Chỉnh sửa trong file “./src/app/settings.py”.

Mặc định trong file setting.py của Django khi mới vừa khởi tạo dự án. CSDL sẽ là sqlite3

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

Để thay đổi cấu hình thành Mysql ta tiến thành thực hiện như sau:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_local',
        'USER': 'django_user',
        'PASSWORD': 'secret',
        'HOST': 'db',
        'POST': 3306
    }
}

Hãy thử chạy migration để thấy được kết quả nếu ứng dụng kết nối với MySQL thành công.

$ docker-compose exec app ./manage.py migrate
Operations to perform:
 Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
 Applying contenttypes.0001_initial... OK
 Applying auth.0001_initial... OK
 Applying admin.0001_initial... OK
     :
     :

Nếu kết nối thành công, migrate sẽ được thực thi, authentication và các bảng khác sẽ được tạo ra trong MySQL.

Vậy là chúng ta đã hoàn tất việc thực hiện cài đặt môi trường phát triển!

Cấu hình Docker Container

Cấu hình Repository

docker-django
├── docker-compose.yml
├── docker
│    ├── mysql
│    │    ├── Dockerfile
│    │    └── my.cnf
│    ├── nginx
│    │    ├── default.conf
│    │    └── uwsgi_params
│    └── python
│       ├── Dockerfile
│       └── requirements.txt
└── src

Thư mục “src” không tồn tại khi bạn clone repo từ github. Thư mục này sẽ được tạo ra sau khi Django được cài đặt hoàn tất.

app container

Đây là container mà Django đã được cài đặt.

Mã nguồn Django được cài đặt tạo “/workspace” của “app” container được ghi xuống bên trong thư mục /src

Bạn cũng có thể mô tả gói cài đặt mà bạn muốn cài đặt bởi pip bên trong file requirements.txt. Do đó nó sẽ được cài đặt bên trong container khi bạn rebuild lại nó.

db container

User và database được tạo ra tại thời điểm docker được build

DB name:django_local 
DB user:django_user 
password:secret
web container

Cấu hình sẽ được ghi đè lên file default.conf bên phía local và file đó sẽ được ghi bên trong container.

Cấu hình UWSGI cũng được ghi bên trong web container.

Cuối cùng, việc cài đặt và deploy một dự án Django kết nối MySQL chạy trên NGINX cuối cùng đã hoàn tất. Như vậy, nếu ứng dụng của bạn chạy nhiều gói và có nhiều phiên bản khác nhau được cài đặt tại một thời điểm sẽ dẫn đến việc xung đột là không tránh khỏi và ảnh hưởng đến nhiều ứng dụng khác.

Docker là giải pháp hiệu quả dành cho những trường hợp mà chúng ta đã đề cập trong bài viết. Thật dễ dàng để triển khai phải không nào. Chúc các bạn thực hành thành công.

Tài liệu kham khảo:

One thought on “Deploy ứng dụng Django cùng với Nginx và Mysql bằng Docker”
Leave a Comment