Skip to content

🐳 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-smi

Ollama 容器化部署

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-vllm

Docker 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
# ... 最终镜像只有运行所需文件
  • 基础镜像选 slimalpine
  • --no-cache-dir 避免缓存膨胀
  • .dockerignore 排除模型文件、__pycache__.git

🎯 本章要点

  • Docker 解决环境冲突:每个服务独立容器,依赖不打架
  • GPU 容器需要 NVIDIA Container Toolkit,用 --gpus all 挂载
  • 数据用 volume 持久化,容器删了模型不丢
  • Docker Compose 一键起 Ollama + vLLM + nginx 全家桶
  • 生产配置 --restart=unless-stopped,挂了自动重启
加载练习题中...

有问题或补充?欢迎留言