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:
- User không phải root có quyền sudo được cấu hình theo hướng dẫn Cài đặt server ban đầu với Ubuntu 18.04 .
- Một server Ubuntu 18.04 được cài đặt Docker, được cài đặt theo hướng dẫn này hoặc với Docker image một cú nhấp chuột của DigitalOcean.
- Đã cài đặt Nginx theo bước một trong hướng dẫn Cách cài đặt Nginx trên Ubuntu 18.04 .
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 static
và templates
.
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 xem và bả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:
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 :
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:
[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 đó.
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:
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 , Dockerfile
và start.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.
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:
#!/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 :
OutputCONTAINER 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:
Ở 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.
<!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 .
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.
... @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:
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.
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 :
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
:
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:
Ở 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ọ.
Các tin liên quan
Como Conteinerizar um aplicativo Laravel para desenvolvimento com o Docker Compose em Ubuntu 18.042020-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