Cách xây dựng và triển khai ứng dụng Flask bằng Docker trên Ubuntu 20.04

Tác giả đã chọn Quỹ Giáo dục Công nghệ để nhận một khoản đóng góp như một phần của chương trình Viết cho DO donate.

Giới thiệu

Docker là một ứng dụng mã nguồn mở cho phép quản trị viên tạo, quản lý, triển khai và nhân rộng các ứng dụng bằng cách sử dụng vùng chứa. Vùng chứa có thể được coi là một gói chứa các phụ thuộc mà ứng dụng yêu cầu để chạy ở cấp hệ điều hành. Điều này có nghĩa là mỗi ứng dụng được triển khai bằng Docker sống trong một môi trường riêng và các yêu cầu của nó được xử lý riêng biệt.

Flask là một khuôn khổ vi mô web được xây dựng trên Python. Nó được gọi là vi khuôn khổ vì nó không yêu cầu các công cụ hoặc trình cắm cụ thể để chạy. Khung làm việc Flask nhẹ và linh hoạt, nhưng có cấu trúc cao, khiến nó trở nên đặc biệt phổ biến đối với các ứng dụng web nhỏ được viết bằng Python.

Triển khai ứng dụng Flask với Docker sẽ cho phép bạn sao chép ứng dụng trên các máy chủ khác nhau với cấu hình lại tối thiểu.

Trong hướng dẫn này, bạn sẽ tạo một ứng dụng Flask và triển khai nó với Docker. Hướng dẫn này cũng sẽ trình bày cách cập nhật ứng dụng sau khi triển khai.

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

Để làm theo hướng dẫn này, bạn sẽ cần những thứ sau:

Bước 1 – Thiết lập ứng dụng bình

Để bắt đầu, bạn sẽ tạo một cấu trúc thư mục chứa ứng dụng Flask của bạn. Hướng dẫn này sẽ tạo một thư mục có tên là TestApp trong /var/www, nhưng bạn có thể sửa đổi lệnh thành bất kỳ tên nào bạn muốn.

  • sudo mkdir /var/www/TestApp

Chuyển đến phần mới được tạo TestApp danh mục:

Next, create the base folder structure for the Flask application:

  • sudo mkdir -p app/static app/templates

Các -p cờ chỉ ra rằng mkdir sẽ tạo một thư mục và tất cả các thư mục mẹ không tồn tại. Trong trường hợp này, mkdir sẽ tạo ra app thư mục mẹ trong quá trình tạo statictemplates các thư mục.

Các app thư mục sẽ chứa tất cả các tệp liên quan đến ứng dụng Flask chẳng hạn như lượt xembản thiết kế. Lượt xem là mã bạn viết để phản hồi các yêu cầu đối với ứng dụng của bạn. Bản thiết kế tạo các thành phần ứng dụng và hỗ trợ các mẫu chung trong một ứng dụng hoặc trên nhiều ứng dụng.

Các static thư mục là nơi chứa các nội dung như hình ảnh, CSS và các tệp . Các templates thư mục là nơi bạn sẽ đặt các mẫu HTML cho dự án của mình.

Bây giờ cấu trúc thư mục cơ sở đã hoàn tất, bạn cần tạo các tệp cần thiết để chạy ứng dụng Flask. Đầu tiên, hãy tạo một __init__.py tập tin bên trong app thư mục sử dụng nano hoặc một trình soạn thảo văn bản mà bạn chọn. Tệp này cho trình thông dịch Python biết rằng app thư mục là một gói và nên được xử lý như vậy.

Chạy lệnh sau để tạo tệp:

  • sudo nano app/__init__.py

Các gói trong Python cho phép bạn nhóm các mô-đun thành không gian tên hoặc cấu trúc phân cấp hợp lý. Cách tiếp cận này cho phép mã được chia thành các khối riêng lẻ và có thể quản lý để thực hiện các chức năng cụ thể.

Tiếp theo, bạn sẽ thêm mã vào __init__.py điều đó sẽ tạo một phiên bản Flask và nhập logic từ views.py tệp mà bạn sẽ tạo sau khi lưu tệp này. Thêm mã sau vào tệp mới của bạn:

/var/www/TestApp/app/__init__.py

from flask import Flask
app = Flask(__name__)
from app import views

Khi bạn đã thêm mã đó, hãy lưu và đóng tệp. Bạn có thể lưu và đóng tệp bằng cách nhấn Ctrl+X, sau đó khi được nhắc, YEnter.

Với __init__.py tệp được tạo, bạn đã sẵn sàng để tạo views.py tập tin vào của bạn app danh mục. Tệp này sẽ chứa hầu hết logic ứng dụng của bạn.

Next, add the code to your views.py tập tin. Mã này sẽ trả về hello world! chuỗi tới những người dùng truy cập trang web của bạn:

Xem tiếp:   Chọn mua ổ cứng SSD loại nào để tăng tốc máy tính?

/var/www/TestApp/app/views.py

from app import app

@app.route('/')
def home():
   return "hello world!"

Các @app.route dòng phía trên hàm được gọi là decorator. Decorator là một quy ước ngôn ngữ Python được sử dụng rộng rãi bởi Flask; mục đích của chúng là sửa đổi các chức năng ngay sau chúng. Trong trường hợp này, trình trang trí cho Flask biết URL nào sẽ kích hoạt home() chức năng. Các hello world văn bản trả lại bởi home chức năng sẽ được hiển thị cho người dùng trên trình duyệt.

Với views.py nộp hồ sơ tại chỗ, bạn đã sẵn sàng để tạo uwsgi.ini tập tin. Tệp này sẽ chứa uWSGI cấu hình cho ứng dụng của chúng tôi. uWSGI là một tùy chọn triển khai cho vừa là một giao thức vừa là một máy chủ ứng dụng; máy chủ ứng dụng có thể phục vụ các giao thức uWSGI, FastCGI và HTTP.

Để tạo tệp này, hãy chạy lệnh sau:

Next, add the following content to your file to configure the uWSGI server:

/var/www/TestApp/uwsgi.ini

[uwsgi]
module = main
callable = app
master = true

Mã này xác định mô-đun mà ứng dụng Flask sẽ được phục vụ từ đó. Trong trường hợp này, đây là main.py tệp, được tham chiếu ở đây là main. Các callable tùy chọn hướng dẫn uWSGI sử dụng app phiên bản được xuất bởi ứng dụng chính. Các master tùy chọn cho phép ứng dụng của bạn tiếp tục chạy, do đó có rất ít thời gian chết ngay cả khi tải lại toàn bộ ứng dụng.

Tiếp theo, tạo main.py tệp, là điểm vào ứng dụng. Điểm đầu vào hướng dẫn uWSGI cách tương tác với ứng dụng.

Next, copy and paste the following into the file. This imports the Flask instance named app từ gói ứng dụng đã được tạo trước đó.

/var/www/TestApp/main.py

from app import app

Cuối cùng, tạo một requirements.txt để chỉ định các phụ thuộc mà pip trình quản lý gói sẽ cài đặt vào triển khai Docker của bạn:

  • sudo nano requirements.txt

Thêm dòng sau để thêm Flask làm phụ thuộc:

/var/www/TestApp/requirements.txt

Flask>=2.0.2

Điều này chỉ định phiên bản Flask sẽ được cài đặt. Tại thời điểm viết hướng dẫn này, 2.0.2 là phiên bản Flask mới nhất và chỉ định >=2.0.2 sẽ đảm bảo bạn nhận được phiên bản 2.0.2 hoặc mới hơn. Vì bạn đang tạo một ứng dụng thử nghiệm cơ bản trong hướng dẫn này, nên cú pháp có thể không lỗi thời do các trong tương lai cho Flask, nhưng nếu bạn muốn an toàn và vẫn nhận được các bản cập nhật nhỏ, bạn có thể chỉ định rằng bạn không muốn cài đặt một phiên bản chính trong tương lai bằng cách chỉ định một cái gì đó như Flask>=2.0.2,<3.0. Bạn có thể kiểm tra các bản cập nhật tại trang web chính thức cho Flask hoặc trên trang đích của Python Package Index cho thư viện Flask.

Lưu và đóng tập tin. Bạn đã thiết lập thành công ứng dụng Flask của mình và sẵn sàng thiết lập Docker.

Bước 2 - Thiết lập Docker

Trong bước này, bạn sẽ tạo hai tệp, Dockerfilestart.sh, để tạo triển khai Docker của bạn. Các Dockerfile là một tài liệu văn bản chứa các lệnh được sử dụng để lắp ráp hình ảnh. Các start.sh tệp là một tập lệnh shell sẽ xây dựng một hình ảnh và tạo một vùng chứa từ Dockerfile.

Đầu tiên, hãy tạo Dockerfile.

Next, add your desired configuration to the Dockerfile. Các lệnh này chỉ định cách hình ảnh sẽ được xây dựng và những yêu cầu bổ sung nào sẽ được đưa vào.

/ var / www / TestApp / Dockerfile

FROM tiangolo/uwsgi-nginx-flask:python3.8-alpine
RUN apk --update add bash nano
ENV STATIC_URL /static
ENV STATIC_PATH /var/www/app/static
COPY ./requirements.txt /var/www/requirements.txt
RUN pip install -r /var/www/requirements.txt

Trong ví dụ này, hình ảnh Docker sẽ được xây dựng dựa trên hình ảnh hiện có, tiangolo/uwsgi-nginx-flask, bạn có thể tìm thấy trên DockerHub. Hình ảnh Docker cụ thể này là một lựa chọn tốt so với những hình ảnh khác vì nó hỗ trợ nhiều phiên bản Python và hình ảnh hệ điều hành.

Hai dòng đầu tiên chỉ định hình ảnh gốc mà bạn sẽ sử dụng để chạy ứng dụng và cài đặt bộ xử lý lệnh bash và nano trình soạn thảo văn bản. Nó cũng cài đặt git khách hàng để kéo và đẩy sang các dịch vụ lưu trữ kiểm soát phiên bản như GitHub, GitLab và Bitbucket. ENV STATIC_URL /static là một biến môi trường cụ thể cho hình ảnh Docker này. Nó xác định thư mục tĩnh nơi tất cả nội dung như hình ảnh, tệp CSS và tệp JavaScript được phân phát từ đó.

Xem tiếp:   tải nhạc youtube sang mp3 trên điện thoại nhanh đơn giản

Hai dòng cuối cùng sẽ sao chép requirements.txt tệp vào vùng chứa để nó có thể được thực thi, rồi phân tích cú pháp requirements.txt để cài đặt các phụ thuộc được chỉ định.

Lưu và đóng tệp sau khi thêm cấu hình của bạn.

Với bạn Dockerfile tại chỗ, bạn gần như đã sẵn sàng để viết start.sh script sẽ tạo vùng chứa Docker. Trước khi viết start.sh script, trước tiên hãy đảm bảo rằng bạn có một cổng mở để sử dụng trong cấu hình. Để kiểm tra xem một cổng có trống không, hãy chạy lệnh sau:

  • sudo nc localhost 56733 < /dev/null; echo $?

Nếu đầu ra của lệnh trên là 1, thì cổng này miễn phí và có thể sử dụng được. Nếu không, bạn sẽ cần chọn một cổng khác để sử dụng trong start.sh tập tin cấu hình.

Khi bạn đã tìm thấy một cổng mở để sử dụng, hãy tạo start.sh script:

Các start.sh script là một tập lệnh shell sẽ xây dựng một hình ảnh từ Dockerfile và tạo một vùng chứa từ hình ảnh Docker kết quả. Thêm cấu hình của bạn vào tệp mới:

/var/www/TestApp/start.sh

#!/bin/bash
app="docker.test"
docker build -t ${app} .
docker run -d -p 56733:80 
  --name=${app} 
  -v $PWD:/app ${app}

Dòng đầu tiên được gọi là shebang. Nó chỉ định rằng đây là một tệp bash và sẽ được thực thi dưới dạng các lệnh. Dòng tiếp theo chỉ định tên bạn muốn đặt cho hình ảnh và vùng chứa và lưu dưới dạng một biến có tên app. Dòng tiếp theo hướng dẫn Docker xây dựng hình ảnh từ Dockerfile nằm trong thư mục hiện tại. Điều này sẽ tạo ra một hình ảnh có tên là docker.test trong ví dụ này.

Ba dòng cuối cùng tạo một vùng chứa mới có tên docker.test được phơi bày tại cảng 56733. Cuối cùng, nó liên kết thư mục hiện tại với /var/www thư mục của vùng chứa.

Bạn sử dụng -d cờ để bắt đầu một vùng chứa ở chế độ daemon hoặc như một quá trình nền. Bạn bao gồm -p gắn cờ để liên kết một cổng trên máy chủ với một cổng cụ thể trên vùng chứa Docker. Trong trường hợp này, bạn đang ràng buộc cổng 56733 đến cảng 80 trên vùng chứa Docker. Các -v cờ chỉ định một khối lượng Docker để gắn trên vùng chứa và trong trường hợp này, bạn đang gắn toàn bộ thư mục dự án vào /var/www trên vùng chứa Docker.

Lưu và đóng tệp sau khi thêm cấu hình của bạn.

Thực hiện start.sh script để tạo hình ảnh Docker và xây dựng vùng chứa từ hình ảnh kết quả:

Once the script finishes running, use the following command to list all running containers:

You will receive output that shows the containers:

Output

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58b05508f4dd docker.test "/entrypoint.sh /sta…" 12 seconds ago Up 3 seconds 443/tcp, 0.0.0.0:56733->80/tcp docker.test

Bạn sẽ thấy rằng docker.test vùng chứa đang chạy. Bây giờ nó đang chạy, hãy truy cập địa chỉ IP tại cổng được chỉ định trong trình duyệt của bạn: http://ip-address:56733

Bạn sẽ thấy một trang tương tự như sau:

trang chủ

Ở bước này, bạn đã triển khai thành công ứng dụng Flask của mình trên Docker. Tiếp theo, bạn sẽ sử dụng các mẫu để hiển thị nội dung cho người dùng.

Bước 3 - Cung cấp tệp mẫu

Mẫu là các tệp hiển thị nội dung tĩnh và động cho người dùng truy cập ứng dụng của bạn. Ở bước này, bạn sẽ tạo một mẫu HTML để tạo trang chủ cho ứng dụng.

Bắt đầu bằng cách tạo home.html tập tin trong app/templates danh mục:

  • sudo nano app/templates/home.html

Thêm mã cho mẫu của bạn. Mã này sẽ tạo một trang HTML5 có chứa tiêu đề và một số văn bản.

/var/www/TestApp/app/templates/home.html


<!doctype html>

<html lang="en-us">   
  <head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title>Welcome home</title>
  </head>

  <body>
    <h1>Home Page</h1>
    <p>This is the home page of our application.</p>
  </body> 
</html>

Lưu và đóng tệp khi bạn đã thêm mẫu của mình.

Xem tiếp:   Cách quản lý an toàn bí mật với HashiCorp Vault trên Ubuntu 20.04

Tiếp theo, sửa đổi app/views.py tệp để phục vụ tệp mới tạo:

First, add the following line at the beginning of your file to import the render_template phương pháp từ Bình. Phương pháp này phân tích cú pháp một tệp HTML để hiển thị một trang web cho người dùng.

/var/www/TestApp/app/views.py

from flask import render_template
...

Ở cuối tệp, bạn cũng sẽ thêm một tuyến mới để hiển thị tệp mẫu. Mã này chỉ định rằng người dùng được cung cấp nội dung của home.html nộp bất cứ khi nào họ truy cập /template lộ trình trên ứng dụng của bạn.

/var/www/TestApp/app/views.py

...

@app.route('/template')
def template():
    return render_template('home.html')

Cập nhật app/views.py tệp sẽ trông như thế này:

/var/www/TestApp/app/views.py

from flask import render_template
from app import app 

@app.route('/')
def home():
    return "Hello world!"

@app.route('/template')
def template():
    return render_template('home.html')

Lưu và đóng tệp khi hoàn tất.

Để những thay đổi này có hiệu lực, bạn cần dừng và khởi động lại vùng chứa Docker. Chạy lệnh sau để xây dựng lại vùng chứa:

  • sudo docker stop docker.test && sudo docker start docker.test

Truy cập ứng dụng của bạn tại http://your-ip-address:56733/template để xem mẫu mới đang được cung cấp.

trang chủ

Trong phần này, bạn đã tạo tệp mẫu Docker để phục vụ khách truy cập vào ứng dụng của mình. Trong bước tiếp theo, bạn sẽ thấy những thay đổi bạn thực hiện đối với ứng dụng của mình có thể có hiệu lực như thế nào mà không cần phải khởi động lại vùng chứa Docker.

Bước 4 - Cập nhật ứng dụng

Đôi khi bạn sẽ cần thực hiện các thay đổi đối với ứng dụng, cho dù đó là cài đặt các yêu cầu mới, cập nhật vùng chứa Docker hay các thay đổi về HTML và logic. Trong phần này, bạn sẽ cấu hình touch-reload để thực hiện những thay đổi này mà không cần khởi động lại vùng chứa Docker.

Python tải tự động theo dõi toàn bộ hệ thống tệp để biết các thay đổi và làm mới ứng dụng khi phát hiện ra thay đổi. Tải tự động không được khuyến khích trong sản xuất vì nó có thể trở nên tiêu tốn tài nguyên rất nhanh. Trong bước này, bạn sẽ sử dụng touch-reload để xem các thay đổi đối với một tệp cụ thể và tải lại khi tệp được cập nhật hoặc thay thế.

Để thực hiện điều này, hãy bắt đầu bằng cách mở uwsgi.ini tập tin:

Next, add the highlighted line to the end of the file:

/var/www/TestApp/uwsgi.ini

module = main
callable = app
master = true
touch-reload = /app/uwsgi.ini

Điều này chỉ định một tệp sẽ được sửa đổi để kích hoạt tải lại toàn bộ ứng dụng. Khi bạn đã thực hiện các thay đổi, hãy lưu và đóng tệp.

Để chứng minh điều này, hãy thực hiện một thay đổi nhỏ đối với ứng dụng của bạn. Bắt đầu bằng cách mở của bạn app/views.py tập tin:

Replace the string returned by the home chức năng:

/var/www/TestApp/app/views.py

from flask import render_template
from app import app

@app.route('/')
def home():
    return "<b>There has been a change</b>"

@app.route('/template')
def template():
    return render_template('home.html')

Lưu và đóng tệp sau khi bạn đã thực hiện thay đổi.

Tiếp theo, nếu bạn mở trang chủ ứng dụng của mình tại http://ip-address:56733, bạn sẽ nhận thấy rằng các thay đổi không được phản ánh. Điều này là do điều kiện để tải lại là một thay đổi đối với uwsgi.ini tập tin. Để tải lại ứng dụng, hãy sử dụng touch để kích hoạt điều kiện:

Reload the application homepage in your browser again. You will find that the application has incorporated the changes:

Trang chủ đã cập nhật

In this step, you set up a touch-reload điều kiện để cập nhật ứng dụng của bạn sau khi thực hiện các thay đổi.

Sự kết luận

Trong hướng dẫn này, bạn đã tạo và triển khai ứng dụng Flask cho vùng chứa Docker. Bạn cũng đã cấu hình touch-reload để làm mới ứng dụng của bạn mà không cần khởi động lại vùng chứa.

Với ứng dụng mới của bạn trên Docker, giờ đây bạn có thể mở rộng quy mô một cách dễ dàng. Để tìm hiểu thêm về cách sử dụng Docker, hãy xem tài liệu chính thức của họ.

.

Check Also

Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu

Giới thiệu Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng Python bằng …