Python Docker FastAPI快速开发部署RESTful API
文章目录
本文介绍如何快速使用Python, Docker, FastAPI快速开发RESTful API,以及如何编译为Docker镜像,使用Docker容器运行程序。
预备知识
在开始开发之前,需要先安装Python和Docker。
Python是一种流行的编程语言,因此在许多操作系统上都可以很容易地安装。可以使用Miniconda,也可以使用官方提供的标准安装包进行安装,个人喜欢Miniconda,不会像Anaconda那么大,同时又提供了非常多必要的依赖模块。
而Docker则是一种容器化平台,可帮助我们轻松地将应用程序封装在容器中,便于部署和管理。目前Windows、Linx、macOS对Docker的支持也非常的完善了。
FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。
初始化项目及运行环境
Python没有像Java那样极其成熟的一站式的Maven项目管理工具,但是Python有其自身的简洁与规范。像pyproject.toml,以及最近用Rust写的rye,都是很出色的工具。本文使用的例子,完全使用手动管理即可😄
创建一个项目目录my-project,创建文件requirements.txt
,main.py
,Dockerfile
,后面逐一填写里面的内容。
上面我们安装了Miniconda,建议使用conda来创建一个独立的运行环境,这样即不会影响其他项目的运行环境,还可以保持本项目运行环境的整洁。
|
|
这个命令创建一个名为my-project
的运行环境,同时安装3.9版本的Python,和最新的pip
工具。
然后激活这个运行环境
|
|
添加依赖模块
我们使用requirements.txt
来管理程序依赖的模块,requirements.txt
文件内容如下
|
|
本文只需要用到这两个模块。第一行的-i
指定pip使用阿里pypi镜像地址,如果在国内这会大大加快依赖安装的速度,可以换成阿里或者其他的镜像源。
在本地开发电脑上可以使用下面的命令安装依赖
|
|
编写代码
Python代码
FastAPI非常容易使用,也非常适合快速开发RESTful API。以下是我们快速入门的示例代码:
|
|
在这个简单的示例中,我们创建了一个FastAPI应用程序,它包括两个路由。第一个路由处理根路径并返回一个简单的“Hello World”字符串。第二个路由处理传递给它的路径参数,并返回这些参数的值。第二个路由会以json格式响应内容给调用者(FastAPI框架会自动帮我们字典转换为json数据)。
本地运行
编写完上面的代码,使用命令uvicorn main:app --host 0.0.0.0 --port 8080 --reload
启动程序。--reload
选项开启了文件更改后自动重启应用。main
是模块的名称,冒号后面的app
是实例化FastAPI对象的变量名,可以更换成适合应用场景的名称。
FastAPI还有一个贴心的功能是内置了swagger-ui
的支持,访问 http://localhost:8080/docs 既可看到所有接口列表,如下图
写生产代码的时候,除了单元测试,还可以通过这个界面进行调试与开发,相当的方便。
Docker配置文件
先来看看整个目录结构
|
|
上面写的Python代码本文希望放在一个Docker容器来运行,需要编写一个Dockerfile配置文件,进行Docker镜像的编译。将FastAPI应用程序部署到Docker容器中可以方便地处理依赖关系,并且易于部署到各种环境中。以下是如何编写一个简单的Dockerfile:
|
|
- 指定使用python 3.9基础镜像
- 指定容器工作目录为
/app
- 设置容器的时区
- 拷贝
requirements.txt
到容器 - 使用
requirements.txt
安装python依赖,并且不缓存下载的依赖包 - 拷贝代码到工作目录
/app
- 暴露端口到容器外
- 指定容器启动时的执行命令
构建和运行Docker容器
在终端窗口中,导航到Dockerfile所在的目录,并输入以下命令以构建Docker镜像:
|
|
此命令将构建名为my_fastapi_app的Docker镜像。接下来,您可以使用以下命令运行容器:
|
|
此命令将启动Docker容器,并将容器端口8080映射到主机的端口8080。运行后,可以使用http://localhost:8080
访问FastAPI应用程序。
总结
通过以上步骤,我们成功地将FastAPI应用程序部署到了Docker容器中。这种方式使得我们可以轻松地管理应用程序的依赖关系,并且能够在不同的环境中快速部署应用程序。