You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask应用无法连接Docker部署的MySQL容器问题求助

解决Flask-SQLAlchemy连接Docker MySQL容器失败的问题

核心问题分析

连接失败主要源于两个关键错误:

  • Docker端口映射错误:MySQL容器默认监听3306端口,但你在docker-compose.yml里将主机100端口映射到容器的100端口,容器内100端口并未运行MySQL服务,导致外部无法通过该端口访问。
  • 连接字符串配置不匹配:端口映射错误的前提下,修改主机地址自然无法解决问题。

分步修复方案

1. 修正Docker Compose的端口映射

编辑docker-compose.yml中db服务的ports配置,将容器的3306端口映射到主机的100端口:

services:
  db:
    # ... 其他配置保持不变
    ports:
      - 100:3306  # 格式:主机端口:容器端口,容器内MySQL默认使用3306端口

修改后重启容器:

docker-compose down
docker-compose up -d

2. 调整数据库连接配置

如果你的Flask应用在主机本地运行(而非Docker容器内),保持db.yml的mysql_host为localhost:100即可:

mysql_host: 'localhost:100'
mysql_user: 'user'
mysql_password: 'password'
mysql_db: 'mysqldb'

如果后续将Flask也加入Docker Compose的mysqlcomposenetwork网络,则将mysql_host改为db:3306(容器服务名+容器内端口)。

3. 验证MySQL容器状态

确认MySQL容器正常启动并运行:

# 查看容器运行状态
docker-compose ps
# 查看MySQL日志,确认服务初始化完成
docker-compose logs db

日志中出现ready for connections字样说明服务启动成功。

4. 测试连接

重新运行app.py,此时应该能成功连接数据库、创建表并插入数据。

额外优化建议

  • 你的Visitor模型可以省略自定义的__init__方法,SQLAlchemy会自动根据字段生成构造函数:
class Visitor(db.Model):
    accessed_at = db.Column(db.Float, primary_key=True)
    user_id = db.Column(db.Integer)
    page_id = db.Column(db.Integer)
  • 在Flask配置中添加SQLALCHEMY_TRACK_MODIFICATIONS = False,避免不必要的性能开销和警告。

内容的提问来源于stack exchange,提问作者Martim Sousa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:50:49