使用Docker部署你的uvicorn应用(基于fastApi+Peewee)

4,566 阅读2分钟

前面一篇文章简单和大家聊了下如何快速使用fastapi和peewee开发后台应用,这一期我们一起聊聊如何使用docker部署上线,废话不多说,开始正文

背景

关于Docker的好处在这里就不赘述了,点开这篇文章的大多数应该都对Docker有了一个基本的了解,在我看来Docker的好处有二

  • 规范化的应用发布,通过Docker把环境变量的设置等内容统一化、规范化,减轻了应用发版的工作量
  • 流程化的应用更新,有了Docker我们把更多的注意力集中到了应用开发,包括编译、打包、发版等内容都做了流程化的约束,避免出现项目实际开发中,你代码坑我,我环境坑你的情况的发生

环境准备

docker环境说明

docker的环境如下图所示

项目Dockerfile文件

# 使用python镜像自定义我们的镜像
FROM python:latest
#创建/app目录
RUN mkdir /app

#将项目文件内的requirements.txt拷贝到/app
COPY ./requirements.txt /app

#切换到/app目录
WORKDIR /app
#使用豆瓣源https://pypi.douban.com/simple安装项目的python依赖
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple
#将内部的6000端口暴露出去
EXPOSE 6000
#使用uvicorn启动应用,IP为0.0.0.0,端口为6000(这里的端口是600,那么EXPOSE暴露的端口也必须是这个)
ENTRYPOINT ["uvicorn","main:app","--host","0.0.0.0","--port","6000","--reload"]

详细步骤

首先将项目的代码全部上传到服务器指定目录,此处我们上传到/root/project/DayTodoApi,以上Dockerfile文件也同样在该目录下,详细的目录结构可以参考源码,然后登录服务器,切换到项目目录,执行如下指令

# 在当前目录,依据当前目录内的Dockerfile构架镜像,镜像名称为wangss/daytodo版本为1.0,全称为wangss/daytodo:1.0
docker build -t wangss/daytodo:1.0 .

如上显示Successfully built即为创建镜像成功,然后根据镜像启动容器

#根据镜像wangss/daytodo:1.0,创建容器名称为dayTodo,将应用内的6000端口向外映射为8001端口,将主机的/root/project/DayTodoApi目录映射到容器内的/app目录
 docker run --name dayTodo -d \
 -p 8001:6000 \
 -v /root/project/DayTodoApi:/app\
 wangss/daytodo:1.0

使用

docker ps

指令查看容器是否创建成功

如上图所示,那么说明容器创建成功,我们做个简单的测试,代码中有如下测试用代码

# main.py
@app.get('/')
def hello():
    return {'name': 'Hello Wolrd'}

执行执行curl指令,查看返回结果

curl http://localhost:8001

总结

问题总结

在实际部署时,最开始使用的镜像为python:3.7.6-alpine3.10,然后在使用pip安装依赖时,总是提示uvloop(uvicorn包所依赖的库)无法正确安装,切换到镜像python:latest(3.8.2)后没有该问题