Docker 在代码拆分方案中的作用

文档信息

  • 创建日期: 2026-02-01
  • 版本: v1.0
  • 目的: 阐明Docker在不同代码组织策略中的作用

🤔 核心问题

Docker能否替代代码拆分?

简短回答:不能!

Docker 解决:运行时隔离
代码拆分 解决:开发时组织

两者是正交的(互补的),不是替代关系。

📦 Docker的作用

1. 运行时隔离(部署层面)

问题: 如何部署和运行服务?

Docker方案:
  mbe-core:
    - 镜像: registry.mbe.ai/mbe-core:v1.0
    - 运行: docker run mbe-core
    - 隔离: 独立的容器、网络、文件系统
  
  mbe-education:
    - 镜像: registry.mbe.ai/mbe-education:v1.0
    - 运行: docker run mbe-education
    - 隔离: 独立容器

优势:
  ✅ 环境一致性(开发 = 测试 = 生产)
  ✅ 依赖隔离(不同Python版本、包版本)
  ✅ 资源限制(CPU、内存)
  ✅ 快速部署(拉取镜像即可)

2. 开发环境标准化

问题: 新同事如何快速启动项目?

Docker Compose方案:
  # docker-compose.dev.yml
  services:
    mbe-core:
      build: ./private/core
      ports: ["8000:8000"]
      volumes: ["./private/core:/app"]  # 热加载
    
    mbe-education:
      build: ./public/education
      ports: ["8001:8000"]
      environment:
        - MBE_API_URL=http://mbe-core:8000
    
    postgres:
      image: postgres:15
    
    redis:
      image: redis:7

使用:
  $ docker-compose up  # 一键启动所有服务 ✅
  
优势:
  ✅ 3分钟启动完整环境
  ✅ 无需安装Python、PostgreSQL、Redis
  ✅ 团队环境一致

3. 微服务架构支持

问题: 多个服务如何协同工作?

Docker Network方案:
  服务间通信:
    mbe-education → http://mbe-core:8000/api/...
    
    # 服务发现自动完成
    # 无需知道具体IP
    
  负载均衡:
    nginx → [mbe-core-1, mbe-core-2, mbe-core-3]
    
    # 通过容器编排扩展

优势:
  ✅ 服务解耦
  ✅ 独立扩展
  ✅ 故障隔离

🔄 Docker 与代码组织的关系

场景对比

场景A: Monorepo + Docker (推荐 ⭐⭐⭐⭐⭐)

代码组织: Monorepo
├── private/core/
├── public/education/
└── docker-compose.yml

开发时:
  1. code .  (Cursor打开Monorepo)
  2. docker-compose up  (启动所有服务)
  3. 修改代码 → 自动热加载 ✅
  4. Cursor自动补全、跳转 ✅

部署时:
  1. docker build -t mbe-core private/core/
  2. docker build -t mbe-education public/education/
  3. docker push ...
  4. kubernetes apply ...

优势:
  ✅ 开发体验: AI IDE完美支持
  ✅ 运行隔离: Docker容器隔离
  ✅ 部署灵活: 可独立部署
  ✅ 最佳平衡!

场景B: 多仓库 + Docker

代码组织: 8个独立仓库
├── mbe-core/
├── mbe-sdk-python/
├── mbe-education/
└── ...

开发时:
  1. 克隆8个仓库 ❌
  2. cd mbe-core && docker-compose up
  3. cd ../mbe-education && docker-compose up
  4. 修改API → 需要切换目录 ❌
  5. Cursor只看到当前仓库 ❌

部署时:
  1. cd mbe-core && docker build ...
  2. cd mbe-education && docker build ...
  3. docker push ...
  
劣势:
  ❌ 开发繁琐(多个仓库)
  ❌ AI IDE受限
  ⚠️ Docker只解决了运行时问题,没有解决开发体验

场景C: 单仓库 + 无Docker

代码组织: Monorepo
├── private/core/
└── public/education/

开发时:
  1. code .
  2. python private/core/src/main.py
  3. python public/education/main.py
  4. 需要手动安装PostgreSQL、Redis ❌
  5. 依赖冲突问题 ❌

部署时:
  1. 手动配置服务器
  2. 安装依赖
  3. 配置环境变量
  4. 启动服务
  
劣势:
  ❌ 环境不一致("我电脑上能跑")
  ❌ 部署复杂
  ❌ 难以扩展

💡 最佳实践:Monorepo + Docker

完整方案

mbe-monorepo/
├── private/
│   └── core/
│       ├── Dockerfile          # 生产镜像
│       ├── Dockerfile.dev      # 开发镜像(带热加载)
│       └── src/
│
├── public/
│   ├── sdk-python/
│   └── education/
│       ├── Dockerfile
│       └── src/
│
├── docker-compose.yml          # 生产环境
├── docker-compose.dev.yml      # 开发环境
└── docker-compose.test.yml     # 测试环境

开发环境配置

# docker-compose.dev.yml
version: '3.8'

services:
  mbe-core:
    build:
      context: ./private/core
      dockerfile: Dockerfile.dev
    volumes:
      - ./private/core/src:/app/src:ro  # 只读挂载(安全)
      - core-venv:/app/.venv             # 缓存依赖
    ports:
      - "8000:8000"
    environment:
      - PYTHONUNBUFFERED=1
      - DEBUG=1
      - DATABASE_URL=postgresql://mbe:mbe@postgres:5432/mbe_dev
    depends_on:
      - postgres
      - redis
    command: uvicorn src.main:app --reload --host 0.0.0.0

  mbe-education:
    build:
      context: ./public/education
      dockerfile: Dockerfile.dev
    volumes:
      - ./public/education/src:/app/src:ro
      - education-venv:/app/.venv
    ports:
      - "8001:8000"
    environment:
      - MBE_API_URL=http://mbe-core:8000
      - MBE_API_KEY=${MBE_DEV_API_KEY}
    depends_on:
      - mbe-core
    command: uvicorn main:app --reload --host 0.0.0.0

  postgres:
    image: postgres:15-alpine
    environment:
      - POSTGRES_USER=mbe
      - POSTGRES_PASSWORD=mbe_dev
      - POSTGRES_DB=mbe_dev
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

  # 可选:开发辅助工具
  pgadmin:
    image: dpage/pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@mbe.ai
      - PGADMIN_DEFAULT_PASSWORD=admin
    ports:
      - "5050:80"

volumes:
  core-venv:
  education-venv:
  postgres-data:

Dockerfile.dev (开发镜像)

# private/core/Dockerfile.dev
FROM python:3.11-slim

WORKDIR /app

# 安装开发工具
RUN pip install --no-cache-dir \
    watchdog \
    debugpy \
    ipython

# 安装依赖
COPY requirements.txt requirements-dev.txt ./
RUN pip install --no-cache-dir -r requirements.txt -r requirements-dev.txt

# 源码通过volume挂载,不COPY

# 暴露调试端口
EXPOSE 8000 5678

# 开发模式:热加载
CMD ["uvicorn", "src.main:app", "--reload", "--host", "0.0.0.0"]

Dockerfile (生产镜像)

# private/core/Dockerfile
FROM python:3.11-slim as builder

WORKDIR /app

# 安装依赖
COPY requirements.txt ./
RUN pip install --no-cache-dir --user -r requirements.txt

FROM python:3.11-slim

WORKDIR /app

# 复制依赖
COPY --from=builder /root/.local /root/.local
ENV PATH=/root/.local/bin:$PATH

# 复制源码
COPY src/ ./src/

# 编译Python为字节码(保护源码)
RUN python -m compileall -b src/ && \
    find src/ -name "*.py" -delete && \
    find src/ -name "*.pyc" -exec rename 's/\.pyc$/\.py/' {} \;

# 非root用户运行
RUN useradd -m -u 1000 mbe && chown -R mbe:mbe /app
USER mbe

EXPOSE 8000

# 生产模式:无热加载
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--workers", "4"]

🎯 使用场景

开发阶段

# 1. 启动开发环境
cd mbe-monorepo
docker-compose -f docker-compose.dev.yml up

# 2. 在Cursor中开发
code .

# 3. 修改代码
vi private/core/src/api/hope.py

# 4. 自动热加载 ✅
# 容器中的服务自动重启

# 5. 查看日志
docker-compose -f docker-compose.dev.yml logs -f mbe-core

# 6. 进入容器调试
docker-compose -f docker-compose.dev.yml exec mbe-core bash
python -m pdb src/main.py

测试阶段

# 运行集成测试
docker-compose -f docker-compose.test.yml up --abort-on-container-exit

# docker-compose.test.yml 会启动:
# - 所有服务
# - 测试运行器(pytest)
# - 测试完成后自动停止

部署阶段

# 1. 构建生产镜像
docker build -t registry.mbe.ai/mbe-core:v1.0 private/core/
docker build -t registry.mbe.ai/mbe-education:v1.0 public/education/

# 2. 推送到镜像仓库
docker push registry.mbe.ai/mbe-core:v1.0
docker push registry.mbe.ai/mbe-education:v1.0

# 3. 部署到Kubernetes
kubectl apply -f k8s/mbe-core-deployment.yml
kubectl apply -f k8s/mbe-education-deployment.yml

# 4. 扩展副本
kubectl scale deployment mbe-core --replicas=3

🔧 Docker解决的问题

✅ Docker能解决

问题 Docker方案
环境不一致 容器镜像保证一致
依赖冲突 每个容器独立依赖
快速启动 docker-compose up
服务隔离 独立容器运行
资源限制 设置CPU/内存限制
快速部署 拉取镜像即可
版本回滚 切换镜像版本
水平扩展 启动多个容器

❌ Docker不能解决

问题 需要其他方案
代码组织 Monorepo vs 多仓库
AI IDE体验 代码结构设计
跨仓库补全 Monorepo
智能重构 单一代码库
代码导航 统一上下文
API变更影响分析 代码共存

结论: Docker是运行时工具,不能替代良好的代码组织策略。


🏆 推荐方案总结

最佳组合:Monorepo + Docker + Git Subtree

代码组织层:
  └─ Monorepo
     ├─ 开发体验: AI IDE完美支持 ✅
     ├─ 代码补全: 跨模块工作 ✅
     └─ 智能重构: 全局生效 ✅

运行隔离层:
  └─ Docker
     ├─ 环境一致: 开发=生产 ✅
     ├─ 服务隔离: 独立容器 ✅
     └─ 快速部署: 拉取镜像 ✅

发布策略层:
  └─ Git Subtree
     ├─ 公开仓库: 独立维护 ✅
     ├─ 历史隔离: 无泄露风险 ✅
     └─ 社区友好: 标准结构 ✅

工作流

# 开发(Monorepo + Docker)
cd mbe-monorepo
code .                                    # Cursor看到完整代码
docker-compose -f docker-compose.dev.yml up  # 容器运行服务

# 修改代码
vi private/core/src/api/hope.py           # 修改API
vi public/education/src/mbe_education/engine.py  # Cursor自动提示引用

# 测试
docker-compose -f docker-compose.test.yml up --abort-on-container-exit

# 提交
git add .
git commit -m "feat: improve surprise detection"

# 发布(Git Subtree + Docker)
# 1. 推送代码到公开仓库
git subtree push --prefix=public/education \
  https://github.com/mbe-org/mbe-education.git main

# 2. 构建Docker镜像
docker build -t registry.mbe.ai/mbe-core:v1.0 private/core/
docker build -t registry.mbe.ai/mbe-education:v1.0 public/education/

# 3. 推送镜像
docker push registry.mbe.ai/mbe-core:v1.0
docker push registry.mbe.ai/mbe-education:v1.0

# 4. 部署
kubectl set image deployment/mbe-core mbe-core=registry.mbe.ai/mbe-core:v1.0
kubectl set image deployment/mbe-education mbe-education=registry.mbe.ai/mbe-education:v1.0

📊 方案对比(加入Docker维度)

方案 代码组织 容器化 AI IDE 部署 总分
A: Monorepo + Docker ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 20/20
B: 多仓库 + Docker ⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐ 13/20
C: Monorepo + 无Docker ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐ 13/20
D: 多仓库 + 无Docker ⭐⭐ ⭐⭐ ⭐⭐ 7/20

🚀 实施建议

时间线更新

Week 1-3:   修复关键BUG(不变)
Week 4:     准备工具 + Docker配置 ⭐ 新增
Week 5-8:   重组Monorepo + Docker环境
Week 9:     测试验证(包括容器化测试)
Week 10:    团队培训(Docker + Monorepo)

Total: 10周

Docker学习资源

基础知识:
  - Docker官方文档: https://docs.docker.com/
  - Docker Compose文档: https://docs.docker.com/compose/
  - 学习时间: 1-2天

实战练习:
  - 构建简单镜像: 2小时
  - 编写docker-compose: 2小时
  - 多容器应用: 4小时
  
团队培训:
  - Docker基础: 半天
  - 实战演练: 半天
  - 总计: 1天

💡 关键要点

1. Docker ≠ 代码拆分
   - Docker: 运行时隔离
   - 代码拆分: 开发时组织

2. 最佳组合
   - Monorepo: AI IDE友好
   - Docker: 环境一致性
   - Git Subtree: 发布隔离

3. 不要过度容器化
   - 开发时: 可以不用Docker(快速迭代)
   - 测试时: 必须用Docker(环境一致)
   - 部署时: 必须用Docker(生产标准)

4. 学习成本低
   - Docker基础: 1-2天
   - Monorepo: 立即上手
   - Git Subtree: 2-3小时

最后更新: 2026-02-01
文档状态: ✅ 补充完整