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
 

