Python因其简单上手,在众编程语言中脱颖而出,但你有没有想过,你的python代码如何打包成一个api服务,能够快速地部署到其他机器,同时便捷地使用呢?
小姜教你如何一步一步将你的Python 算法打包为 Docker 镜像、部署、使用,最后成为一个基于docker的边缘端api服务
文章目录
-
- 什么是docker?
- 为什么要打包为Docker?
- 打包前置准备
- 使用Fastapi打包算法
-
-
- [安装 Fastapi](#安装 Fastapi)
- [算法嵌入 Fastapi 框架](#算法嵌入 Fastapi 框架)
-
- [将api服务打包为Docker Image](#将api服务打包为Docker Image)
- 本地部署测试
- 边缘端部署
- 完
什么是docker?
Docker 是一款开源的容器化技术,核心是通过 "容器" 将应用程序及其依赖(库、环境变量、配置文件等)打包成一个独立的可移植单元。容器基于宿主机操作系统内核运行,无需像虚拟机那样模拟完整操作系统,因此启动速度快、资源占用低,且具备 "一次构建、到处运行" 的特性,能让应用在任何支持 Docker 的设备上,都以相同的环境稳定运行。
为什么要打包为Docker?
- 解决环境依赖冲突:Python 算法常依赖特定版本的库(如 numpy、torch),Docker 可固化完整依赖环境,彻底避免此类问题。
- 适配边缘端资源约束:边缘设备(如网关、工业控制器)普遍存在 CPU / 内存有限的问题,Docker 容器比虚拟机更轻量化,镜像体积可灵活优化,不会过度占用边缘资源。
- 简化跨设备部署:边缘场景中可能涉及多种架构(x86、arm)、多种系统(Linux、mac ),Docker 镜像可跨架构、跨系统移植,无需针对不同设备重复适配。
- 保障服务隔离与稳定性:将算法 API 服务封装在容器中,可与边缘设备上的其他应用隔离,避免资源抢占或配置冲突,同时容器支持快速启停、自动重启,提升服务可用性。
打包前置准备
- python环境
- Docker Desktop
(通过docker官网下载)

使用Fastapi打包算法
Fastapi是一个用于构建 API 的现代、快速的 web 框架,我们首先将我们的算法构建为接受输入,返回输出的api
安装 Fastapi
bash
pip install fastapi
另外我们还需要一个 ASGI 服务器(uvicorn)
bash
pip install "uvicorn[standard]"
算法嵌入 Fastapi 框架
python
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.post("/algorithm1")
async def calculate(data: dict):
# 这里是要封装的算法
#...
#result = ...
# 返回结果
return {"code": 200, "result": result}
if __name__ == "__main__":
#使用ASGI 服务器运行
uvicorn.run(app, host="0.0.0.0", port=8000)
代码中@app.post("/algorithm1") 表示这个api的url路径,在下方的函数中,补充你的算法,将算法的结果return,如果你的算法较为复杂,由多个单独文件组成,你可以采用引用的方式。如果要打包的服务有多个算法功能,那么可以使用多个@app.post() ,为不同的算法功能分配不同的请求路径。示例:
python
from fastapi import FastAPI
import uvicorn
# 导入自定义算法模块
from my_algorithm import a_func,b_func
app = FastAPI()
#添加一个根路径,作为算法是否运行的检查路劲
@app.get("/")
async def root():
return {"message": "算法API服务正在运行", "status": "healthy"}
@app.post("/algorithm/a")
async def predict(data: dict):
# 调用算法
result = a_func(input_data)
# 返回结果
return {"code": 200, "result": result}
@app.post("/algorithm/b")
async def predict(data: dict):
# 调用算法
result = b_func(input_data)
# 返回结果
return {"code": 200, "result": result}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
至此,你可以创建一个app目录,作为你的项目目录,然后将这个python文件命名为main.py并放到这个目录中,在你本地的python环境运行,你的api服务就已经打开了,你可以新建一个test.py脚本,使用request库进行请求测试:
python
import requests
import json
host = "8000"
# 测试服务
response = requests.get(
f"http://localhost:{host}/health"
)
if response.status_code == 200:
print("API服务状态正常")
print(response.json())
# 算法请求
request_data = {
"p1":2,
"p2":'h'
}
response = requests.post(
f"http://localhost:{host}/algorithm/a",
headers={"Content-Type": "application/json"},
data=json.dumps(request_data)
)
#处理响应
if response.status_code == 200:
result = response.json()
if result["success"]:
print(f"算法执行成功,结果:{result}")
else:
print(f"算法执行失败")
else:
print(f"请求失败: {response}")
将api服务打包为Docker Image
编写依赖文件
依赖文件requirements.txt的目的是告诉docker打包时,需要安装哪些python的包,将你的python算法需要的包列入文件(==1.0.0表示固定版本号为1.0.0):
python
numpy==1.24.1
uvicorn
pydantic
python-multipart
matplotlib==3.7.2
scikit-learn==1.3.2
pillow
fastapi
编写 Dockerfile
Dockerfile 是docker镜像打包时的关键脚本,里面包含了打包时需要执行的内容和一些相关配置。如果你前面按照小姜的步骤进行,你可以参考下面的模板:
dockerfile
# 基础镜像:选用轻量化Python镜像(可以选择你需要的python版本)
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 安装系统依赖(这是因为部分包需要使用系统依赖)
# 如果你的算法设计的包非常基础,可以跳过这一部分
RUN apt-get update && apt-get install -y \
gcc \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖文件与代码
COPY requirements.txt .
COPY . .
# 安装依赖(国内源加速,边缘端可提前下载依赖包离线安装)
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 暴露API端口(与代码中一致)
EXPOSE 8000
# 启动命令
CMD ["python", "main.py"]
执行打包命令
在 Dockerfile 所在目录的命令行窗口执行
bash
docker build -t edge-algorithm-api:v1 .
edge-algorithm-api为你要打包的镜像名,v1为镜像版本标签,这两个都可以由你自定义,版本号通常可以填写latest,表示最新版
等待打包完成,打开 docker desktop ,找到 images,你可以看到你打包的镜像出现在这里

本地部署测试
在本地运行你的 docker 镜像有两种方式:
- 命令行
本地运行
bash
docker run -d -p 8000:8000 --name edge-api edge-algorithm-api:v1
8000:8000表示你定义的端口;edge-api表示你定义的服务名;edge-algorithm-api:v1表示你要运行的镜像
执行后,你的api调用地址为:http://localhost:8000/algorithm/a
- Docker Desktop
点击Iamge页面中的运行按钮

点开运行选项,设置你的服务名称,端口(填0随机生成)

完成后点击到container页面,此时镜像运行在一个container容器内,形成服务:

port下方的路径就是你的服务链接,点击,会自动在浏览器打开这个地址,模拟根路径的get请求:

能够看到你设定的返回值,说明算法部署成功了!
边缘端部署
镜像分发
分发镜像的前提是能够将你的docker镜像打包为一个实体的文件。这样才能传输给其他设备,我们使用以下命令将Image打包为一个.tar压缩包:
bash
docker save -o edge-api.tar edge-algorithm-api:v1
得到edge-api.tar文件后,你可以通过多种方式发送给目标设备。
镜像加载
使用以下命令加载edge-api.tar文件:
docker load -i edge-api.tar
镜像运行
在边缘端设备,采用和前面本机部署相同的方式,运行image,即可将服务部署到边缘端机器上!
完
如有疑问,欢迎留言~