使用 Docker 进行模型的封装与部署
面向模型服务的容器化规范、镜像构建与上线流程
目标
将模型服务容器化,统一镜像规范与运行参数,支持本地/测试/生产一键部署与回滚。
镜像规范
- 基础镜像:
python:3.10-slim(或业务要求) - 时区/编码:统一
TZ=Asia/Shanghai、PYTHONUNBUFFERED=1 - 依赖缓存:
requirements.txt分层安装 - 用户/权限:尽量使用非 root 用户运行
- 健康检查:
/healthHTTP 探针
Dockerfile 示例(FastAPI + Uvicorn)
FROM python:3.10-slim
ENV TZ=Asia/Shanghai \
PYTHONUNBUFFERED=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=1
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.yml 示例
version: "3.9"
services:
model-service:
build: .
image: model-service:latest
restart: always
environment:
- WORKERS=4
- LOG_LEVEL=info
ports:
- "8060:8000"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 3s
retries: 3
volumes:
- ./models:/app/models
多环境上线流程
- 构建镜像:
docker build -t my-registry/model-service:TAG . - 推送镜像:
docker push my-registry/model-service:TAG - 部署更新:
docker-compose pull && docker-compose up -d - 健康验证:访问
/health、/docs;检查日志与监控告警 - 回滚策略:保留上个稳定 TAG,快速
docker pull+up -d
最佳实践
- 镜像瘦身:清理构建产物、使用 slim 基础镜像
- 运行参数:限制内存/CPU,合理的 worker 与并发
- 数据持久化:模型权重、元数据目录做成挂载卷
- 安全:只暴露必要端口,鉴权/网段隔离/HTTPS 反向代理
- 监控:健康检查 + 性能指标(请求时延、错误率、QPS)
常见问题(FAQ)
- Q: 构建很慢?
- A: 利用依赖分层缓存;锁定依赖版本;选择国内镜像源。
- Q: 推理不稳定?
- A: 设定
restart: always;限制并发;观测 CPU/内存 与超时。
- A: 设定
- Q: 模型文件丢失?
- A: 将
models/作为外部卷;部署前先同步模型仓库。
- A: 将