[flask+gunicorn+docker] Cree un proyecto de flask simple e impleméntelo en un contenedor acoplable

Cree un proyecto de matraz simple e impleméntelo en un contenedor acoplable

Requisitos:
1. Reempaquetar la API del método de notificación de Lark en una API que se acerque más a los requisitos
2. Proporcionar servicios de solicitud para la interfaz API

El método de implementación seleccionado:
1. Escriba funciones relacionadas, basadas principalmente en la API que solicita Lark
2. Elija flask para escribir la API
3. Use gunicorn + gevent para iniciar el servicio flask
4. Encapsule el servicio en la imagen de la ventana acoplable

El enfoque de este artículo:
1. Cómo crear rápidamente un proyecto de matraz simple
2. Cómo usar gunicorn para iniciar el servicio de matraz
3. Paquete Docker y detalles relacionados de ejecución

Introducción básica

  • Flask : uno de los dos marcos más populares para Python (django, flask), el peso ligero es la característica más importante.
  • Gunicorn : Es posible que aquellos que solo están familiarizados con el desarrollo con Java o PHP no comprendan la implementación de Python al principio. La aplicación Flask es una aplicación Python que cumple con la especificación WSGI y no se puede ejecutar de forma independiente (el método similar a app.run es solo adecuado para el modo de desarrollo) Necesidad de depender de otros componentes para proporcionar funciones de servidor.
  • gevent : gunicorn utiliza un modelo de red de bloqueo síncrono (-k sync) de forma predeterminada, que puede no funcionar lo suficientemente bien para un gran acceso concurrente. Usamos convenientemente un gevent para aumentar la concurrencia
  • Docker : El contenedor puede entenderse como una "caja negra". Una vez que el proyecto se vuelve enorme, a menudo tenemos dificultades para gestionar la implementación y el mantenimiento de todo el proyecto. Si empaquetamos todo el proyecto en un "contenedor", entonces solo necesitamos mantener un archivo de configuración para decirle a la computadora qué poner en el "contenedor" para cada implementación, e incluso tomar prestadas algunas herramientas para automatizar este proceso y la implementación. será más fácil Muy conveniente.

Este párrafo es una reproducción de: Flask + Docker Brainless Deployment Novice Tutorial , que también es el blog que más me ayudó, es conciso y conciso, se recomienda leer.

1. Crea un proyecto de matraz simple

Como no hay ninguna base de datos involucrada, podemos agregar directamente un archivo app.py en el directorio raíz:

# ./app.py
from gevent import monkey
monkey.patch_all()

from flask import Flask
from flask_cors import CORS
from lark_api import lark_api

# 创建Flask对象
app = Flask(__name__,
            template_folder="public",
            static_folder="public",
            static_url_path="/")
# 将在其他文件 lark_api.py 声明的蓝图 lark_api 在 app 上进行注册
app.register_blueprint(lark_api)
# 跨域请求
CORS(app, supports_credentials=True, origins="*")

# 这里是为了方便后续测试服务是否跑起来
@app.route('/')
def HelloDockerFlask():
    return 'Hello Docker Flask!'


if __name__ == "__main__":
    app.run(debug=True)

Aquí hay un ejemplo simple del método de registro del blueprint en lark_api.py y la declaración e implementación de la API:

from flask import Blueprint
# 创建蓝图对象
lark_api = Blueprint("lark_api", __name__)
# API声明:分别是自定的url和请求方式
@lark_api.route("/api/lark/card_message", methods=["POST"])
def card_message():
	## TODO

Vaya al directorio raíz, ejecute los siguientes comandos en la terminal y luego podrá ejecutar el servicio web que viene con flask

python app.py

inserte la descripción de la imagen aquí
Se puede ver que el servicio se inició con éxito, pero el servicio web que viene con flask es relativamente débil. Si cierra el terminal o excede el retraso, el servicio se cerrará, por lo que solo es adecuado para desarrollo y pruebas, no adecuado para la implementación de producción, por lo que usaremos gunicorn para iniciar el servicio del matraz más adelante.

2. Utilice gunicorn+gevent para iniciar el servicio del matraz.

Instalación rápida mediante pip

pip install gunicorn gevent

PD: Cabe señalar que actualmente gunicorn solo se puede ejecutar en el entorno Linux y no es compatible con la plataforma Windows.
Creamos un nuevo archivo gunicorn.conf.py en el directorio raíz

# ./gunicorn.conf.py
workers = 5    # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent"   # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:3000" # 设置端口,这里注意要设置成0.0.0.0,如果设置为127.0.0.1的话就只能本地访问服务了

Después de crear gunicorn.conf.py, podemos iniciar el servicio flask a través de gunicorn.

gunicorn app:app -c gunicorn.conf.py

La primera aplicación representa el archivo app.py; la segunda aplicación representa el objeto flask creado.

3. Utilice Docker para encapsular el servicio del matraz.

(1) Escritura de Dockerfile

Cree un archivo Dockerfile en el directorio raíz, contenido:

# 基于的基础镜像,这里使用python,开发版本是 3.x ,基础镜像也写 3.x 就可以,这样可以保持版本一致,避免 Python 版本差异带来的问题
FROM python:3.10 
# /app 是要部署到服务器上的路径
WORKDIR /app
# Docker 避免每次更新代码后都重新安装依赖,先将依赖文件拷贝到项目中
COPY requirements.txt requirements.txt
# 执行指令,安装依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# COPY指令和ADD指令功能和使用方式类似。只是COPY指令不会做自动解压工作。
# 拷贝项目文件和代码
COPY . .
# 执行指令,字符串间是以空格间隔
CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]

PD: Pisé una trampa aquí. FROM python:3.10 comenzó a escribir 'python' en mayúscula. Tenga en cuenta que aquí debe estar en minúsculas; de lo contrario, la ventana acoplable de compilación posterior fallará. Especulo que otros campos, excepto FROM, también necesitan minúsculas.

(2) Crear una imagen acoplable

docker build -t 'noticedemo' .

notadoemo es el nombre de la imagen creada, que usted mismo puede modificar.
Cabe señalar que este proceso lleva un poco de tiempo: la primera creación debe extraer la imagen base y también lleva tiempo instalar las dependencias.
Una vez completada la compilación, vea la lista de espejos mediante el siguiente comando y podrá encontrar que notadoemo se muestra en ella.

docker images

(3) Inicie el contenedor para ejecutar la imagen de la ventana acoplable

Entorno de producción en ejecución (en modo demonio)

docker run -d -p 3000:3000 noticedemo

-d: ejecutar como demonio
-p: especificar la asignación de puertos, el formato es: puerto de host (host): puerto de contenedor
Se pueden pasar más parámetros docker -help查看.

(4) Algunos otros comandos de Docker de uso común

# 列出所有镜像 
docker images
# 列出容器(运行中的)
docker ps
# 列出所有的容器(包括未运行的)
docker ps -a 
# 运行/停止容器
docker start/stop [CONTAINER ID]
# 删除容器
docker rm [CONTAINER ID]
# 删除镜像
docker rmi [IMAGE ID]

4. Cómo prestar servicios a los usuarios

Si se trata de un servicio API público y de código abierto, puede enviar la imagen a la nube acoplable para compartirla. Los usuarios solo necesitan extraer su imagen para ejecutar el servicio en el servidor que desean implementar; pero en realidad existe una forma más sencilla de hacerlo. uso interno
. El archivo completo del proyecto se carga en gitlab u otras plataformas similares. Aquellos que necesitan usar el servicio pueden implementar de manera flexible el servicio en el servidor que desean implementar simplemente extrayendo el código -> creando una imagen acoplable -> iniciando el contenedor para ejecutar la imagen de la ventana acoplable;
No olvide escribir el documento README, que incluye principalmente el comando para iniciar el contenedor para ejecutar la imagen de la ventana acoplable y el documento de la aplicación API.

Supongo que te gusta

Origin blog.csdn.net/MarsherS/article/details/125630216
Recomendado
Clasificación