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.
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”
Hay quá Linh ơi