使用 Docker 搭建 Python(Flask/CUDA AI)开发环境——AI教你学Docker

使用 Docker 搭建 Python(Flask/CUDA AI)开发环境及常用中间件配置详解

本指南适用于用 Docker 快速搭建 Python(Flask Web 应用或包含 CUDA 的 AI 开发环境)开发环境,并集成常用中间件服务如 MySQL、Redis、Kafka。适合个人开发、本地测试和小团队协作。

一、项目目录结构建议

project-root/
├── app/                       # Python 应用源码目录
│   ├── Dockerfile
│   └── ...
├── docker-compose.yml         # Compose 主配置
├── mysql-data/                # MySQL 数据卷(本地挂载)
├── redis-data/                # Redis 数据卷
└── .env                       # 环境变量配置(端口、密码等,不要提交敏感数据)

二、Python Flask 应用 Dockerfile 示例

# app/Dockerfile (Flask开发环境)
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]

说明

  • requirements.txt 示例(包含常见依赖):
    Flask
    mysqlclient
    redis
    kafka-python
    
  • 若用 Gunicorn 生产部署,命令需调整。

三、CUDA AI 环境 Dockerfile 示例

# app/Dockerfile (AI开发环境,需NVIDIA GPU支持)
FROM nvidia/cuda:12.3.0-cudnn8-runtime-ubuntu22.04

RUN apt-get update && \
    apt-get install -y python3 python3-pip && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt ./
RUN pip3 install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8888
CMD ["jupyter", "notebook", "--ip=0.0.0.0", "--allow-root", "--no-browser"]

说明

  • 需本地已正确安装 NVIDIA 驱动和 NVIDIA Container Toolkit。
  • requirements.txt 可包含 torch, tensorflow, flask, notebook 等依赖。

四、docker-compose.yml 配置详解

version: "3.9"
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: python-app
    ports:
      - "5000:5000"      # Flask
      - "8888:8888"      # Jupyter
    environment:
      FLASK_ENV: development
      MYSQL_HOST: mysql
      MYSQL_USER: devuser
      MYSQL_PASSWORD: devpass
      MYSQL_DB: devdb
      REDIS_HOST: redis
      KAFKA_BOOTSTRAP_SERVERS: kafka:9092
    volumes:
      - ./app:/app
    depends_on:
      - mysql
      - redis
      - kafka
    # 如果是AI环境需要GPU支持,需加runtime
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: [gpu]

  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: devdb
      MYSQL_USER: devuser
      MYSQL_PASSWORD: devpass
    volumes:
      - ./mysql-data:/var/lib/mysql

  redis:
    image: redis:7
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - ./redis-data:/data

  zookeeper:
    image: bitnami/zookeeper:3.8
    container_name: zookeeper
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
    ports:
      - "2181:2181"

  kafka:
    image: bitnami/kafka:3.5
    container_name: kafka
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
      KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      ALLOW_PLAINTEXT_LISTENER: "yes"
    ports:
      - "9092:9092"

注意

  • Flask 默认 5000 端口,Jupyter Notebook 默认 8888 端口,实际开发按需暴露。
  • Kafka 必须依赖 Zookeeper,host 配置需与服务名一致。
  • AI 环境需本地支持 GPU 并用 docker compose --profile gpu updocker run --gpus all ...

五、开发和运行流程

  1. 准备 requirements.txt 和源码
  2. 如有 AI 需求,确保本机已装 NVIDIA 驱动和 nvidia-docker 工具
  3. 构建和启动容器
    docker compose up -d --build
    
  4. 查看服务状态与日志
    docker compose ps
    docker compose logs -f app
    
  5. 测试数据库、中间件连接
    • 通过 Flask 脚本或 Python Shell 连接 MySQL/Redis/Kafka,确保服务正常。

六、常见注意事项

  1. 端口冲突与挂载

    • 若本机已占用相关端口(5000/8888/3306/6379/9092),需在 compose 中调整端口映射。
    • 源码挂载(./app:/app)方便开发时热更新。
  2. 中间件数据持久化

    • 挂载本地 mysql-data、redis-data 目录,避免数据丢失。
    • 数据卷不要加入 git 版本控制。
  3. 环境变量与配置管理

    • 建议用 .env 文件统一管理敏感参数,勿提交真实密码到仓库。
  4. 依赖服务连接

    • Python 连接 MySQL/Redis/Kafka 时,host 必须用 compose 服务名(如 mysql、redis、kafka)。
    • 示例(Flask 配置):
      app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://devuser:devpass@mysql:3306/devdb'
      app.config['REDIS_URL'] = 'redis://redis:6379/0'
      
  5. GPU 支持问题

    • 必须硬件与驱动环境符合,否则 AI 容器无法访问 GPU。
    • 启动 AI 容器时需加 --gpus all 或 compose 部署 profile。
  6. 服务初始化顺序

    • depends_on 只保证启动顺序,不能确保服务已完全可用,建议应用层增加重试机制。
  7. 日志与调试

    • 推荐日志输出到标准输出,便于统一收集。
    • 容器内可用 docker compose exec app bash 进入环境手动调试。

七、扩展建议

  • 数据库初始化脚本:MySQL 可将初始化 SQL 挂载到 /docker-entrypoint-initdb.d/
  • 多环境支持:用 docker-compose.override.yml 管理开发、测试、生产差异
  • 健康检查:为中间件服务配置 healthcheck 提升健壮性
  • CI/CD 集成:结合 GitHub Actions 等工具,实现自动化构建和测试

八、参考资料

  • Flask 官方文档
  • NVIDIA Container Toolkit
  • Docker Compose 官方文档
  • Bitnami Kafka 镜像说明
  • MySQL Docker 镜像说明
  • Redis Docker 镜像说明

你可能感兴趣的:(使用 Docker 搭建 Python(Flask/CUDA AI)开发环境——AI教你学Docker)