2. 环境准备:Python 3.10+ 虚拟环境搭建、Docker Compose 部署 MySQL/Redis/RabbitMQ
本章是课程实践的基石。我们将完成两大部分的环境搭建:本地 Python 开发环境(含虚拟环境)与中间件容器化部署(MySQL、Redis、RabbitMQ)。确保所有组件版本对齐、网络互通,为后续的数据库迁移与异步任务调用提供稳定运行底座。
2.1 版本依赖与工具清单
在开始安装前,请确认主机已安装以下基础工具。下表列出了各组件的推荐版本与用途:
| 组件 | 推荐版本 | 用途说明 |
|---|---|---|
| Python | 3.10 ~ 3.12 | 应用运行时与脚本执行 |
| Docker | 24.0+ | 容器化中间件运行环境 |
| Docker Compose | 2.20+ | 多容器编排与网络管理 |
| MySQL | 8.0 | 关系型数据库,存储业务数据 |
| Redis | 7.2 | 缓存与消息队列(Celery Broker) |
| RabbitMQ | 3.12 | 高级消息队列(Celery Broker/Result Backend) |
版本对齐提示:本课程所有代码与配置均基于上述版本验证。若使用其他版本,请注意 API 兼容性差异,尤其是 RabbitMQ 3.12 与 pika 1.3+ 的适配。
2.2 Python 虚拟环境搭建
虚拟环境隔离项目依赖,避免与系统级 Python 包冲突。推荐使用 Python 内置的 venv 模块,无需额外安装。
2.2.1 创建与激活虚拟环境
# 创建项目目录并进入
mkdir middleware-course && cd middleware-course
# 创建虚拟环境(指定 Python 3.10+ 解释器)
python3 -m venv venv
# 激活虚拟环境(Linux/macOS)
source venv/bin/activate
# 激活虚拟环境(Windows PowerShell)
.\venv\Scripts\Activate.ps1
# 验证 Python 版本与虚拟环境路径
python --version
which python # Linux/macOS
Get-Command python # Windows
2.2.2 安装核心依赖包
激活虚拟环境后,使用 pip 安装课程所需的 Python 库。建议先升级 pip 至最新版:
pip install --upgrade pip
# 安装数据库驱动与 ORM
pip install sqlalchemy==2.0.25 pymysql==1.1.0 cryptography==41.0.7
# 安装 Redis 与 RabbitMQ 客户端
pip install redis==5.0.1 pika==1.3.2
# 安装 Celery 异步任务框架
pip install celery==5.3.6
# 安装 Alembic 数据库迁移工具
pip install alembic==1.13.1
# 生成 requirements.txt 用于环境复现
pip freeze > requirements.txt
注意:若使用 Apple Silicon (M1/M2/M3) 芯片,安装
cryptography 时可能需要先安装 OpenSSL 依赖:brew install openssl。Windows 用户请确保已安装 Microsoft C++ Build Tools。
2.3 Docker Compose 部署中间件
使用 Docker Compose 一键启动 MySQL、Redis、RabbitMQ 三个容器,并配置统一的网络与持久化存储。
2.3.1 编写 docker-compose.yml
在项目根目录创建 docker-compose.yml 文件,内容如下:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: middleware-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: middleware_db
MYSQL_USER: app_user
MYSQL_PASSWORD: app_pass
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./init-scripts:/docker-entrypoint-initdb.d
networks:
- middleware-net
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7.2-alpine
container_name: middleware-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- middleware-net
command: redis-server --appendonly yes
rabbitmq:
image: rabbitmq:3.12-management
container_name: middleware-rabbitmq
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin123
ports:
- "5672:5672" # AMQP 协议端口
- "15672:15672" # 管理控制台端口
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- middleware-net
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
interval: 15s
timeout: 10s
retries: 5
volumes:
mysql_data:
redis_data:
rabbitmq_data:
networks:
middleware-net:
driver: bridge
2.3.2 启动与验证容器
# 启动所有容器(后台运行)
docker compose up -d
# 查看容器运行状态
docker compose ps
# 查看实时日志(按需使用)
docker compose logs -f mysql
docker compose logs -f rabbitmq
# 验证 MySQL 连接
docker exec -it middleware-mysql mysql -u app_user -papp_pass middleware_db -e "SELECT VERSION();"
# 验证 Redis 连接
docker exec -it middleware-redis redis-cli PING
# 验证 RabbitMQ 管理界面
# 浏览器访问 http://localhost:15672 ,使用 admin / admin123 登录
网络互通说明:三个容器均加入
middleware-net 桥接网络。在 Python 应用中,可通过容器名称(如 mysql、redis、rabbitmq)作为主机名访问对应服务,无需使用 localhost。
2.4 环境架构总览
下图展示了本地开发环境与容器化中间件的整体拓扑关系:
2.5 连接配置与验证脚本
编写一个快速验证脚本,测试 Python 环境与三个中间件的连通性。在项目根目录创建 check_env.py:
import pymysql
import redis
import pika
# MySQL 连接测试
def check_mysql():
try:
conn = pymysql.connect(
host='localhost',
port=3306,
user='app_user',
password='app_pass',
database='middleware_db'
)
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
version = cursor.fetchone()
print(f"[OK] MySQL 连接成功,版本: {version[0]}")
cursor.close()
conn.close()
except Exception as e:
print(f"[FAIL] MySQL 连接失败: {e}")
# Redis 连接测试
def check_redis():
try:
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
pong = r.ping()
print(f"[OK] Redis 连接成功,PING 响应: {pong}")
r.close()
except Exception as e:
print(f"[FAIL] Redis 连接失败: {e}")
# RabbitMQ 连接测试
def check_rabbitmq():
try:
params = pika.ConnectionParameters(host='localhost', port=5672,
credentials=pika.PlainCredentials('admin', 'admin123'))
conn = pika.BlockingConnection(params)
print(f"[OK] RabbitMQ 连接成功")
conn.close()
except Exception as e:
print(f"[FAIL] RabbitMQ 连接失败: {e}")
if __name__ == '__main__':
print("=== 环境连通性检查 ===\n")
check_mysql()
check_redis()
check_rabbitmq()
print("\n=== 检查完成 ===")
# 运行验证脚本(确保虚拟环境已激活)
python check_env.py
预期输出示例:
=== 环境连通性检查 ===
[OK] MySQL 连接成功,版本: 8.0.35
[OK] Redis 连接成功,PING 响应: True
[OK] RabbitMQ 连接成功
=== 检查完成 ===
排障指引:若某个服务连接失败,请按以下顺序排查:① 确认容器是否正常运行
docker compose ps;② 检查端口映射是否被占用 lsof -i :3306;③ 查看对应容器日志 docker compose logs <service>;④ 确认防火墙未阻断端口。
2.6 环境清理与重置
当需要重置环境或结束实验时,使用以下命令:
# 停止并移除容器、网络(保留数据卷)
docker compose down
# 停止并移除容器、网络、数据卷(完全清理)
docker compose down -v
# 重新构建并启动(无缓存)
docker compose up -d --force-recreate
数据安全提醒:
docker compose down -v 会删除 MySQL、Redis、RabbitMQ 的所有持久化数据。仅当确认数据无需保留时执行此操作。日常开发中建议使用 docker compose down 保留数据卷。