当前位置: 首页 > news >正文

FastAPI 应用的容器化与 Docker 部署:提升性能与可扩展性

FastAPI 应用的容器化与 Docker 部署:提升性能与可扩展性


目录

  1. 🐳 使用 Docker 容器化 FastAPI 应用
  2. ⚙️ 使用 Docker Compose 管理多个服务的部署
  3. 🚀 在 Docker 容器中部署与运行 FastAPI 应用

1. 🐳 使用 Docker 容器化 FastAPI 应用

容器化已经成为现代应用开发和部署的核心理念之一。Docker 提供了一个轻量级、可移植、易于部署的环境,可以将 FastAPI 应用及其所有依赖打包在一个容器中,确保在不同环境下的行为一致性。容器化不仅简化了开发流程,还提升了应用的可扩展性和灵活性。

1.1 Docker 容器化的基本原理

Docker 容器是一个轻量级、可移植的执行环境,包含了应用及其所有的运行时依赖。与传统的虚拟机不同,Docker 容器不需要模拟整个操作系统,而是直接使用宿主操作系统的内核,这使得容器启动非常快速,且资源消耗低。每个 Docker 容器都运行在隔离的环境中,确保了不同服务和应用间的相互独立性。

Docker 的基本构件有:

  • 镜像 (Image):包含应用及其所有依赖的文件系统和配置,是容器的蓝图。
  • 容器 (Container):镜像的实例,在容器中运行应用。
  • Dockerfile:描述如何构建 Docker 镜像的文本文件,包含了镜像的配置和依赖安装的步骤。

1.2 构建 Docker 镜像

为了将 FastAPI 应用容器化,首先需要创建一个 Dockerfile 来构建镜像。以下是一个简单的 Dockerfile,演示如何为 FastAPI 应用构建 Docker 镜像:

# 使用官方的 Python 镜像作为基础镜像
FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 复制当前目录下的文件到容器内
COPY . /app# 安装 FastAPI 和 Uvicorn
RUN pip install --no-cache-dir -r requirements.txt# 开放 8000 端口
EXPOSE 8000# 设置启动命令,使用 Uvicorn 运行 FastAPI 应用
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
  • FROM python:3.9-slim:使用 Python 3.9 官方基础镜像。
  • WORKDIR /app:设置容器内的工作目录。
  • COPY . /app:将当前目录的内容复制到容器的工作目录。
  • RUN pip install:安装项目所需的依赖。
  • EXPOSE 8000:声明容器将监听的端口。
  • CMD [“uvicorn”, “main:app”, “–host”, “0.0.0.0”, “–port”, “8000”]:使用 uvicorn 启动 FastAPI 应用。

1.3 构建与运行 Docker 镜像

构建 Docker 镜像的命令如下:

docker build -t fastapi-app .

然后可以通过以下命令运行 Docker 容器:

docker run -d -p 8000:8000 fastapi-app

这将会启动 FastAPI 应用,并将容器的 8000 端口映射到宿主机器的 8000 端口。

1.4 验证 FastAPI 容器化应用

通过浏览器访问 http://localhost:8000,或者使用 cURL 进行请求,检查 FastAPI 应用是否正常工作:

curl http://localhost:8000

如果返回 FastAPI 的默认欢迎页面,说明应用已经成功容器化并正常运行。

2. ⚙️ 使用 Docker Compose 管理多个服务的部署

当涉及到微服务架构时,单一的容器化应用可能不够,通常需要多个服务进行协调工作。Docker Compose 提供了一个便捷的方式来定义和管理多个容器的配置,简化了多服务的部署流程。

2.1 Docker Compose 的工作原理

Docker Compose 允许用户使用一个 YAML 文件来定义多个 Docker 容器服务及其配置。在一个 Compose 配置文件中,可以描述服务的构建、网络、卷以及其他依赖项。通过 docker-compose up 命令,可以一次性启动所有定义的服务,并在多个容器之间建立网络连接。

2.2 创建 Docker Compose 配置文件

以下是一个简单的 docker-compose.yml 文件,演示如何使用 Docker Compose 启动 FastAPI 应用和数据库服务:

version: '3.8'services:fastapi-app:build: .ports:- "8000:8000"depends_on:- dbnetworks:- backenddb:image: postgres:13environment:POSTGRES_USER: userPOSTGRES_PASSWORD: passwordPOSTGRES_DB: fastapi_dbports:- "5432:5432"networks:- backendnetworks:backend:driver: bridge

在这个 docker-compose.yml 文件中,定义了两个服务:

  • fastapi-app:FastAPI 应用的服务,使用当前目录下的 Dockerfile 构建镜像,并将容器的 8000 端口映射到宿主机的 8000 端口。
  • db:一个 PostgreSQL 数据库服务,使用官方的 PostgreSQL 镜像,并通过环境变量配置数据库的用户名、密码和数据库名。

这两个服务都连接到了名为 backend 的 Docker 网络,确保它们能够相互通信。

2.3 启动和管理服务

运行以下命令来启动所有服务:

docker-compose up --build

该命令将会构建镜像(如果有更新),并启动 FastAPI 应用和 PostgreSQL 数据库容器。通过访问 http://localhost:8000 可以验证 FastAPI 应用是否已正确启动并运行。

2.4 服务间的通信

由于这两个服务处于同一个 Docker 网络 backend,因此它们可以通过容器名相互访问。例如,在 FastAPI 应用中,连接 PostgreSQL 数据库时,使用数据库容器的服务名 db 作为数据库主机名:

import asyncpg
import asyncioasync def fetch_data():conn = await asyncpg.connect(user='user', password='password', database='fastapi_db', host='db')result = await conn.fetch('SELECT * FROM users')await conn.close()return result# 在 FastAPI 路由中调用 fetch_data()

通过 host='db' 使 FastAPI 应用可以通过容器名 db 访问数据库,而不需要配置具体的 IP 地址。

3. 🚀 在 Docker 容器中部署与运行 FastAPI 应用

在容器中部署 FastAPI 应用不仅提供了开发与生产环境的一致性,还使得应用能够更加灵活地扩展和管理。以下是将 FastAPI 应用部署到 Docker 容器中的一些优化技巧和最佳实践。

3.1 优化 Dockerfile 构建过程

为了提高镜像构建效率,减少镜像体积,可以使用以下技巧:

  • 缓存机制:在 Dockerfile 中尽量将变动频繁的步骤放在文件的后面,这样 Docker 可以缓存不变的步骤,从而减少构建时间。
  • 合并 RUN 指令:将多个 RUN 指令合并成一个,可以减少层数,从而减小镜像体积。
# 合并多个 RUN 指令以减少镜像层数
RUN apt-get update && \apt-get install -y build-essential && \pip install --no-cache-dir -r requirements.txt

3.2 使用 Docker 多阶段构建

多阶段构建可以帮助分离构建环境和运行环境,从而减少最终镜像的体积。以下是一个使用多阶段构建的 Dockerfile 示例:

# 第一阶段:构建阶段
FROM python:3.9-slim AS builderWORKDIR /app
COPY . /app
RUN pip install --no-cache-dir -r requirements.txt# 第二阶段:运行阶段
FROM python:3.9-slimWORKDIR /app
COPY --from=builder /app /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packagesEXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

在多阶段构建中,第一阶段用于安装依赖

和构建,而第二阶段只复制所需的构建结果,减小了最终镜像的体积。

3.3 Docker 容器与 CI/CD 集成

使用 Docker 容器化应用时,可以轻松地将其集成到 CI/CD 流程中,自动化测试、构建和部署。通过结合 GitLab CI、GitHub Actions 或 Jenkins 等工具,可以在每次提交时自动构建 Docker 镜像并进行部署。

以下是 GitHub Actions 的示例配置,自动构建 Docker 镜像并推送到 Docker Hub:

name: Build and Push Docker Imageon:push:branches:- mainjobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v2- name: Set up Docker Buildxuses: docker/setup-buildx-action@v1- name: Cache Docker layersuses: actions/cache@v2with:path: /tmp/.buildx-cachekey: ${{ runner.os }}-buildx-${{ github.sha }}restore-keys: |${{ runner.os }}-buildx-- name: Build and push Docker imageuses: docker/build-push-action@v2with:context: .push: truetags: username/fastapi-app:latest

这个 GitHub Actions 配置会在 main 分支有新的提交时,自动构建 FastAPI 应用的 Docker 镜像,并推送到 Docker Hub。

http://www.lryc.cn/news/522428.html

相关文章:

  • QT入门的一些吐槽
  • 4.Spring AI Prompt:与大模型进行有效沟通
  • 深入内核讲明白Android Binder【二】
  • Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)
  • TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG
  • WXML模版语法-事件绑定
  • 楚慧杯Web
  • 工商业储能电站能量管理本地系统及多站点云平台
  • HTML标签笔记
  • pthread_create函数
  • C# 并发和并行的区别--16
  • Java日志配置
  • python中的RPA->playwright自动化录制脚本实战案例笔记
  • Linux查看日志命令
  • (8)ERC20详细介绍
  • opencv projectPoints函数 computeCorrespondEpilines函数 undistortPoints函数
  • springboot集成websocket实现实时大量数据,效率性能高
  • 游戏引擎学习第80天
  • Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步
  • 【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
  • Sentinel配置流控规则详解
  • 解锁动态规划的奥秘:从零到精通的创新思维解析(6)
  • Qwen2.5 3B、7B、14B在文本按照规范进行标准化改写任务上的表现
  • Oracle报错ORA-01078、LRM-00109
  • 免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)
  • Titans 架构中的记忆整合:Memory as a Context;Gated Memory;Memory as a Layer
  • 无缝过渡:将 Ansys 子结构模型转换为 Nastran
  • 小哆啦的跳跃挑战:能否突破迷宫的极限?
  • KubeSphere部署安装,接入KubeKey安装的k8s集群
  • Object常用的方法及开发中的使用场景