FastAPI 应用的容器化与 Docker 部署:提升性能与可扩展性
FastAPI 应用的容器化与 Docker 部署:提升性能与可扩展性
目录
- 🐳 使用 Docker 容器化 FastAPI 应用
- ⚙️ 使用 Docker Compose 管理多个服务的部署
- 🚀 在 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。
相关文章:

FastAPI 应用的容器化与 Docker 部署:提升性能与可扩展性
FastAPI 应用的容器化与 Docker 部署:提升性能与可扩展性 目录 🐳 使用 Docker 容器化 FastAPI 应用⚙️ 使用 Docker Compose 管理多个服务的部署🚀 在 Docker 容器中部署与运行 FastAPI 应用 1. 🐳 使用 Docker 容器化 FastAPI…...

QT入门的一些吐槽
QT入门的一些吐槽 看了网上的一些介绍QT的课程,看了一些讲述qt的书籍,然而再想自己做一个项目的时候,却发现我好像什么都不会,QT对我来说就是一个黑盒子。 我只会: 使用QT Creator创建一个项目,再UI文件中…...

4.Spring AI Prompt:与大模型进行有效沟通
1.什么是提示词 在人工智能领域,提示词(Prompt)扮演着至关重要的角色,它宛如一把精准的钥匙,为 AI 大模型开启理解之门。作为向模型输入的关键信息或引导性语句,提示词能够助力模型迅速洞悉问题需求&#…...

深入内核讲明白Android Binder【二】
深入内核讲明白Android Binder【二】 前言一、Binder通信内核源码整体思路概述1. 客户端向服务端发送数据流程概述1.1 binder_ref1.2 binder_node1.3 binder_proc1.4 binder_thread 2. 服务端的binder_node是什么时候被创建的呢?2.1 Binder驱动程序为服务创建binder…...

Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...

TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG
注:本文为“TCP 连接状态标识”相关文章合辑。 TCP 的状态:SYN, FIN, ACK, PSH, RST, URG 简介及 ACK 确认机制 llzhang_fly 于 2020-09-19 05:25:26 发布 1、TCP 的状态 FLAGS 字段状态 在 TCP 层,有个 FLAGS 字段,这个字段有…...

WXML模版语法-事件绑定
知识点1:什么是事件 事件是渲染层到逻辑层的通讯方式。通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务的处理。 知识点2:小程序中常用的事件 类型绑定方式事件描述tapbindtap或bind:tap手指触摸后马上离开,类似于…...

楚慧杯Web
WEB1 计算器 import requests rrequests.session() data{"answer":0} url"" for i in range(30):if i0:rrequests.get(url)dr.textdd.split(":")[22][1:].split("<br>")[0]data["answer"]str(eval(d))print(eval(d)…...

工商业储能电站能量管理本地系统及多站点云平台
一、储能站就地监控 Acre1-2000MG储能能量管理系统是针对工商业储能电站研制的本地化能量管理系统,可实现了储能电站的数据采集、数据处理、数据存储、数据查询与分析、可视化监控、报警管理、统计报表、策略管理、历史曲线等功能。其中策略管理,支持多…...

HTML标签笔记
黑马程序员视频地址:黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes 标题与段落 标题 <h1>~<h6> 段落 <p…...

pthread_create函数
函数原型 pthread_create 是 POSIX 线程(pthread)库中的一个函数,用于在程序中创建一个新线程。 #include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *a…...

C# 并发和并行的区别--16
目录 并发和并行 一.并发 定义 特点 代码示例 代码解释 二.并行 定义 特点 在C#中的体现 代码示例 代码解释 三.并发和并行的区别 四 .如何在C#中选择并发还是并行 1.考虑任务类型 2.代码示例 3.注意事项 五.总结 并发和并行 在编程领域,并发和并行是两个密切…...

Java日志配置
1.导入依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.23.1</version></dependency><dependency><groupId>org.apache.logging.log4j</groupI…...

python中的RPA->playwright自动化录制脚本实战案例笔记
playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器:cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令: playwright codegen…...

Linux查看日志命令
问题排查过程: 1. 评估问题现象是否是操作问题,还是服务bug,页面出异常信息是后端,没抛异常信息有可能是前端渲染问题,F12抓包看那个字段没有数据(有时候需要前端帮忙确定是哪一个字段)&#x…...

(8)ERC20详细介绍
ERC20 是以太坊上的一种代币标准(同质化代币),由 Fabian Vogelsteller 在 2015 年提出。它定义了一组通用的接口和规则,使得开发者可以创建可互操作的代币。ERC20 代币在以太坊生态系统中非常流行,广泛应用于各种去中心…...

opencv projectPoints函数 computeCorrespondEpilines函数 undistortPoints函数
opencv projectPoints函数 cv::projectPoints 是 OpenCV 中用于将三维点投影到二维图像平面的函数。它通常用于计算在相机坐标系下的三维点在图像坐标系中的位置,考虑了相机的内参和外参。 函数原型 void cv::projectPoints(InputArray objectPoints,InputArray …...

springboot集成websocket实现实时大量数据,效率性能高
前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下! 也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习&…...

游戏引擎学习第80天
Blackboard:增强碰撞循环,循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改,以便实现一些新的功能。具体来说,是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏,目标是构建一些更丰富…...

Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步
在 Windows 上的 MySQL 8.4.3 和 WSL(Ubuntu)的 MySQL 8.0.40 之间配置 主从同步(Master-Slave Replication) 的过程略有不同,因为两者的 MySQL 版本和环境存在差异。以下是详细步骤,帮助你完成跨平台的主从…...

【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
: 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中,博主将带大家去学习所谓的…...

Sentinel配置流控规则详解
前言 在微服务架构中,流量控制(Flow Control)是保障服务稳定性的重要手段之一。Sentinel作为一款开源的流量控制、熔断降级Java库,以其丰富的应用场景和完善的监控能力,在微服务保护中扮演了重要角色。本文将详细介绍…...

解锁动态规划的奥秘:从零到精通的创新思维解析(6)
解锁动态规划的奥秘:从零到精通的创新思维解析(6) 前言: 在动态规划的众多问题中,多状态DP问题是一个非常重要的类别。它的难点在于如何设计合适的状态表示和转移方程,从而高效地解决问题。 多状态DP的核…...

Qwen2.5 3B、7B、14B在文本按照规范进行标准化改写任务上的表现
任务介绍:军事杂志方向资料标准化改写任务 1. 任务目标 本任务的目标是对军事杂志领域的非标准化资料进行改写,确保其符合军事文献的写作规范和标准格式。通过改写,保留原文的核心内容和信息,同时提升语言的准确性、简洁性和专业…...

Oracle报错ORA-01078、LRM-00109
虚拟机异常关机后,rac数据库备机无法启动数据库,报错如下 解决方法: 找到如下路径文件 执行: cp init.ora.016202516818 /u01/app/oracle/product/19.3.0/db/dbs/ mv init.ora.016202516818 initplm2.ora 再次进入命令行sqlpl…...

免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)
哈喽大家好,欢迎来到虚拟化时代君(XNHCYL),收不到通知请将我点击星标!“ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…...

Titans 架构中的记忆整合:Memory as a Context;Gated Memory;Memory as a Layer
Titans 架构中的记忆整合 Titans 架构中的记忆整合 Memory as a Context(MAC)变体:在处理长序列数据时,将序列分段,对于当前段 S ( t ) S^{(t)}...

无缝过渡:将 Ansys 子结构模型转换为 Nastran
了解如何将 Ansys 子结构模型无缝转换为 Nastran,以满足有效载荷动态模型要求 Ansys 子结构模型的优势 Ansys 子结构模型为从事大型装配体结构分析和仿真的工程师和分析师提供了多项优势。 这些模型通过将复杂结构划分为更小、更易于管理的子结构,可以…...

小哆啦的跳跃挑战:能否突破迷宫的极限?
小哆啦开始力扣每日一题的第六天 https://leetcode.cn/problems/jump-game/description/ 小哆啦的跳跃挑战:能否突破迷宫的极限? 第一阶段:小哆啦的初次尝试 —— 盲目跳跃 小哆啦刚进入跳跃之城,他决定采用一种非常直接的方法来…...

KubeSphere部署安装,接入KubeKey安装的k8s集群
KubeSphere安装接入KubeKey安装的k8s集群 文章目录 KubeSphere安装接入KubeKey安装的k8s集群 一.NFS安装配置1.服务器安装NFS服务2.下载并部署 NFS Subdir External Provisioner1).下载部署文件2).创建 NameSpace3).创建 RBAC 资源4).配置 deployment.yaml5).部署 Storage Clas…...