Docker部署FastAPI实战
在现代 Web 开发领域,FastAPI 作为一款高性能的 Python 框架,正逐渐崭露头角,它凭借简洁的语法、快速的执行速度以及出色的类型提示功能,深受开发者的喜爱。而 Docker 容器化技术则为 FastAPI 应用的部署提供了便捷、高效且可移植的解决方案。本文将详细介绍如何使用 Docker 部署 FastAPI 应用的实战过程。
一、FastAPI 简介与项目准备
FastAPI 基于 Python 的类型提示构建,能够自动生成交互式文档,如 Swagger UI 和 ReDoc,这极大地方便了开发者进行 API 的开发与调试。在开始部署之前,首先需要创建一个简单的 FastAPI 项目。
假设我们已经安装好了 Python 和相应的虚拟环境管理工具(如 venv 或 pipenv)。创建一个新的项目目录,例如 fastapi-docker-project,在该目录下创建一个 main.py 文件作为 FastAPI 应用的入口点:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
这是一个非常基础的 FastAPI 应用,当访问根路径 / 时,会返回一个包含 "Hello, World!" 消息的 JSON 响应。
二、编写 Dockerfile
在项目目录下创建 Dockerfile,用于构建 Docker 镜像。以下是一个适用于 FastAPI 应用的 Dockerfile 示例:
# 使用官方的 Python 基础镜像,这里选择 Python 3.9
FROM python:3.9
# 设置工作目录
WORKDIR /app
# 将项目中的当前目录(.)下的所有文件复制到容器内的 /app 目录
COPY..
# 安装项目所需的依赖项
RUN pip install --no-cache-dir -r requirements.txt
# 暴露 FastAPI 应用运行的端口,这里假设应用运行在 8000 端口
EXPOSE 8000
# 定义容器启动时要执行的命令,启动 FastAPI 应用
CMD ["uvicorn", "main.py", "--host", "0.0.0.0", "--port", "8000"]
在上述 Dockerfile 中,首先选择了官方的 Python 3.9 镜像作为基础,然后设置工作目录为 /app,将项目文件复制到容器内,接着安装项目依赖项(假设项目有一个 requirements.txt 文件列出了依赖),最后暴露应用端口并指定启动命令。
三、构建 Docker 镜像
在包含 Dockerfile 的项目目录下,打开终端并执行以下命令构建 Docker 镜像:
docker build -t fastapi-app.
其中 -t 参数用于指定镜像的标签(tag),这里我们将镜像命名为 fastapi-app。构建过程可能需要一些时间,具体取决于项目的依赖项数量和网络速度。
四、运行 Docker 容器
镜像构建完成后,就可以运行 Docker 容器了:
docker run -d -p 80:8000 fastapi-app
上述命令中,-d 参数表示在后台运行容器,-p 参数用于将容器内的 8000 端口映射到宿主机的 80 端口。这样,我们就可以通过访问宿主机的 IP 地址或域名在浏览器中访问 FastAPI 应用了。例如,如果宿主机的 IP 地址是 192.168.1.100,那么在浏览器中输入 http://192.168.1.100 就可以看到 "Hello, World!" 的响应。
五、数据持久化(可选)
如果 FastAPI 应用需要处理数据并将其持久化存储,例如使用数据库,那么还需要考虑数据持久化的问题。在 Docker 中,可以使用数据卷(volume)来实现。
例如,如果应用使用 SQLite 数据库,并且数据库文件为 app.db,可以在运行容器时添加数据卷挂载:
docker run -d -p 80:8000 -v /data:/app/data fastapi-app
上述命令中,-v 参数表示挂载数据卷,将宿主机的 /data 目录挂载到容器内的 /app/data 目录,这样数据库文件就可以存储在宿主机的 /data 目录中,实现了数据的持久化,即使容器被删除或重新创建,数据也不会丢失。
六、容器网络配置(可选)
在一些复杂的部署场景中,可能需要对容器的网络进行配置。Docker 提供了多种网络模式,如默认的桥接网络(bridge)、主机网络(host)、覆盖网络(overlay)等。
如果需要让容器与其他容器或外部网络进行更灵活的通信,可以根据具体需求选择合适的网络模式并进行相应的配置。例如,如果有多个 FastAPI 应用容器需要相互通信,可以创建一个自定义的桥接网络,并将这些容器连接到该网络上。
七、容器监控与日志管理(可选)
为了确保 FastAPI 应用在容器中的稳定运行,还需要考虑容器的监控与日志管理。可以使用一些容器监控工具,如 Prometheus 和 Grafana 的组合,来收集容器的性能指标,如 CPU 使用率、内存占用等,并进行可视化展示。
对于日志管理,可以将容器内的日志输出到宿主机的文件系统或使用专门的日志管理系统,如 ELK 栈(Elasticsearch、Logstash、Kibana),以便更好地分析和排查问题。
通过以上步骤,我们成功地使用 Docker 部署了 FastAPI 应用。这种部署方式使得 FastAPI 应用能够在不同的环境中快速、一致地运行,提高了应用的可移植性和可维护性。同时,结合 Docker 的其他特性,如数据持久化、网络配置、监控与日志管理等,可以构建出更加健壮、灵活的生产环境部署方案,满足不同规模和复杂度的应用需求。
相关文章:
Docker部署FastAPI实战
在现代 Web 开发领域,FastAPI 作为一款高性能的 Python 框架,正逐渐崭露头角,它凭借简洁的语法、快速的执行速度以及出色的类型提示功能,深受开发者的喜爱。而 Docker 容器化技术则为 FastAPI 应用的部署提供了便捷、高效且可移植…...
【Python数据分析五十个小案例】电影评分分析:使用Pandas分析电影评分数据,探索评分的分布、热门电影、用户偏好
博客主页:小馒头学python 本文专栏: Python数据分析五十个小案例 专栏简介:分享五十个Python数据分析小案例 在现代电影行业中,数据分析已经成为提升用户体验和电影推荐的关键工具。通过分析电影评分数据,我们可以揭示出用户的…...
Vue2学习记录
前言 这篇笔记,是根据B站尚硅谷的Vue2网课学习整理的,用来学习的 如果有错误,还请大佬指正 Vue核心 Vue简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。 它基于标准 HTML、CSS 和 JavaScr…...
TMS FNC UI Pack 5.4.0 for Delphi 12
TMS FNC UI Pack是适用于 Delphi 和 C Builder 的多功能 UI 控件的综合集合,提供跨 VCL、FMX、LCL 和 TMS WEB Core 等平台的强大功能。这个统一的组件集包括基本工具,如网格、规划器、树视图、功能区和丰富的编辑器,确保兼容性和简化的开发。…...
Redis主从架构
Redis(Remote Dictionary Server)是一个开源的、高性能的键值对存储系统,广泛应用于缓存、消息队列、实时分析等场景。为了提高系统的可用性、可靠性和读写性能,Redis提供了主从复制(Master-Slave Replication…...
logback动态获取nacos配置
文章目录 前言一、整体思路二、使用bootstrap.yml三、增加环境变量四、pom文件五、logback-spring.xml更改总结 前言 主要是logback动态获取nacos的配置信息,结尾完整代码 项目springcloudnacosplumelog,使用的时候、特别是部署的时候,需要改环境&#…...
KETTLE安装部署V2.0
一、前置准备工作 JDK:下载JDK (1.8),安装并配置 JAVA_HOME 环境变量,并将其下的 bin 目录追加到 PATH 环境变量中。如果你的环境中已存在,可以跳过这步。KETTLE(8.2)压缩包:LHR提供关闭防火墙…...
[RabbitMQ] 保证消息可靠性的三大机制------消息确认,持久化,发送方确认
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
aws服务--机密数据存储AWS Secrets Manager(1)介绍和使用
一、介绍 1、简介 AWS Secrets Manager 是一个完全托管的服务,用于保护应用程序、服务和 IT 资源中的机密信息。它支持安全地存储、管理和访问应用程序所需的机密数据,比如数据库凭证、API 密钥、访问密钥等。通过 Secrets Manager,你可以轻松管理、轮换和访问这些机密信息…...
Java设计模式笔记(一)
Java设计模式笔记(一) (23种设计模式由于篇幅较大分为两篇展示) 一、设计模式介绍 1、设计模式的目的 让程序具有更好的: 代码重用性可读性可扩展性可靠性高内聚,低耦合 2、设计模式的七大原则 单一职…...
Unity3d C# 实现一个基于UGUI的自适应尺寸图片查看器(含源码)
前言 Unity3d实现的数字沙盘系统中,总有一些图片或者图片列表需要点击后弹窗显示大图,这个弹窗在不同尺寸分辨率的图片查看处理起来比较麻烦,所以,需要图片能够根据容器的大小自适应地进行缩放,兼容不太尺寸下的横竖图…...
【es6进阶】vue3中的数据劫持的最新实现方案的proxy的详解
vuejs中实现数据的劫持,v2中使用的是Object.defineProperty()来实现的,在大版本v3中彻底重写了这部分,使用了proxy这个数据代理的方式,来修复了v2中对数组和对象的劫持的遗留问题。 proxy是什么 Proxy 用于修改某些操作的默认行为࿰…...
w~视觉~3D~合集3
我自己的原文哦~ https://blog.51cto.com/whaosoft/12538137 #SIF3D 通过两种创新的注意力机制——三元意图感知注意力(TIA)和场景语义一致性感知注意力(SCA)——来识别场景中的显著点云,并辅助运动轨迹和姿态的预测…...
IT服务团队建设与管理
在 IT 服务团队中,需要明确各种角色。例如系统管理员负责服务器和网络设备的维护与管理;软件工程师专注于软件的开发、测试和维护;运维工程师则保障系统的稳定运行,包括监控、故障排除等。通过清晰地定义每个角色的职责࿰…...
一文学习开源框架OkHttp
OkHttp 是一个开源项目。它由 Square 开发并维护,是一个现代化、功能强大的网络请求库,主要用于与 RESTful API 交互或执行网络通信操作。它是 Android 和 Java 开发中非常流行的 HTTP 客户端,具有高效、可靠、可扩展的特点。 核心特点 高效…...
自研芯片逾十年,亚马逊云科技Graviton系列芯片全面成熟
在云厂商自研芯片的浪潮中,亚马逊云科技无疑是最早践行这一趋势的先驱。自其迈出自研芯片的第一步起,便如同一颗石子投入平静的湖面,激起了层层涟漪,引领着云服务和云上算力向着更高性能、更低成本的方向演进。 早在2012年&#x…...
Stable Diffusion 3 部署笔记
SD3下载地址:https://huggingface.co/stabilityai/stable-diffusion-3-medium/tree/main https://huggingface.co/spaces/stabilityai/stable-diffusion-3-medium comfyui 教程: 深度测评:SD3模型表现如何?实用教程助你玩转Stabl…...
微信小程序WXSS全局样式与局部样式的使用教程
微信小程序WXSS全局样式与局部样式的使用教程 引言 在微信小程序的开发中,样式的设计与实现是提升用户体验的关键部分。WXSS(WeiXin Style Sheets)作为微信小程序的样式表语言,不仅支持丰富的样式功能,还能通过全局样式与局部样式的灵活运用,帮助开发者构建美观且易于维…...
Docker 部署 MongoDB
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: GitCode💫 Gitee …...
Unity图形学之法线贴图原理
1.正常贴图:RGBA 4通道 每个通道取值范围 0-255 贴图里面取值是 0-1 2.法线贴图:法线怎么存入正常贴图的过程 每个通道里面存储的是一个向量(x,y,z,w) 通常我们会对应xyzw为rgba 存储值的范围也是0-1向量的取值范围是 -1到1法线怎么存入正常贴图的过程&…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
