Chủ Nhật, 05/04/2020 | 00:00 GMT+7

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

Docker là một ứng dụng open-souce cho phép administrator tạo, quản lý, triển khai và sao chép các ứng dụng bằng cách sử dụng containers . Các containers 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 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 micro-framework 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 công tác Flask nhẹ và linh hoạt, nhưng có cấu trúc cao, khiến nó được ưa thích hơn các khung công tác khác.

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 server 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.

Yêu cầu

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

Bước 1 - Cài đặt ứng dụng flask

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

  • sudo mkdir /var/www/TestApp

Chuyển đến folder TestApp mới được tạo:

  • cd /var/www/TestApp

Tiếp theo, tạo cấu trúc folder cơ sở cho ứng dụng Flask:

  • sudo mkdir -p app/static app/templates

Cờ -p cho biết mkdir sẽ tạo một folder và tất cả các folder mẹ không tồn tại. Trong trường hợp này, mkdir sẽ tạo folder mẹ app trong quá trình tạo folder statictemplates .

Thư mục app sẽ chứa tất cả các file liên quan đến ứng dụng Flask như các dạng xembản thiết kế của nó. Lượt xem là mã bạn viết để phản hồi các yêu cầu đến ứng dụng của bạn. Bản thiết kế tạo ra 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.

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

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

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

  • sudo nano app/__init__.py

Các gói trong Python cho phép bạn group các module thành không gian tên hoặ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 sẽ tạo một version Flask và nhập logic từ file views.py , mà bạn sẽ tạo sau khi lưu file này. Thêm mã sau vào file 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 file .

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

  • sudo nano app/views.py

Tiếp theo, thêm mã vào file views.py của bạn. Mã này sẽ trả lại hello world! chuỗi cho những user truy cập trang web :

/var/www/TestApp/app/views.py
from app import app  @app.route('/') def home():    return "hello world!" 

Dòng @app.route phía trên hàm được gọi là decorator . Người trang trí sửa đổi chức năng theo sau nó. Trong trường hợp này, trình trang trí cho Flask biết URL nào sẽ kích hoạt hàm home() . Văn bản hello world do chức năng home sẽ được hiển thị cho user trên trình duyệt.

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

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

  • sudo nano uwsgi.ini

Tiếp theo, thêm nội dung sau vào file của bạn để cấu hình server uWSGI:

/var/www/TestApp/uwsgi.ini
[uwsgi] module = main callable = app master = true 

Mã này xác định module mà ứng dụng Flask sẽ được phục vụ từ đó. Trong trường hợp này, đây là file main.py , được tham chiếu ở đây là file main . Tùy chọn có callable hướng dẫn uWSGI sử dụng version app 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, vì vậy có rất ít thời gian chết ngay cả khi reload toàn bộ ứng dụng.

Tiếp theo, tạo file main.py , là điểm nhập 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.

  • sudo nano main.py

Tiếp theo, copy paste phần sau vào file . Thao tác này nhập app có tên version Flask 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 file để xác định phụ thuộc mà pip quản lý gói sẽ cài đặt để 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==1.0.2 

Điều này chỉ định version Flask sẽ được cài đặt. Tại thời điểm viết hướng dẫn này, 1.0.2 là version Flask mới nhất. Bạn có thể kiểm tra các bản cập nhật tại trang web chính thức của Flask .

Lưu và đóng file . Bạn đã cài đặt thành công ứng dụng Flask của bạn và sẵn sàng cài đặt Docker.

Bước 2 - Cài đặt Docker

Trong bước này, bạn sẽ tạo hai file , Dockerfilestart.sh , để tạo triển khai Docker của bạn. 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. Tệp start.sh là một tập lệnh shell sẽ xây dựng một hình ảnh và tạo một containers từ Dockerfile .

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

  • sudo nano Dockerfile

Tiếp theo, thêm cấu hình mong muốn của bạn vào 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.6-alpine3.7 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, Docker image sẽ được xây dựng dựa trên một hình ảnh hiện có, tiangolo/uwsgi-nginx-flask , bạn có thể tìm thấy hình ảnh này trên DockerHub . Docker image 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 version Python và hình ảnh hệ điều hành.

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

Hai dòng cuối cùng sẽ sao chép các requirements.txt file vào container để nó có thể được thực thi, và sau đó phân tích các requirements.txt file để cài đặt các phụ thuộc quy định.

Lưu file sau khi thêm cấu hình của bạn.

Với Dockerfile của bạn tại chỗ, bạn gần như đã sẵn sàng để viết tập lệnh start.sh của bạn để tạo containers Docker. Trước khi viết tập lệnh start.sh , trước tiên hãy đảm bảo 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 kết quả của lệnh trên là 1 , thì cổng là miễn phí và có thể sử dụng được. Nếu không, bạn cần chọn một cổng khác để sử dụng trong file cấu hình start.sh của bạn .

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

  • sudo nano start.sh

Tập lệnh start.sh 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 containers từ Docker image kết quả. Thêm cấu hình của bạn vào file 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 file 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à containers và lưu dưới dạng app có tên biến. Dòng tiếp theo hướng dẫn Docker xây dựng một hình ảnh từ Dockerfile của bạn nằm trong folder hiện tại. Thao tác này sẽ tạo 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 containers mới có tên là docker.test được hiển thị tại cổng 56733 . Cuối cùng, nó liên kết folder hiện tại với folder /var/www của containers .

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

Thực thi tập lệnh start.sh để tạo Docker image và xây dựng containers từ hình ảnh kết quả:

  • sudo bash start.sh

Khi tập lệnh chạy xong, hãy sử dụng lệnh sau để liệt kê tất cả các containers đang chạy:

  • sudo docker ps

Bạn sẽ nhận được kết quả hiển thị các 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 containers docker.test đ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 bạn trên Docker. Tiếp theo, bạn sẽ sử dụng các mẫu để hiển thị nội dung cho user .

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

Mẫu là các file hiển thị nội dung tĩnh và động cho user truy cập ứng dụng của bạn. Trong 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 file home.html trong folder app/templates :

  • 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 file khi bạn đã thêm mẫu của bạn .

Tiếp theo, sửa đổi file app/views.py để phân phát file mới tạo:

  • sudo nano app/views.py

Đầu tiên, thêm dòng sau vào đầu file của bạn để nhập phương thức render_template từ Flask. Phương pháp này phân tích cú pháp file HTML để hiển thị trang web cho user .

/var/www/TestApp/app/views.py
from flask import render_template ... 

Ở cuối file , bạn cũng sẽ thêm một tuyến mới để hiển thị file mẫu. Mã này chỉ định rằng user được cung cấp nội dung của file home.html khi nào họ truy cập tuyến /template 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') 

Tệp app/views.py được cập nhật sẽ trông giống như sau:

/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 file 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 containers Docker. Chạy lệnh sau để xây dựng lại containers :

  • 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 file mẫu Docker để phục vụ khách truy cập vào ứng dụng của bạn . 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 bạn có thể có hiệu lực như thế nào mà không cần phải khởi động lại containers Docker.

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

Đôi khi bạn cần áp dụng 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 containers 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 containers Docker.

Tính năng tải tự động của Python theo dõi toàn bộ hệ thống file để tìm các thay đổi và làm mới ứng dụng khi phát hiện thay đổi. Tự động reload không được khuyến khích trong production 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 tính touch-reload để theo dõi các thay đổi đối với một file cụ thể và reload khi file đượ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ở file uwsgi.ini của bạn:

  • sudo nano uwsgi.ini

Tiếp theo, thêm dòng được đánh dấu vào cuối 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 file sẽ được sửa đổi để kích hoạt reload toàn bộ ứng dụng. Khi bạn đã áp dụng các thay đổi , hãy lưu file .

Để 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ở file app/views.py của bạn:

  • sudo nano app/views.py

Thay thế chuỗi được trả về bởi hàm home :

/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 file 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 bạn 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 để reload là một thay đổi đối với file uwsgi.ini . Để reload ứng dụng, sử dụng touch để kích hoạt điều kiện:

  • sudo touch uwsgi.ini

Reload trang chủ ứng dụng trong trình duyệt của bạn. Bạn sẽ thấy rằng ứng dụng đã kết hợp các thay đổi:

Trang chủ được cập nhật

Ở bước này, bạn cài đặt điều kiện touch-reload cách touch-reload để cập nhật ứng dụng của bạn sau khi thực hiện thay đổi.

Kết luận

Trong hướng dẫn này, bạn đã tạo và triển khai ứng dụng Flask vào containers 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 containers .

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ọ.


Tags:

Các tin trước

Como Conteinerizar um aplicativo Laravel para desenvolvimento com o Docker Compose em Ubuntu 18.04 2020-02-20
Cách tạo ứng dụng Node.js với Docker [Quickstart] 2020-02-06
Cách cài đặt Docker Compose trên Debian 10 2020-01-30
Cách chứa một ứng dụng Laravel để phát triển với Docker Compose trên Ubuntu 18.04 2020-01-23
Cách chứa một ứng dụng Laravel để phát triển với Docker Compose trên Ubuntu 18.04 2020-01-23
Lưu trữ một ứng dụng Ruby on Rails để phát triển với Docker Compose 2019-12-27
Làm việc với nhiều container bằng Docker Compose 2019-12-20
Cách sử dụng Plugin Docker cho Visual Studio Code 2019-12-12
Cách sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 18.04 2019-12-05
Cách tạo ứng dụng Django và Gunicorn với Docker 2019-10-25