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


如有疑问,欢迎留言~

相关推荐
随意起个昵称几秒前
【二分】洛谷P2920,P2985做题小记
c++·算法
二川bro3 分钟前
数据可视化进阶:Python动态图表制作实战
开发语言·python·信息可视化
没书读了6 分钟前
计算机组成原理-考前记忆清单
线性代数·算法
青青子衿_2118 分钟前
TikTok爬取——视频、元数据、一级评论
爬虫·python·selenium
Hcoco_me34 分钟前
大模型面试题5:矩阵(M*M)特征值分解的步骤
算法·机器学习·矩阵
weixin_4365250740 分钟前
使用 idea 命令行构建 Docker 镜像并部署到云服务器
linux·docker·github
忘却的旋律dw1 小时前
使用LLM模型的tokenizer报错AttributeError: ‘dict‘ object has no attribute ‘model_type‘
人工智能·pytorch·python
20岁30年经验的码农1 小时前
Java RabbitMQ 实战指南
java·开发语言·python
非著名架构师1 小时前
极端天气下的供应链韧性:制造企业如何构建气象风险防御体系
大数据·人工智能·算法·制造·疾风气象大模型·风光功率预测
星轨初途1 小时前
数据结构排序算法详解(2)——选择排序(附动图)
c语言·数据结构·经验分享·笔记·b树·算法·排序算法