如何在Docker上部署Python Flask API应用

如果你是Docker和容器的新手,学习在Docker上部署Python Flask API应用程序是一个很好的开始。Docker让你可以使用轻量级技术和安全性来容器化应用程序,实现快速部署。

在本教程中,你将学会如何在Docker容器上设置和部署Python Flask API应用程序,成为自己的主人。

准备好了就开始部署吧!

前提条件

如果你想一步一步地跟着做,你需要安装以下软件:

  • 已安装Docker的Ubuntu机器。本教程使用的是带有Docker v19.03.8的Ubuntu 18.04.5 LTS。
  • 已在Ubuntu机器上安装Python v3.9或更高版本。本教程将使用Ubuntu机器上的Python v3.9.2。
  • 已安装在用于测试本教程中API的Ubuntu机器上的Elinks软件包。

创建Python Flask API应用程序(GET和POST API)

通过创建一个Python Flask应用程序来开始本教程。Flask是一个轻量级的WSGI微网络应用框架,用Python编写。Flask提供了便利的工具和功能来创建Python网络应用。

在创建Python Flask应用程序之前,您将安装Python Flask和Python虚拟环境,其中Flask将运行应用程序。

1. 使用您喜欢的SSH客户端登录到您的Ubuntu机器。

2. 接下来,运行以下命令创建一个名为~/docker_python_flask_demo的目录,并切换到该目录。此目录将保存Python和Docker运行应用程序所需的所有文件。

mkdir ~/docker_python_flask_demo
cd ~/docker_python_flask_demo

3. 运行下面的pip命令来安装Python虚拟环境(virtualenv),Flask需要它来执行应用程序。Python虚拟环境提供了自己的Python二进制文件和每个应用程序安装的软件包,以避免与其他应用程序的冲突。

pip install virtualenv
Installing the environment needed by Flask to execute the applications

4. 执行下面的virtualenv 命令来创建和激活虚拟环境使用venv模块。

virtualenv venv
Creating the virtual environment for Python

5. 现在,运行以下命令使用pip包管理器安装Python flask包。

pip install flask

6. 运行以下命令来激活你的虚拟环境中的包,然后你才能开始安装或使用它们。这会修改VIRTUAL_ENV环境变量,指向你的虚拟环境,并将虚拟环境的Python二进制文件路径添加到路径中,以便你运行正确的二进制文件。

source venv/bin/activate

7. 创建一个名为requirements.txt的文件,并定义Flask应用程序的依赖关系,如下所示。

Flask==2.0.2

8. 创建一个文本文件~/docker_python_flask_demo/app.py,并使用下面的Python代码填充该文件。

下面的Python代码导入Python flask类,并创建一个名为app的类实例。app类实例包含两个login()函数,当用户在/login页面发送请求时执行。然后执行success()函数,在浏览器上显示欢迎消息“用户名”。


from flask import Flask , redirect , url_for , request # 导入flask类
# app是Flask的对象或实例
app = Flask(__name__)
# app.route通知Flask要使用的URL
@app.route('/success/<name>')
# 创建名为success的函数
def success(name):
    return 'welcome %s' % name

@app.route('/login', methods = ['GET','POST'])
# 创建名为login的函数
def login():
    if request.method == 'POST':
       user = request.form['adamlistek']
       return redirect(url_for('success', name = user)) 
    else:
       return "INVALID"
# 从这里开始在开发服务器上执行程序(在你的系统上本地执行)
# 启用调试。
  
if __name__ == '__main__':
   app.run(debug = True)

9. 创建另一个名为 ~/docker_python_flask_demo/form.html 的文件,并复制/粘贴下面的代码。

运行下面的 HTML 代码会创建一个具有两个输入的表单;一个用于提供您的姓名,另一个是提交按钮。

一旦您提供了用户名并点击提交按钮,就会发送一个 POST 请求,Flask 将执行另一个函数并在 http://localhost:5000/success/<username> 上打开一个新的网页。

<html>
  <body>
    <form action="http://localhost:5000/login" method="post">
      <p>Please Enter your name</p>
      <p><input type="text" name="adamlistek" /></p>
      <p><input type="submit" value="Submit" /></p>
    </form>
  </body>
</html>

10. 最后,运行下面的 Python 命令来验证应用程序(app.py)在您的系统上本地运行正常。

Python app.py

如下所示,该应用程序在 Ubuntu 机器上成功运行,但在 Docker 上不成功。您将在以下部分中在 Docker 上启动相同的应用程序。

Running the Python application on the ubuntu machine.

创建 Dockerfile 部署 Python Flask API 应用程序

您刚刚创建并验证了 Python Flask 应用程序在您的机器上本地正常工作。但在将应用程序部署到 Docker 上之前,您首先需要创建一个 Dockerfile 来定义构建 Docker 镜像 的所有指令集。

~/docker_python_flask_demo 目录中创建一个名为 Dockerfile 的文件,并复制/粘贴下面的内容到 Dockerfile 中。

Docker 将使用此 Dockerfile 运行所有构建新 Docker 镜像所需的指令或命令,该镜像是基于基础镜像(ubuntu:18.04)构建的。

# 设置后续指令的基础镜像
FROM ubuntu:18.04
# 设置容器中的工作目录
WORKDIR /app
RUN apt-get update -y
RUN apt-get install -y python-pip python-dev
# 将文件复制到工作目录
COPY form.html /app/form.html
# 将依赖文件复制到工作目录
COPY requirements.txt /app/requirements.txt
# 安装依赖
RUN pip install -r requirements.txt
# 将所有内容复制到工作目录
COPY . /app
# 在容器启动时运行的命令
CMD [ "python" , "./app.py" ]

现在,请运行下面的 tree 命令,以验证所有运行 Python Flask 应用程序所需的文件是否包含在工作目录中(~/docker_python_flask_demo)。

tree  
Verifying all Required Files to Run the Flask Application Exist

为 Python Flask API 应用程序构建 Docker 镜像

现在您已经拥有部署 Python Flask 应用程序所需的文件,但这些文件不会起作用,除非您构建一个镜像。您将运行 docker build 命令,根据 Dockerfile 中设置的指令构建一个 Docker 镜像。

运行以下docker build命令在工作目录()中构建Docker镜像。此命令使用标签(-t)将镜像命名为flask-image版本1(:v1)。

sudo docker build -t flask-image:v1 .
Building the Docker Image

现在,运行以下docker命令以列出所有可用的镜像。

sudo docker images

下面,您可以看到返回的各种属性,如仓库。注意仓库名称是flask-image,并带有版本标签(v1),如下所示。

Verifying the New Docker Image (flask-image)

在Docker容器中运行Python Flask应用程序

创建Docker镜像后,您现在可以在Docker容器中运行Python Flask应用程序。Docker容器将代码及其依赖项打包起来,以便快速运行应用程序。

1. 执行以下docker run命令以执行以下操作:

  • 分离模式运行容器(-d),使其作为后台进程运行,并在创建时返回控制台输出。
  • 将Docker主机端口(-p 5000:5000)映射到容器的端口。
  • 启动Docker容器(flask-image:v1)。
sudo docker run -d -p 5000:5000 flask-image:v1

2. 接下来,运行以下docker命令,列出Docker引擎中的所有容器。验证Docker是否成功创建了容器。

sudo docker ps -a
Verifying the Docker container in the Docker engine

3. 最后,运行以下命令,使用elinks在Ubuntu机器上打开您的Web浏览器。

elinks form.html

该命令在终端上打开Web浏览器并提示输入名称,如下所示。

输入您的名称并点击提交按钮。

Accessing the login web page with the form to enter your name

4. 如下所示,点击提交按钮后,登录功能将重定向到Flask应用程序中的成功功能。

Displaying the welcome message in the web browser

结论

本教程旨在帮助您设置Python Flask API Docker容器的过程,使用Docker镜像。您还了解了如何使用Dockerfiles启动Python Flask容器,这使您能够编辑和构建自定义选择的容器。

那么您有没有其他应用程序打算部署在Docker容器上呢?也许是一个Docker MongoDB容器?

Source:
https://adamtheautomator.com/python-flask-api/