跳到主内容
智客 ZICQ

智客百科 基础设施

Docker

基础设施
别名: Docker 容器 容器化 ·2026-09-14

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,防止供应链攻击。