Docker
Docker 是当前事实标准的容器化平台。把应用 + 依赖 + 配置打包成镜像, 一处构建,到处运行。是 LLM 服务部署(vllm / ollama / 微服务)的主流形态。
为什么 LLM 项目都用 Docker
- 环境一致性:开发机 / 测试 / 生产用同一个镜像,避免 "works on my machine"。
- GPU 透传:
--gpus all直接用宿主 NVIDIA 驱动,无需在容器内装驱动。 - 模型权重挂载:大模型权重用 volume mount,镜像保持小巧。
- 快速复制:dev / staging / prod 一键起多份。
核心概念
- Image:只读模板(层级结构,共享 base 层)。
- Container:image 的运行实例。
- Dockerfile:构建 image 的脚本。
- Volume:持久化数据 / 配置文件挂载。
- Network:容器间网络(bridge / host / overlay)。
- Registry:镜像仓库(Docker Hub、GHCR、私有 Harbor / ECR)。
LLM 服务的典型 Dockerfile
FROM nvcr.io/nvidia/pytorch:24.05-py3 # 预装 CUDA + PyTorch
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "-m", "vllm.entrypoints.openai.api_server", \
"--model", "/models/llama-3.1-70b", \
"--tensor-parallel-size", "2"]
docker-compose 多服务编排
services:
vllm:
image: vllm/vllm-openai:latest
runtime: nvidia # 或 deploy.resources.reservations.devices
volumes:
- /data/models:/models
ports:
- "8000:8000"
app:
build: .
depends_on: [vllm, postgres]
environment:
VLLM_BASE_URL: http://vllm:8000
实战经验
- 不要在容器内装 NVIDIA 驱动:用
--gpus透传,CUDA toolkit 在镜像里、驱动在宿主机。 - 多阶段构建减小镜像:build 阶段装 dev deps,runtime 阶段只 COPY 编译产物。
- 非 root 用户运行:
USER 10001起服务,避免容器逃逸攻击。 - read-only rootfs:容器根分区只读,配置 / 数据用 volume,攻击面最小。
- 健康检查:每个服务配
HEALTHCHECK,compose / k8s 据此判断 readiness。
Docker vs Podman / nerdctl
- Docker:生态最成熟,所有云厂商支持。
- Podman:无 daemon,rootless 友好,systemd 集成好。
- nerdctl:CLI 兼容 Docker,可对接 containerd / k8s。
进阶
- 多阶段构建:build 阶段 vs runtime 阶段分离,镜像体积减少 80%+。
- BuildKit 缓存:
--mount=type=cache复用 pip / apt 缓存,构建快 5x。 - distroless 镜像:
gcr.io/distroless/*镜像只含 runtime,攻击面最小。 - 镜像签名:cosign 给镜像签名 + verify,防止供应链攻击。