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: 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.txt 3. 检查缓存 | 使用pip-compile生成精确依赖 |
我在实际部署中遇到过最棘手的问题是MySQL 8.0的caching_sha2_password认证问题。当时的解决过程是:先在宿主机用mysql-client连接测试,发现认证错误后,进入容器内用传统方式创建用户,最后在应用连接字符串显式指定认证插件。这个经验告诉我,数据库版本升级时一定要完整测试认证流程。