python算法打包为docker镜像(边缘端api服务)

Python因其简单上手,在众编程语言中脱颖而出,但你有没有想过,你的python代码如何打包成一个api服务,能够快速地部署到其他机器,同时便捷地使用呢?


小姜教你如何一步一步将你的Python 算法打包为 Docker 镜像、部署、使用,最后成为一个基于docker的边缘端api服务

文章目录

什么是docker?

Docker 是一款开源的容器化技术,核心是通过 "容器" 将应用程序及其依赖(库、环境变量、配置文件等)打包成一个独立的可移植单元。容器基于宿主机操作系统内核运行,无需像虚拟机那样模拟完整操作系统,因此启动速度快、资源占用低,且具备 "一次构建、到处运行" 的特性,能让应用在任何支持 Docker 的设备上,都以相同的环境稳定运行。

为什么要打包为Docker?

  1. 解决环境依赖冲突:Python 算法常依赖特定版本的库(如 numpy、torch),Docker 可固化完整依赖环境,彻底避免此类问题。
  2. 适配边缘端资源约束:边缘设备(如网关、工业控制器)普遍存在 CPU / 内存有限的问题,Docker 容器比虚拟机更轻量化,镜像体积可灵活优化,不会过度占用边缘资源。
  3. 简化跨设备部署:边缘场景中可能涉及多种架构(x86、arm)、多种系统(Linux、mac ),Docker 镜像可跨架构、跨系统移植,无需针对不同设备重复适配。
  4. 保障服务隔离与稳定性:将算法 API 服务封装在容器中,可与边缘设备上的其他应用隔离,避免资源抢占或配置冲突,同时容器支持快速启停、自动重启,提升服务可用性。

打包前置准备

  1. python环境
  2. 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 镜像有两种方式:

  1. 命令行

本地运行

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

  1. 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,即可将服务部署到边缘端机器上!


如有疑问,欢迎留言~

相关推荐
岁岁岁平安5 小时前
python mysql-connector、PyMySQL基础
python·mysql·pymysql
麦兜*6 小时前
Spring Boot 应用 Docker 监控:Prometheus + Grafana 全方位监控
spring boot·后端·spring cloud·docker·prometheus
爱吃糖的小秦同学6 小时前
Docker爆红且安装非C盘处理方案
运维·docker·容器
mit6.8246 小时前
[VT-Refine] Simulation | Fine-Tuning | docker/run.sh
算法
朴shu6 小时前
Delta数据结构:深入剖析高效数据同步的奥秘
javascript·算法·架构
铁锹少年6 小时前
当多进程遇上异步:一次 Celery 与 Async SQLAlchemy 的边界冲突
分布式·后端·python·架构·fastapi
梨轻巧6 小时前
pyside6常用控件:QCheckBox() 单个复选框、多个复选框、三态模式
python
寒秋丶6 小时前
Milvus:集合(Collections)操作详解(三)
数据库·人工智能·python·ai·ai编程·milvus·向量数据库
寒秋丶6 小时前
Milvus:Schema详解(四)
数据库·人工智能·python·ai·ai编程·milvus·向量数据库