需求背景
开发一个简单的用户管理系统,使用 Flask 作为后端框架,MySQL 存储数据,要求容器化部署且服务间可通信。
实现步骤
- 项目结构
plaintext
flask-mysql-app/
├── app/
│ ├── __init__.py # Flask应用初始化
│ ├── models.py # 数据库模型
│ └── routes.py # 接口路由
├── Dockerfile # Flask应用镜像配置
├── docker-compose.yml # 服务编排
└── requirements.txt # 依赖列表(flask, flask-sqlalchemy, pymysql)
- 编写核心代码
app/__init__.py
:初始化 Flask 与数据库连接
python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
# 从环境变量获取数据库配置(Docker Compose注入)
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
with app.app_context():
db.create_all() # 创建数据表
from .routes import bp
app.register_blueprint(bp)
return app
models.py
定义 User 模型,routes.py
实现用户 CRUD 接口(略)。
- Dockerfile 配置
dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 启动命令(使用gunicorn作为WSGI服务器)
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:create_app()"]
- Docker Compose 编排
实现 Flask 应用与 MySQL 的联动,配置网络与数据卷:
yaml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- DATABASE_URL=mysql+pymysql://root:password@db:3306/userdb
depends_on:
- db
networks:
- app-network
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=userdb
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
networks:
app-network:
volumes:
mysql-data:
- 部署与测试
- 启动服务:
docker-compose up -d
- 测试接口:
curl -X POST http://localhost:5000/users -d '{"name":"test"}'
- 验证数据持久化:删除 web 容器后重启,数据仍可访问。
关键知识点
- 容器间网络通信(通过服务名访问);
- 环境变量注入配置;
- 依赖关系(depends_on)与启动顺序;
- 数据库数据卷持久化