0
点赞
收藏
分享

微信扫一扫

实例 2:Docker 化 Python Flask 应用(含 MySQL 数据库)

需求背景

开发一个简单的用户管理系统,使用 Flask 作为后端框架,MySQL 存储数据,要求容器化部署且服务间可通信。

实现步骤

  1. 项目结构





    plaintext

flask-mysql-app/
├── app/
│   ├── __init__.py      # Flask应用初始化
│   ├── models.py        # 数据库模型
│   └── routes.py        # 接口路由
├── Dockerfile           # Flask应用镜像配置
├── docker-compose.yml   # 服务编排
└── requirements.txt     # 依赖列表(flask, flask-sqlalchemy, pymysql)

  1. 编写核心代码
  • 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 接口(略)。
  1. 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()"]

  1. 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:

  1. 部署与测试
  • 启动服务:docker-compose up -d
  • 测试接口:curl -X POST http://localhost:5000/users -d '{"name":"test"}'
  • 验证数据持久化:删除 web 容器后重启,数据仍可访问。

关键知识点

  • 容器间网络通信(通过服务名访问);
  • 环境变量注入配置;
  • 依赖关系(depends_on)与启动顺序;
  • 数据库数据卷持久化
举报

相关推荐

0 条评论