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

devtools/2025/1/21 3:54:04/

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 镜像:

dockerfile"># 使用官方的 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 作为数据库主机名:

python">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 指令合并成一个,可以减少层数,从而减小镜像体积。
dockerfile"># 合并多个 RUN 指令以减少镜像层数
RUN apt-get update && \apt-get install -y build-essential && \pip install --no-cache-dir -r requirements.txt

3.2 使用 Docker 多阶段构建

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

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.ppmy.cn/devtools/152257.html

相关文章

镭速大文件传输视频文件预览实现原理

镭速可以支持视频预览,在测试过程中需要大量不同格式的视频,如果直接去找各种格式的视频不太现实,所以就会用到一个视频格式转换的工具ffmpeg,本文将介绍ffmpeg的基本使用方法。FFmpeg 是一个免费开源的音视频处理工具&#xff0c…

Git 合并和 Git 变基有什么区别?

Git 合并(merge)和 Git 变基(rebase)是两种不同的整合分支的方法。它们的主要区别如下: Git 合并(merge) • 操作方式:将两个分支的历史记录合并在一起,生成一个新的合…

MYSQL的第一次作业

目录 前情提要 题目解析 连接并使用数据库 创建employees表 创建orders表 创建invoices表 ​查看建立的表 前情提要 需要下载mysql并进行配置,建议下载8.0.37,详情可见MySQL超详细安装配置教程(亲测有效)_mysql安装教程-CSDN博客 题目解析 …

UnityEditor脚本:调用ADB推送文件到手机

因为经常要直接把工程文件推入到手机上跑真机测试,就做了一个,在工程内选中文件,推送到手机的简单脚本。 这里的根据项目需要,按文件的目录结够push进手机,如果只是推buddle,会更简单点,不做拓…

Redis 中 TTL 的基本知识与禁用缓存键的实现策略(Java)

目录 前言1. 基本知识2. Java代码 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 单纯学习Redis可以看我前言的Java基本知识路线!! 对于Java的基本知识推荐阅读: java框架…

一文读懂服务器的HBA卡

什么是 HBA 卡 HBA 卡,全称主机总线适配器(Host Bus Adapter) ,是服务器与存储装置间的关键纽带,承担着输入 / 输出(I/O)处理及物理连接的重任。作为一种电路板或集成电路适配器,HBA…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证。

MySQL 主从同步是一种数据库复制技术,它通过将主服务器上的数据更改复制到一个或多个从服务器,实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器,并在从服务器上执行这些日志中的操作。 MySQL主从同步是基…

【C++学习篇】哈希表的实现

目录 1.哈希的概念 1.1 直接定址法 1.1.1 例题 字符串中的第一个唯一字符 1.2 哈希函数 1.2.1除法散列法/除留余数法 1.2.2 乘法散列法 1.3 哈希冲突 1.4 负载因子 1.5 处理哈希冲突 1.5.1 开放定址法 1.5.1.1 线性探测 1.5.1.2 二次探测 1.5.1.3 双重探测 1.哈…