Docker搭建Python+Nginx+MySQL全栈开发环境实战
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 安全加固措施
-
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: 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连接测试,发现认证错误后,进入容器内用传统方式创建用户,最后在应用连接字符串显式指定认证插件。这个经验告诉我,数据库版本升级时一定要完整测试认证流程。
更多推荐
所有评论(0)