实验室的一套 Python 算法项目在部署阶段需要以容器/虚拟化方式运行,因此整理了整个 Docker 化流程,方便后续参考。
背景 #
- 算法部分:包含 PyTorch、XGBoost
- 后端部分:使用 Flask 提供简单 API 服务
将算法后端打包成可直接部署的 Docker 镜像。
算法容器化 / Now #
1、构建 dockerfile #
新建Dockerfile.alg
# 🐋 基于指定的 PyTorch CUDA 镜像
FROM pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel
# 📁 设置工作目录
WORKDIR /workspace
# 📦 复制本地 alg 仓库到容器
COPY alg /workspace/alg
# 🔧 进入 alg 目录
WORKDIR /workspace/alg
# 🪞 配置 pip 使用清华源加速下载
RUN pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
# 📚 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 🌐 暴露 Flask 服务的端口
EXPOSE 20010
# 🚀 启动容器时运行 Flask 服务,并将日志写入 output.log
# ⚠️ 这里保留前台,以使docekr run -d不会直接退出
CMD ["bash", "-c", "python main.py > output.log 2>&1"]
2、构建镜像 #
docker build -t alg:v1.0 -f Dockerfile.alg .
3、运行容器 #
# single
docker run -d -p 20010:20010 -v /opt/code/alg:/workspace/mount --gpus all --name alg --restart=unless-stopped alg:v1.0
# multiple
docker run -d \
-p 20010:20010 \
-v /opt/code/alg:/workspace/mount \
--gpus all \
--name alg \
--restart=unless-stopped \
alg:v1.0
4、查看容器运行状态 #
docekr ps -a
docker logs -f alg
5、端口连通性测试 #
测试端口联通
curl -I http://localhost:20010
镜像保存与迁移 #
1、保存 image 为 tar
docker save -o alg.tar alg:v1.0
2、加载 image
# 7z x alg.7z -o./ # 得到 alg.tar
docker load -i alg.tar
docker images
3、启动容器
docker run -d -p 20010:20010 -v /opt/code/alg:/workspace/mount --gpus all --name alg --restart=unless-stopped alg:v1.0
4、开防火墙
ufw allow 20010
5、API 测试
# 测试
curl -X POST http://localhost:20010/predict
# 返回如下输出即完成
{
"code": 415,
"error": "Internal Server Error",
"message": "415 Unsupported Media Type: Did not attempt to load JSON data because the request Content-Type was not 'application/json'."
}
非 docker 部署 / Before #
- 配置 python 环境
- conda/miniforge/mamba
- pip
- poetry
- 下载依赖
pip install -r requirements.txt- conda 下载 pytorch 相关依赖
- 部署
nohup python main.py > output.log 2>&1,将算法的输出重定向至 output.log 中,同时每次向 predict 发送的请求存放至log/json中,以时间戳顺序排布。