1. 项目概述:为什么选择Docker搭建开发环境?

十年前我刚入行时,配置开发环境要花整整两天——安装各种依赖、解决版本冲突、处理系统权限...直到遇见Docker。这个实战记录将带你用容器技术快速搭建Python+Nginx+MySQL的全栈开发环境,整个过程只需要30分钟。

传统开发环境配置有三大痛点:1)"在我机器上能跑"的版本冲突问题 2)多项目环境隔离困难 3)团队协作时环境一致性差。Docker通过容器化方案完美解决这些问题——每个服务运行在独立容器中,通过定义文件(Dockerfile/docker-compose.yml)实现环境版本固化。实测下来,新成员用这套方案能在10分钟内准备好开发环境,比传统方式效率提升20倍。

2. 环境准备与工具选型

2.1 基础软件安装清单

  • Docker Desktop :推荐使用4.12+版本(2023年6月更新)
  • VS Code :安装Docker和Python扩展插件
  • 终端工具 :Windows用户建议用Windows Terminal,Mac/Linux直接用系统终端

注意:所有操作在WSL2(Windows)或原生Linux/macOS下测试通过,确保系统已开启虚拟化支持

2.2 镜像版本选择策略

经过多次踩坑测试,我锁定这些稳定版本组合:

  • Python:3.9-slim(平衡了功能与体积)
  • MySQL:8.0-debian(兼容性好于alpine版本)
  • Nginx:1.23-alpine(超轻量级实现)

3. 核心组件配置详解

3.1 Python服务容器化

创建 Dockerfile.python

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "-w 4", "-b :8000", "app:app"]

关键技巧:

  • 使用 --no-cache-dir 避免缓存占用空间
  • 分步COPY减少重建镜像时的缓存失效
  • 生产环境建议用multi-stage build进一步压缩镜像

3.2 MySQL容器配置

docker-compose.yml 中定义:

services:
  mysql:
    image: mysql:8.0-debian
    environment:
      MYSQL_ROOT_PASSWORD: your_strong_password
      MYSQL_DATABASE: app_db
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"

避坑指南:

  • 必须设置volume持久化数据
  • 生产环境要改用自定义密码文件
  • 首次启动后执行 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; 解决新版认证问题

3.3 Nginx反向代理配置

nginx.conf 关键配置段:

server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://python:8000;
        proxy_set_header Host $host;
    }

    location /static {
        alias /app/static;
    }
}

性能优化点:

  • 启用gzip压缩
  • 调整worker_processes为CPU核心数
  • 设置静态文件缓存头

4. 完整编排与网络配置

4.1 docker-compose.yml全配置

version: '3.8'

services:
  python:
    build:
      context: .
      dockerfile: Dockerfile.python
    volumes:
      - .:/app
    depends_on:
      - mysql

  nginx:
    image: nginx:1.23-alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - ./static:/app/static
    depends_on:
      - python

  mysql:
    # 前述配置...

volumes:
  mysql_data:

网络设计要点:

  • 默认创建bridge网络实现服务互通
  • 通过depends_on控制启动顺序
  • 使用命名volume确保数据持久化

5. 开发工作流优化

5.1 热重载配置技巧

Python开发容器添加:

volumes:
  - .:/app
environment:
  FLASK_ENV: development

Nginx容器开发配置:

location / {
    proxy_pass http://python:8000;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

5.2 调试配置方案

VS Code的 launch.json 配置:

{
    "name": "Docker Python",
    "type": "python",
    "request": "attach",
    "connect": {
        "host": "localhost",
        "port": 5678
    },
    "pathMappings": [{
        "localRoot": "${workspaceFolder}",
        "remoteRoot": "/app"
    }]
}

6. 生产环境部署建议

6.1 安全加固措施

  1. MySQL容器:

    • 移除root远程访问
    • 创建应用专属用户
    • 启用SSL连接
  2. Nginx容器:

    • 禁用server_tokens
    • 设置安全头
    • 限制HTTP方法
  3. Python容器:

    • 使用非root用户运行
    • 设置资源限制
    • 扫描依赖漏洞

6.2 性能调优参数

# docker-compose.prod.yml
services:
  python:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 1G
    command: ["gunicorn", "-w 4", "-k uvicorn.workers.UvicornWorker", "--max-requests 1000", "--bind :8000", "app:app"]
  
  nginx:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 256M

7. 常见问题排错指南

问题现象 排查步骤 解决方案
MySQL连接失败 1. 检查容器日志
2. 验证网络连通性
3. 测试认证方式
执行 ALTER USER 命令更新认证插件
Nginx 502错误 1. 检查upstream服务状态
2. 查看代理配置
3. 测试容器间DNS解析
确保depends_on和网络配置正确
Python依赖冲突 1. 冻结当前环境
2. 对比requirements.txt
3. 检查缓存
使用 pip-compile 生成精确依赖

我在实际部署中遇到过最棘手的问题是MySQL 8.0的caching_sha2_password认证问题。当时的解决过程是:先在宿主机用mysql-client连接测试,发现认证错误后,进入容器内用传统方式创建用户,最后在应用连接字符串显式指定认证插件。这个经验告诉我,数据库版本升级时一定要完整测试认证流程。

更多推荐