主题
🐳 Docker 部署推理服务
一个项目跑得好好的,第二个项目装依赖把环境搞崩了——Docker 就是来解决这个的
为什么用 Docker
裸机跑 AI 服务的痛点:
- Python 环境互相污染(项目A要 torch 2.0,项目B要 torch 2.3)
- CUDA 版本冲突
- 依赖树爆炸,出了问题难排查
- 换机器部署要重走一遍环境
Docker 把每个服务装进独立容器,环境完全隔离。
安装 Docker + NVIDIA Container Toolkit
bash
# 1. 安装 Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER # 免 sudo
newgrp docker
# 2. 安装 NVIDIA Container Toolkit(让容器能访问 GPU)
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update
sudo apt install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 3. 验证 GPU 能在容器里用
docker run --rm --gpus all nvidia/cuda:12.1-base nvidia-smiOllama 容器化部署
bash
# 拉官方镜像
docker pull ollama/ollama
# 启动(GPU 模式)
docker run -d \
--name ollama \
--gpus all \
-p 11434:11434 \
-v ollama-data:/root/.ollama \
ollama/ollama
# 进容器拉模型
docker exec -it ollama ollama pull qwen2.5:7b
docker exec -it ollama ollama pull deepseek-r1:14b-v ollama-data:/root/.ollama 把模型文件存在 Docker 数据卷里,容器删了模型还在。
vLLM 容器化部署
dockerfile
# Dockerfile
FROM vllm/vllm-openai:latest
# 预装模型(可选,首次启动会自动下载)
# ENV HF_HOME=/models
# COPY download_model.py /app/
EXPOSE 8000
CMD ["--model", "Qwen/Qwen2.5-7B-Instruct", \
"--host", "0.0.0.0", \
"--port", "8000", \
"--gpu-memory-utilization", "0.9"]bash
# 构建并启动
docker build -t my-vllm .
docker run -d \
--name vllm \
--gpus all \
-p 8000:8000 \
-v ~/models:/models \
my-vllmDocker Compose 一栈部署
一个 docker-compose.yml 同时起 Ollama + vLLM + nginx 反代:
yaml
version: '3.8'
services:
ollama:
image: ollama/ollama
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama-data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
vllm:
image: vllm/vllm-openai:latest
container_name: vllm
ports:
- "8000:8000"
volumes:
- ~/models:/models
command: >
--model Qwen/Qwen2.5-7B-Instruct
--host 0.0.0.0
--port 8000
--gpu-memory-utilization 0.9
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
nginx:
image: nginx:alpine
container_name: nginx
ports:
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- ollama
- vllm
volumes:
ollama-data:bash
# 一键启动所有服务
docker compose up -d
# 查看日志
docker compose logs -f
# 停掉
docker compose down常用运维命令
bash
# 查看 GPU 使用
docker exec ollama nvidia-smi
# 查看容器日志
docker logs -f ollama --tail 50
# 进容器调试
docker exec -it ollama bash
# 资源限制:限制显存
docker run --gpus '"device=0"' --memory=16g vllm
# 限制 CPU 核数
docker run --cpus=4 ollama
# 重启策略
docker run --restart=unless-stopped ollama镜像优化技巧
dockerfile
# 用多阶段构建减体积
FROM python:3.11-slim AS builder
RUN pip install vllm --no-cache-dir
FROM python:3.11-slim
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
# ... 最终镜像只有运行所需文件- 基础镜像选
slim或alpine - 用
--no-cache-dir避免缓存膨胀 .dockerignore排除模型文件、__pycache__、.git
🎯 本章要点
- Docker 解决环境冲突:每个服务独立容器,依赖不打架
- GPU 容器需要 NVIDIA Container Toolkit,用
--gpus all挂载 - 数据用 volume 持久化,容器删了模型不丢
- Docker Compose 一键起 Ollama + vLLM + nginx 全家桶
- 生产配置
--restart=unless-stopped,挂了自动重启
加载练习题中...