Docker搭建Python+Nginx+MySQL全栈开发环境实战

📅 2026/7/18 1:18:00
Docker搭建Python+Nginx+MySQL全栈开发环境实战
1. 项目概述为什么选择Docker搭建开发环境十年前我刚入行时配置开发环境要花整整两天——安装各种依赖、解决版本冲突、处理系统权限...直到遇见Docker。这个实战记录将带你用容器技术快速搭建PythonNginxMySQL的全栈开发环境整个过程只需要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 TerminalMac/Linux直接用系统终端注意所有操作在WSL2Windows或原生Linux/macOS下测试通过确保系统已开启虚拟化支持2.2 镜像版本选择策略经过多次踩坑测试我锁定这些稳定版本组合Python3.9-slim平衡了功能与体积MySQL8.0-debian兼容性好于alpine版本Nginx1.23-alpine超轻量级实现3. 核心组件配置详解3.1 Python服务容器化创建Dockerfile.pythonFROM 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: developmentNginx容器开发配置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 安全加固措施MySQL容器移除root远程访问创建应用专属用户启用SSL连接Nginx容器禁用server_tokens设置安全头限制HTTP方法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: 256M7. 常见问题排错指南问题现象排查步骤解决方案MySQL连接失败1. 检查容器日志2. 验证网络连通性3. 测试认证方式执行ALTER USER命令更新认证插件Nginx 502错误1. 检查upstream服务状态2. 查看代理配置3. 测试容器间DNS解析确保depends_on和网络配置正确Python依赖冲突1. 冻结当前环境2. 对比requirements.txt3. 检查缓存使用pip-compile生成精确依赖我在实际部署中遇到过最棘手的问题是MySQL 8.0的caching_sha2_password认证问题。当时的解决过程是先在宿主机用mysql-client连接测试发现认证错误后进入容器内用传统方式创建用户最后在应用连接字符串显式指定认证插件。这个经验告诉我数据库版本升级时一定要完整测试认证流程。