Dockerizing ứng dụng Flask sử dụng Docker trên Debian 10

theanh

Administrator
Nhân viên
Docker là một công cụ mã nguồn mở được thiết kế để giúp việc tạo, triển khai và chạy ứng dụng dễ dàng hơn bằng cách sử dụng các container. Container là một gói phần mềm đóng gói mã và tất cả các phần phụ thuộc của nó để ứng dụng chạy nhanh và đáng tin cậy từ môi trường điện toán này sang môi trường điện toán khác.

Flask là một khung web Python phổ biến. Nó được phân loại là một khung vi mô vì nó không yêu cầu các công cụ hoặc thư viện cụ thể. So với các khung khác, nó nhẹ và có cấu trúc cao.

Trong hướng dẫn này, chúng tôi sẽ giải thích cách triển khai ứng dụng Flask với Docker trên máy chủ Debian 10.

Điều kiện tiên quyết​

  • Máy chủ chạy Debian 10.
  • Mật khẩu gốc được cấu hình trên máy chủ của bạn.

Bắt đầu​

Trước khi bắt đầu, bạn nên cập nhật gói hệ thống của mình lên phiên bản mới nhất. Bạn có thể cập nhật tất cả các gói bằng lệnh sau:
Mã:
apt-get update -y
apt-get upgrade -y
Sau khi tất cả các gói được cập nhật, hãy khởi động lại hệ thống của bạn để áp dụng các thay đổi.

Cài đặt các phụ thuộc bắt buộc​

Tiếp theo, bạn sẽ cần cài đặt máy chủ web Nginx và các phụ thuộc khác trong hệ thống của mình. Bạn có thể cài đặt tất cả chúng bằng lệnh sau:
Mã:
apt-get install nginx apt-transport-https ca-certificates curl gnupg2 software-properties-common curl -y
Sau khi tất cả các gói được cài đặt, bạn có thể tiến hành bước tiếp theo.

Cài đặt Docker​

Theo mặc định, phiên bản Docker mới nhất không có trong kho lưu trữ Debian 10. Vì vậy, bạn nên cài đặt từ kho lưu trữ chính thức của Docker.

Đầu tiên, hãy tải xuống và thêm khóa GPG bằng lệnh sau:
Mã:
wget https://download.docker.com/linux/debian/gpg apt-key add gpg
Tiếp theo, hãy thêm kho lưu trữ Docker bằng lệnh sau:
Mã:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"
Tiếp theo, hãy cập nhật kho lưu trữ và cài đặt Docker bằng lệnh sau:
Mã:
apt-get update -y
apt-get install docker-ce -y
Sau khi quá trình cài đặt hoàn tất thành công, hãy xác minh trạng thái của Docker bằng lệnh sau:
Mã:
systemctl status docker
Bạn sẽ nhận được kết quả đầu ra sau:
Mã:
? docker.service - Docker Application Container Engine Đã tải: đã tải (/lib/systemd/system/docker.service; đã bật; cài đặt trước của nhà cung cấp: đã bật) Đang hoạt động: đang hoạt động (đang chạy) kể từ CN 2020-04-19 06:26:25 UTC; 1 phút 8 giây trước Tài liệu: https://docs.docker.com PID chính: 8883 (dockerd) Nhiệm vụ: 10 Bộ nhớ: 46,6M CGroup: /system.slice/docker.service ??8883 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock19/04 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413828757Z" level=warning msg="Hạt nhân của bạn không hỗ trợ giới hạn bộ nhớ hoán đổi19/04 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413876690Z" level=warning msg="Hạt nhân của bạn không hỗ trợ cgroup rt period"19/04 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413889604Z" level=warning msg="Hạt nhân của bạn không hỗ trợ cgroup rt runtime19/04 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.414115814Z" level=info msg="Đang tải container: bắt đầu."19/04 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.788332166Z" level=info msg="Cầu nối mặc định (docker0) được gán với một IP a19/04 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.972022325Z" level=info msg="Đang tải container: xong."19/04 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.010940205Z" level=info msg="Trình nền Docker" commit=afacb8b7f0 graphdriver(s)=o19/04 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.011145541Z" level=info msg="Daemon đã hoàn tất quá trình khởi tạo"19/04 06:26:25 debian10 systemd[1]: Đã khởi động Docker Application Container Engine.19/04 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.074603639Z" level=info msg="API listen on /var/run/docker.sock"
Lúc này, Docker đã được cài đặt và đang chạy. Bây giờ bạn có thể tiến hành bước tiếp theo.

Thiết lập Flask Directory Cấu trúc​

Tiếp theo, bạn sẽ cần tạo một cấu trúc thư mục để chứa ứng dụng Flask của mình.

Hãy tạo một thư mục có tên là flask bên trong thư mục /var/www/:
Mã:
mkdir -p /var/www/flask
Tiếp theo, hãy đổi thư mục thành flask và tạo cấu trúc thư mục cho flask:
Mã:
cd /var/www/flask
mkdir -p app/static
mkdir -p app/templates
Thư mục tĩnh được sử dụng để lưu trữ hình ảnh, tệp CSS và JavaScript trong khi thư mục mẫu được sử dụng để lưu trữ các mẫu HTML cho dự án của bạn.

Tiếp theo, bạn sẽ cần tạo tệp __init__.py bên trong thư mục ứng dụng:
Mã:
nano app/__init__.py
Thêm các nội dung sau để tạo một phiên bản Flask và nhập logic từ tệp views.py:
Mã:
from flask import Flaskapp = Flask(__name__)from app import views
Lưu và đóng tệp sau đó tạo tệp views.py trong thư mục ứng dụng của bạn.
Mã:
nano app/views.py
Thêm các dòng sau
Mã:
from app import [email protected]('/')def home(): return "hello world!"
Lưu và đóng tệp sau đó tạo tệp uwsgi.ini bằng lệnh sau:
Mã:
nano uwsgi.ini
Tệp này sẽ chứa các cấu hình uWSGI cho ứng dụng của chúng ta như được hiển thị bên dưới:
Mã:
[uwsgi]module = maincallable = appmaster = true
Lưu và đóng tệp khi bạn hoàn tất. uWSGI là tùy chọn triển khai cho Nginx, vừa là giao thức vừa là máy chủ ứng dụng.

Tiếp theo, bạn sẽ cần tạo tệp main.py để nhập phiên bản Flask có tên là app từ gói ứng dụng. Bạn có thể tạo tệp này bằng lệnh sau:
Mã:
nano main.py
Thêm dòng sau:
Mã:
from app import app
Lưu và đóng tệp khi bạn hoàn tất. Tiếp theo, tạo tệp requirements.txt để chỉ định các phụ thuộc mà trình quản lý gói pip sẽ cài đặt vào triển khai Docker của bạn:
Mã:
nano requirements.txt
Thêm dòng sau khớp với phiên bản Flask mới nhất:
Mã:
Flask==1.1.2
Lưu và đóng tệp khi bạn hoàn tất.

Lúc này, ứng dụng Flask của bạn đã được định cấu hình thành công. Bây giờ bạn có thể tiến hành bước tiếp theo.

Cấu hình Docker để triển khai Flask​

Tiếp theo, bạn sẽ cần tạo Dockerfile để xây dựng và triển khai ứng dụng flask.

Đầu tiên, hãy tạo Dockerfile bằng lệnh sau:
Mã:
cd /var/www/flask
nano Dockerfile
Thêm các dòng sau:
Mã:
FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7RUN apk --update add bash nanoENV STATIC_URL /staticENV STATIC_PATH /var/www/app/staticCOPY ./requirements.txt /var/www/requirements.txtRUN pip install -r /var/www/requirements.txt
Lưu và đóng tệp khi bạn hoàn tất. Tiếp theo, tạo một tập lệnh start.sh để xây dựng một hình ảnh từ Dockerfile và tạo một container từ hình ảnh Docker kết quả.
Mã:
nano start.sh
Thêm dòng sau:
Mã:
#!/bin/bashapp="docker.test"docker build -t ${app} .docker run -d -p 56733:80 \ --name=${app} \ -v $PWD:/app ${app}
Lưu và đóng tệp khi bạn hoàn tất.

Lưu ý: Đảm bảo cổng 56733 trống và có thể sử dụng được.

Cuối cùng, hãy chạy tập lệnh bằng lệnh sau:
Mã:
bash start.sh
Điều này sẽ tạo hình ảnh Docker và xây dựng một vùng chứa từ hình ảnh kết quả như được hiển thị bên dưới:
Mã:
Gửi ngữ cảnh xây dựng đến daemon Docker 9.728kBBước 1/6: TỪ tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7python3.6-alpine3.7: Kéo từ tiangolo/uwsgi-nginx-flask48ecbb6b270e: Kéo hoàn tất692f29ee68fa: Hoàn tất kéof75fc7ac1098: Hoàn tất kéoc30e40bb471c: Hoàn tất kéoXây dựng thành công f5de17e1ce82Đã gắn thẻ docker.test:latest thành công22cd2bd23c9190cf2900fa1d7c55e4765a266e68c74dc1e6858872e9ebe7bdcd
Bây giờ bạn có thể liệt kê các container đang chạy bằng lệnh sau:
Mã:
docker ps
Bạn sẽ nhận được kết quả sau:
Mã:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES22cd2bd23c91 docker.test "/entrypoint.sh /sta…" Khoảng một phút trước Lên Khoảng một phút 443/tcp, 0.0.0.0:56733->80/tcp docker.test
Bạn cũng có thể xác minh vùng chứa Docker bằng cách truy cập URL http://your-server-ip:56733. Bạn sẽ thấy màn hình sau:


Triển khai Tệp Mẫu​

Bạn cũng có thể triển khai các tệp mẫu để phục vụ nội dung tĩnh và động. Bạn có thể tạo mẫu trang chủ cho ứng dụng của mình bằng lệnh sau:
Mã:
nano app/templates/home.html
Thêm các mã sau:
Mã:
    Welcome Flask   [HEADING=1]Home Page[/HEADING] 
Đây là trang chủ của ứng dụng Flask của chúng tôi.
Lưu và đóng tệp khi bạn hoàn tất. Tiếp theo, bạn sẽ cần sửa đổi tệp views.py để phục vụ tệp mới tạo:
Mã:
nano app/views.py
Cập nhật tệp như hiển thị bên dưới:
Mã:
from flask import render_templatefrom app import [email protected]('/')def home(): return "hello world!"@app.route('/template')def template(): return render_template('home.html')
Lưu và đóng tệp. Sau đó, bạn sẽ cần khởi động lại các vùng chứa Docker để áp dụng các thay đổi.

Bạn có thể khởi động lại vùng chứa Docker có tên docker.test bằng lệnh sau:
Mã:
docker stop docker.test
docker start docker.test
Bây giờ, hãy mở trình duyệt web của bạn và nhập URL http://your-server-ip:56733/template. Bạn sẽ thấy mẫu mới tạo của mình trong màn hình sau:


Kết luận​

Xin chúc mừng! bạn đã triển khai thành công ứng dụng Flask với Docker trên máy chủ Debian 10. Bây giờ bạn có thể sao chép ứng dụng trên nhiều máy chủ khác nhau với cấu hình lại tối thiểu. Hãy thoải mái hỏi tôi nếu bạn có bất kỳ câu hỏi nào.
 
Back
Bên trên