FastAPI(62)- FastAPI 部署在 Docker

简介: FastAPI(62)- FastAPI 部署在 Docker

Docker 学习


https://www.cnblogs.com/poloyy/p/15257059.html

 

项目结构


.

├── app

│   ├── __init__.py

│   └── main.py

├── Dockerfile

└── requirements.txt

 

FastAPI 应用程序 main.py 代码


from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
    return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}


Dockerfile


# 1、从官方 Python 基础镜像开始
FROM python:3.9
# 2、将当前工作目录设置为 /code
# 这是放置 requirements.txt 文件和应用程序目录的地方
WORKDIR /code
# 3、先复制 requirements.txt 文件
# 由于这个文件不经常更改,Docker 会检测它并在这一步使用缓存,也为下一步启用缓存
COPY ./requirements.txt /code/requirements.txt
# 4、运行 pip 命令安装依赖项
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# 5、复制 FastAPI 项目代码
COPY ./app /code/app
# 6、运行服务
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]


第四步:运行 pip 命令解析

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

  • --no-cache-dir 选项告诉 pip 不要将下载的包保存在本地,因为只有当 pip 将再次运行以安装相同的包时才会这样,但在使用容器时情况并非如此
  • --no-cache-dir 只与pip有关,与 Docker 或容器无关
  • --upgrade 选项告诉 pip 升级已经安装的软件包
  • 因为上一步复制文件可能会被 Docker 缓存检测到,所以这一步也会在 Docker 缓存可用时使用
  • 在这一步中使用缓存会在开发过程中一次又一次地构建镜像时节省大量时间,而不是每次都下载并安装所有依赖项

 

Docker 缓存

这里有一个重要的技巧 Dockerfile,首先只复制依赖项的文件,而不是 FastAPI 应用程序代码

COPY ./requirements.txt /code/requirements.txt

  • Docker 和其他工具以增量方式构建这些容器映像,在另一层之上添加一层
  • 从 Dockerfile 的顶部(首行)开始,由 Dockerfile 的每个指令来创建任何文件
  • Docker 和其他工具在构建镜像时也是用内部缓存
  • 如果文件自上次构建容器镜像后没有更改,则它将重用上次创建的同一层,而不是再次复制文件并从头开始创建一个新的层
  • 仅仅避免文件副本并不一定会改善太多,但是因为它在该步骤中使用了缓存,所以它可以在下一步中使用缓存
  • 例如,它可以将缓存用于安装依赖项的指令

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

  • requirements.txt 不会经常改变,所以通过复制该文件,Docker 可以在该步骤中使用缓存
  • Docker 将能够使用缓存进行下一步下载和安装这些依赖项,这就是节省大量时间的地方
  • 下载并安装该软件包的依赖关系可能需要几分钟,但使用的缓存将只需要几秒
  • 由于在开发过程中一次又一次地构建容器镜像以检查代码更改是否有效,因此可以节省大量累积时间

COPY ./app /code/app

  • Dockerfile 尾部,复制 FastAPI 应用程序代码
  • 由于这是最常更改的内容,因此将其放在最后,在此步骤之后的任何内容都将无法使用缓存

 

构建 Docker Image


在 Dockerfile 打开命令行

docker build -t myimage .

 

查看镜像

docker images

image.png

启动 docker 容器


docker run -d --name mycontainer -p 80:80 myimage

 

查看容器

docker ps

image.png

访问 127.0.0.1/docs


image.png


带有 Gunicorn 的官方 Docker 镜像 - Uvicorn


  • 此镜像包含一个自动调整机制,可根据可用的 CPU 内核设置工作进程的数量
  • 它具有合理的默认值,但仍然可以使用环境变量配置文件更新所有配置
  • 此镜像上的进程数是根据可用的 CPU 内核自动计算的,它将尝试从 CPU 中榨取尽可能多的性能
  • 但这也意味着,由于进程数取决于容器运行的 CPU,消耗的内存量也将取决于此
  • 因此,如果应用程序消耗大量内存(例如使用机器学习模型),并且服务器有很 CPU 内核但内存很,容器最终可能会使用比可用内存更多的内存,这会大大降低性能(甚至崩溃)

 

官方栗子

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app


应用场景

  • 如果正在使用 Kubernetes,并且已经设置了集群级别的复制,就不应该使用此镜像,最好从头开始构建镜像
  • 如果应用程序足够简单以至于根据 CPU 设置默认进程数效果很好,不想费心在集群级别手动配置复制,并且运行的容器不会超过一个应用程序
  • 或者如果使用 Docker Compose 进行部署,在单个服务器上运行等

 

使用 poetry 的 docker  image


# 第一阶段:将仅用于安装 Poetry 并从 Poetry 的 pyproject.toml 文件生成带有项目依赖项的 requirements.txt。
FROM tiangolo/uvicorn-gunicorn:python3.9 as requirements-stage
# 将 /tmp 设置为当前工作目录;这是我们将生成文件requirements.txt的地方
WORKDIR /tmp
# 安装 poetry
RUN pip install poetry
# 复制
COPY ./pyproject.toml ./poetry.lock* /tmp/
# 生成 requirements.txt
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
# 这是最后阶段,在这往后的任何内容都将保留在最终容器映像中
FROM python:3.9
# 将当前工作目录设置为 /code
WORKDIR /code
# 复制 requirements.txt;这个文件只存在于前一个 Docker 阶段,这就是使用 --from-requirements-stage 复制它的原因
COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt
# 运行命令
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# 复制
COPY ./app /code/app
# 运行服务
CMD ["uvicorn", "app.1_快速入门:app", "--host", "0.0.0.0", "--port", "80"]


  • 第一阶段 Docker 是 Dockerfile 的一部分,它作为一个临时容器的镜像是仅用于生成一些文件供后面阶段使用
  • 使用 Poetry 时,使用 Docker 多阶段构建是有意义的
  • 因为实际上并不需要在最终容器镜像中安装 Poetry 及其依赖项,只需要生成的 requirements.txt 文件来安装项目依赖项

 

poetry 详细教程

https://www.cnblogs.com/poloyy/p/15267494.html

 

相关文章
|
9天前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
50 23
|
10天前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
43 22
|
13天前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
55 25
|
9天前
|
机器学习/深度学习 安全 PyTorch
FastAPI + ONNX 部署机器学习模型最佳实践
本文介绍了如何结合FastAPI和ONNX实现机器学习模型的高效部署。面对模型兼容性、性能瓶颈、服务稳定性和安全性等挑战,FastAPI与ONNX提供了高性能、易于开发维护、跨框架支持和活跃社区的优势。通过将模型转换为ONNX格式、构建FastAPI应用、进行性能优化及考虑安全性,可以简化部署流程,提升推理性能,确保服务的可靠性与安全性。最后,以手写数字识别模型为例,展示了完整的部署过程,帮助读者更好地理解和应用这些技术。
51 18
|
25天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
14天前
|
SQL 关系型数据库 MySQL
docker-compose部署mysql8
使用docker-compose容器化部署mysql8
|
2月前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
349 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
1月前
|
Java 应用服务中间件 Docker
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
49 2
|
2月前
|
Java Linux Docker
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
69 3
|
2月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用

热门文章

最新文章