TL;DR:「在我电脑上能跑」是团队协作最大的敌人。Docker 化 AI 开发环境,让新成员一条命令搞定所有配置。本文包含:AI 开发容器设计原则、多环境配置(Python/Node/Go)、GPU 支持、docker-compose 一键启动完整示例。

1. 为什么 AI 开发需要 Docker 化

AI 开发环境的痛苦:

  • Python 版本冲突(3.8 / 3.9 / 3.10 / 3.11,每个项目要求不一样)
  • CUDA 版本和 PyTorch 版本要匹配
  • Node.js 全局安装了一堆 CLI 工具,队友电脑上找不到
  • 换了电脑要从头配一遍,两天过去了还没开始写代码
  • AI 开发依赖动不动几十个,环境重建一次要半小时

Docker 化之后:

  • 一条命令,所有人的环境完全一致
  • 5 分钟内从零搭建完成,开始写代码
  • 换电脑 / 新成员加入 = 0 配置成本
  • 环境坏了?删掉重来,30 秒满血复活

2. 项目结构设计

ai-project/
├── .devcontainer/           # VS Code 远程开发配置
│   ├── devcontainer.json    # 容器定义
│   └── Dockerfile           # 容器镜像
├── docker/                  # Docker 配置
│   ├── Dockerfile           # 主镜像
│   ├── Dockerfile.gpu       # GPU 版本
│   └── requirements.txt     # Python 依赖
├── docker-compose.yml        # 一键启动
├── .env.example             # 环境变量模板
└── README.md                # 启动说明

3. 基础版 AI 开发容器

3.1 Dockerfile

Dockerfile

# AI 开发基础镜像:Python 3.11 + CUDA 12.1 + Node 20
FROM nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04

# 避免交互式安装
ENV DEBIAN_FRONTEND=noninteractive

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    python3.11 python3.11-dev python3-pip \
    nodejs npm \
    git curl wget vim htop \
    build-essential libpq-dev \
    && rm -rf /var/lib/apt/lists/*

# 设置 Python 默认版本
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1
RUN update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1

# 安装 uv(比 pip 更快的包管理器)
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
ENV PATH="/root/.local/bin:$PATH"

# 创建工作目录
WORKDIR /workspace

# 复制依赖文件(利用 Docker 缓存)
COPY requirements.txt /workspace/

# 安装 Python 依赖(使用 uv 加速)
RUN uv pip install --system -r requirements.txt

# 安装 Node 全局工具
RUN npm install -g pnpm typescript ts-node @nestjs/cli

# 复制项目代码
COPY . /workspace/

# 暴露端口
EXPOSE 3000 8000 5173

# 默认命令
CMD ["/bin/bash"]

3.2 requirements.txt

requirements.txt

# AI / ML 依赖
torch==2.2.0
transformers==4.38.0
accelerate==0.27.0
sentence-transformers==2.3.1
faiss-cpu==1.8.0
openai==1.12.0

# Web 框架
fastapi==0.109.0
uvicorn[standard]==0.27.0
gradio==4.19.0
streamlit==1.32.0

# 数据处理
pandas==2.2.0
numpy==1.26.3
pydantic==2.6.0

# 开发工具
jupyterlab==4.1.0
ipykernel==6.29.0
black==24.1.1
ruff==0.2.0
pytest==8.0.0
httpx==0.26.0

4. GPU 支持配置

AI 开发几乎都需要 GPU。Docker GPU 支持分两种场景:

4.1 NVIDIA GPU(CUDA)

安装 NVIDIA Container Toolkit:

bash - 安装 NVIDIA Container Toolkit

# 添加 NVIDIA 仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/nvidia-docker/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-docker.gpg
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-docker.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-docker.list

# 安装 nvidia-container-toolkit
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

Dockerfile.gpu

# GPU 专用镜像(使用 PyTorch 官方 GPU 镜像作为基础)
FROM pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime

# 验证 GPU 可用
RUN python -c "import torch; print(f'CUDA available: {torch.cuda.is_available()}')"

# 其余依赖安装同上...

4.2 Docker Compose 一键启动(GPU 版)

docker-compose.yml

version: '3.9'

services:
  # AI 开发容器(GPU 版本)
  ai-dev:
    build:
      context: .
      dockerfile: docker/Dockerfile.gpu
    volumes:
      - .:/workspace              # 代码目录映射
      - ~/.cache:/root/.cache    # pip/uv 缓存复用
      - ~/.cache/huggingface:/root/.cache/huggingface  # 模型缓存
    environment:
      - CUDA_VISIBLE_DEVICES=0
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    ports:
      - "8000:8000"   # FastAPI
      - "5173:5173"   # Vite
      - "8888:8888"   # JupyterLab
    working_dir: /workspace
    command: sleep infinity  # 保持容器运行

  # Qdrant 向量数据库
  qdrant:
    image: qdrant/qdrant:latest
    ports:
      - "6333:6333"
      - "6334:6334"
    volumes:
      - qdrant_data:/qdrant/storage

  # Redis(用于缓存和消息队列)
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

volumes:
  qdrant_data:
  redis_data:

5. VS Code 远程开发配置

有了 Docker 容器,还需要让 VS Code 直接连进去开发。

.devcontainer/devcontainer.json

{
  "name": "AI Dev Environment",
  "build": {
    "dockerfile": "Dockerfile"
  },
  "features": {
    "ghcr.io/devcontainers/features/github-cli": {}
  },
  "forwardPorts": [8000, 5173, 8888],
  "postCreateCommand": "bash .devcontainer/setup.sh",
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-python.python",
        "ms-toolsai.jupyter",
        "esbenp.prettier-vscode",
        "rust-lang.rust-analyzer",
        "golang.go",
        "bradlc.vscode-tailwindcss"
      ],
      "settings": {
        "python.defaultInterpreterPath": "/usr/bin/python",
        "python.linting.enabled": true,
        "python.formatting.provider": "black"
      }
    }
  }
}

.devcontainer/setup.sh

#!/bin/bash
set -e

# 安装 Python 开发工具
pip install --upgrade pip
pip install ipykernel
python -m ipykernel install --user --name=ai-dev

# 初始化 Git 子模块(如果有)
git submodule update --init --recursive

# 预下载常用模型(可选)
# python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('all-MiniLM-L6-v2')"

echo "✅ 环境初始化完成!"

6. 一键启动脚本

把复杂的启动流程封装成一个脚本,新成员只需要运行它。

start-dev.sh

#!/bin/bash
set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

echo_step() {
    echo -e "${GREEN}➜ $1${NC}"
}

echo_error() {
    echo -e "${RED}✗ $1${NC}"
}

# 检查 Docker
check_docker() {
    if ! command -v docker &> /dev/null; then
        echo_error "Docker 未安装,请先安装 Docker"
        exit 1
    fi
    if ! docker info &> /dev/null; then
        echo_error "Docker 未运行,请先启动 Docker"
        exit 1
    fi
}

# 检查 NVIDIA GPU
check_gpu() {
    if command -v nvidia-smi &> /dev/null; then
        echo_step "检测到 NVIDIA GPU:"
        nvidia-smi --query-gpu=name,memory.total --format=csv,noheader
    else
        echo_step "未检测到 NVIDIA GPU,将使用 CPU 模式"
    fi
}

# 复制环境变量
setup_env() {
    if [ ! -f .env ]; then
        echo_step "创建 .env 文件..."
        cp .env.example .env
        echo_error "请编辑 .env 文件填入你的 API Key"
        exit 1
    fi
}

# 主流程
main() {
    echo -e "${YELLOW}=== AI 开发环境启动脚本 ===${NC}\n"

    check_docker
    check_gpu
    setup_env

    echo_step "构建并启动容器..."
    docker-compose up -d --build

    echo_step "安装 VS Code 扩展..."
    docker exec ai-project-ai-dev-1 code --install-extension ms-python.python

    echo -e "\n${GREEN}✅ 启动完成!${NC}"
    echo "- 访问 FastAPI:http://localhost:8000"
    echo "- 访问 JupyterLab:http://localhost:8888"
    echo "- 使用 VS Code 连接容器开发"
}

main "$@"

7. 团队使用流程

新成员加入 → clone 代码 → 运行 ./start-dev.sh → 5 分钟后开始写代码

实测数据(MacBook Pro M2 + 16GB + Docker):

  • 首次构建镜像:约 8 分钟
  • 再次启动(利用 Docker 缓存):约 30 秒
  • 新成员环境搭建时间:从 2 天 → 5 分钟
  • 环境一致性:100%(所有人的容器环境完全相同)

8. 常见问题

Q1:Mac M 系列芯片用 Docker 有 GPU 加速吗?

不能直接用 NVIDIA GPU。Mac Docker 用的是虚拟化方案,有性能损耗。建议:本地开发用 CPU 版本,生产环境用云服务器跑 GPU。

Q2:模型文件太大,无法打包进镜像怎么办?

不要把模型文件放进 Docker 镜像。用 volume 挂载或从 HuggingFace 自动下载:

docker-compose.yml(模型自动下载)

ai-dev:
  volumes:
    - ./models:/workspace/models
    - ~/.cache/huggingface:/root/.cache/huggingface  # 复用缓存

Q3:Docker 里面跑 JupyterLab 慢吗?

数据处理和模型推理在 CPU 模式下会慢一些(尤其 Mac)。但用 GPU 版本或远程服务器,体验和本地一致。

9. 总结

痛点传统方式Docker 化后
环境搭建2 天手动配置5 分钟一键启动
环境一致性各机器不同100% 一致
新成员加入看 README 手动配一条命令搞定
环境损坏重装系统删容器重来
GPU 支持手动装 CUDA一行配置

AI 开发用 Docker 化最大的价值:让团队把时间花在写代码上,而不是配环境上。

如果对你有帮助,欢迎在评论区分享你的 AI 开发环境配置经验。

更多推荐