利用Docker打包部署python下的FastApi

前言

一为的wordpress主题WebStack Pro 内置了前端百度、知乎、微博等热门排名榜数据。据一为所说,其实他也是通过爬取获取的数据,再通过API的形式展现出来,所以我们获得主题之后要向作者免费索取token才行。
我的网站是做金融的,对默认自带的热门徘行榜没有兴趣。于是乎我就利用python的FastAPI 做了一个API接口。

之前利用了宝塔在CentOS上搭建的python管理器功能轻松部署了FastApi, 但后来发现这个海外VPS的配置不行,而且比较慢,动不动内存就爆满,后来自己在家搭建了一个服务器然后通过frp弄成了外网。但发现直接用python来部署不美观,所以直接改为用dockerfile来生成docker打包部署FastApi会比较符合美学原则。

准备工作

1、新建文件夹api
2、在文件夹下建立三个文件,分别是:

Dockerfile
requirements.txt
api.py

Dockerfile

FROM python:3.6
WORKDIR /home/xxxxx/api

COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY . .

CMD ["gunicorn", "api:app", "-w", "4", "-k","uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:5001"]

其中,第二行 WORKDIR 后面写的是python程序所在目录的路径

requirements.txt

pymysql
fastapi
uvicorn==0.12.0
starlette==0.13.6
gunicorn
uvloop
pandas
requests
httptools

api.py

import pymysql
from pymysql.cursors import DictCursor
from fastapi import FastAPI
import uvicorn
from starlette.middleware.cors import CORSMiddleware
import pandas as pd

app = FastAPI()

# 这里设置你自己网站的网址,主要防止别人盗用你的API
origins = ["https://cnvar.cn",
           "https://www.cnvar.cn",
           ]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)



@app.get("/{ann}/{item_id}")
async def read_item(ann:str, item_id: int):
    return_dict = {'code': 1, 'result': False, 'msg': '请求成功'}

    if ann=="fashenwei":
        if item_id==1:
            return_dict['result'] = sql_result(ann, "首发")
        elif item_id==2:
            return_dict['result'] = sql_result(ann, "可转债")
        elif item_id==3:
            return_dict['result'] = sql_result(ann, "配股")
        elif item_id==4:
            return_dict['result'] = sql_result(ann, "增发")
        else:
            return_dict['result'] = "nothing"
    elif ann=="erp":
        if item_id==1:
            return_dict['result'] = sql_result(ann, "China")
        else:
            return_dict['result'] = "nothing"
    else:
        return_dict['result'] = "nothing"

    return return_dict


# 功能函数, 下面为数据库的信息
def sql_result(select, type):
    conn = pymysql.connect(host='127.0.0.1', database='XXXXXXXX', user='XXXXXXX', password='XXXXXXXXX')
    cursor = conn.cursor(DictCursor)
    if select=='fashenwei':
        cursor.execute("SELECT time, excerpt, title, type, url FROM fashenwei WHERE type= '%s'  ORDER BY time DESC LIMIT 10" % str(type))
    elif select=='erp':
        cursor.execute("SELECT * FROM erp WHERE Country= '%s' LIMIT 1" % str(type))
    result = cursor.fetchall()
    conn.close()
    return result


if __name__ == "__main__":
    uvicorn.run("api:app", port=5001)

构建Docker镜像

完成这三个文件的创建之后,在Dockerfile所在目录下(这里是/home/xxxxx/api)执行如下命令,就可以开始构建Docker镜像:

sudo docker build -t 'fastapi' .

接下来我们可以直接运行了:

临时运行docker镜像:

sudo docker run -it --rm -p 5001:5001 fastpi

可以看到Docker镜像成功地运行起来了,并处于阻塞状态。这时,我们打开浏览器,输入服务器外网 ip,可以我们的网站已经部署上去。

生产环境运行(以daemon方式运行)

sudo docker run -d -p 5001:5001 --name fastapione fastapi

参考

阅读量: | 柯西君_BingWong | 2020-11-23